diff --git a/docs/supportedsites.md b/docs/supportedsites.md
index d8cf7aa6..27bb0bbe 100644
--- a/docs/supportedsites.md
+++ b/docs/supportedsites.md
@@ -433,6 +433,12 @@ Consider all sites to be NSFW unless otherwise known.
Games |
|
+
+ JPG Fish |
+ https://jpg.fishing/ |
+ Albums, individual Images, User Profiles |
+ |
+
Keenspot |
http://www.keenspot.com/ |
diff --git a/gallery_dl/extractor/__init__.py b/gallery_dl/extractor/__init__.py
index 049732f6..1f77f94a 100644
--- a/gallery_dl/extractor/__init__.py
+++ b/gallery_dl/extractor/__init__.py
@@ -75,6 +75,7 @@ modules = [
"issuu",
"itaku",
"itchio",
+ "jpgfish",
"kabeuchi",
"keenspot",
"kemonoparty",
diff --git a/gallery_dl/extractor/jpgfish.py b/gallery_dl/extractor/jpgfish.py
new file mode 100644
index 00000000..cdcf35cb
--- /dev/null
+++ b/gallery_dl/extractor/jpgfish.py
@@ -0,0 +1,143 @@
+# -*- coding: utf-8 -*-
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+
+"""Extractors for https://jpg.fishing/"""
+
+from .common import Extractor, Message
+from .. import text
+
+BASE_PATTERN = r"(?:https?://)?jpg\.(?:fishing|church)"
+
+
+class JpgfishExtractor(Extractor):
+ """Base class for jpgfish extractors"""
+ category = "jpgfish"
+ root = "https://jpg.fishing"
+ directory_fmt = ("{category}", "{user}", "{album}",)
+ archive_fmt = "{id}"
+
+ def _pagination(self, url):
+ while url:
+ page = self.request(url).text
+
+ for item in text.extract_iter(
+ page, '