summaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/danbooru.py
diff options
context:
space:
mode:
Diffstat (limited to 'gallery_dl/extractor/danbooru.py')
-rw-r--r--gallery_dl/extractor/danbooru.py65
1 files changed, 54 insertions, 11 deletions
diff --git a/gallery_dl/extractor/danbooru.py b/gallery_dl/extractor/danbooru.py
index 1746647..c3dfd91 100644
--- a/gallery_dl/extractor/danbooru.py
+++ b/gallery_dl/extractor/danbooru.py
@@ -20,12 +20,22 @@ class DanbooruExtractor(BaseExtractor):
page_limit = 1000
page_start = None
per_page = 200
+ useragent = util.USERAGENT
request_interval = (0.5, 1.5)
def _init(self):
self.ugoira = self.config("ugoira", False)
self.external = self.config("external", False)
- self.includes = False
+
+ includes = self.config("metadata")
+ if includes:
+ if isinstance(includes, (list, tuple)):
+ includes = ",".join(includes)
+ elif not isinstance(includes, str):
+ includes = "artist_commentary,children,notes,parent,uploader"
+ self.includes = includes + ",id"
+ else:
+ self.includes = False
threshold = self.config("threshold")
if isinstance(threshold, int):
@@ -46,16 +56,6 @@ class DanbooruExtractor(BaseExtractor):
return pages * self.per_page
def items(self):
- self.session.headers["User-Agent"] = util.USERAGENT
-
- includes = self.config("metadata")
- if includes:
- if isinstance(includes, (list, tuple)):
- includes = ",".join(includes)
- elif not isinstance(includes, str):
- includes = "artist_commentary,children,notes,parent,uploader"
- self.includes = includes + ",id"
-
data = self.metadata()
for post in self.posts():
@@ -108,6 +108,13 @@ class DanbooruExtractor(BaseExtractor):
yield Message.Directory, post
yield Message.Url, url, post
+ def items_artists(self):
+ for artist in self.artists():
+ artist["_extractor"] = DanbooruTagExtractor
+ url = "{}/posts?tags={}".format(
+ self.root, text.quote(artist["name"]))
+ yield Message.Queue, url, artist
+
def metadata(self):
return ()
@@ -294,3 +301,39 @@ class DanbooruPopularExtractor(DanbooruExtractor):
def posts(self):
return self._pagination("/explore/posts/popular.json", self.params)
+
+
+class DanbooruArtistExtractor(DanbooruExtractor):
+ """Extractor for danbooru artists"""
+ subcategory = "artist"
+ pattern = BASE_PATTERN + r"/artists/(\d+)"
+ example = "https://danbooru.donmai.us/artists/12345"
+
+ items = DanbooruExtractor.items_artists
+
+ def artists(self):
+ url = "{}/artists/{}.json".format(self.root, self.groups[-1])
+ return (self.request(url).json(),)
+
+
+class DanbooruArtistSearchExtractor(DanbooruExtractor):
+ """Extractor for danbooru artist searches"""
+ subcategory = "artist-search"
+ pattern = BASE_PATTERN + r"/artists/?\?([^#]+)"
+ example = "https://danbooru.donmai.us/artists?QUERY"
+
+ items = DanbooruExtractor.items_artists
+
+ def artists(self):
+ url = self.root + "/artists.json"
+ params = text.parse_query(self.groups[-1])
+ params["page"] = text.parse_int(params.get("page"), 1)
+
+ while True:
+ artists = self.request(url, params=params).json()
+
+ yield from artists
+
+ if len(artists) < 20:
+ return
+ params["page"] += 1