aboutsummaryrefslogtreecommitdiffstats
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.py101
1 files changed, 62 insertions, 39 deletions
diff --git a/gallery_dl/extractor/danbooru.py b/gallery_dl/extractor/danbooru.py
index 8d00728..741800c 100644
--- a/gallery_dl/extractor/danbooru.py
+++ b/gallery_dl/extractor/danbooru.py
@@ -175,6 +175,51 @@ class DanbooruExtractor(BaseExtractor):
return [{"file": fmt(index), "delay": delay}
for index, delay in enumerate(delays)]
+ def _collection_posts(self, cid, ctype):
+ reverse = prefix = None
+
+ order = self.config("order-posts")
+ if not order or order in {"asc", "pool", "pool_asc", "asc_pool"}:
+ params = {"tags": "ord{}:{}".format(ctype, cid)}
+ elif order in {"id", "desc_id", "id_desc"}:
+ params = {"tags": "{}:{}".format(ctype, cid)}
+ prefix = "b"
+ elif order in {"desc", "desc_pool", "pool_desc"}:
+ params = {"tags": "ord{}:{}".format(ctype, cid)}
+ reverse = True
+ elif order in {"asc_id", "id_asc"}:
+ params = {"tags": "{}:{}".format(ctype, cid)}
+ reverse = True
+
+ posts = self._pagination("/posts.json", params, prefix)
+ if reverse:
+ self.log.info("Collecting posts of %s %s", ctype, cid)
+ return self._collection_enumerate_reverse(posts)
+ else:
+ return self._collection_enumerate(posts)
+
+ def _collection_metadata(self, cid, ctype, cname=None):
+ url = "{}/{}s/{}.json".format(self.root, cname or ctype, cid)
+ collection = self.request(url).json()
+ collection["name"] = collection["name"].replace("_", " ")
+ self.post_ids = collection.pop("post_ids", ())
+ return {ctype: collection}
+
+ def _collection_enumerate(self, posts):
+ pid_to_num = {pid: num for num, pid in enumerate(self.post_ids, 1)}
+ for post in posts:
+ post["num"] = pid_to_num[post["id"]]
+ yield post
+
+ def _collection_enumerate_reverse(self, posts):
+ posts = list(posts)
+ posts.reverse()
+
+ pid_to_num = {pid: num for num, pid in enumerate(self.post_ids, 1)}
+ for post in posts:
+ post["num"] = pid_to_num[post["id"]]
+ return posts
+
BASE_PATTERN = DanbooruExtractor.update({
"danbooru": {
@@ -228,7 +273,7 @@ class DanbooruTagExtractor(DanbooruExtractor):
class DanbooruPoolExtractor(DanbooruExtractor):
- """Extractor for posts from danbooru pools"""
+ """Extractor for Danbooru pools"""
subcategory = "pool"
directory_fmt = ("{category}", "pool", "{pool[id]} {pool[name]}")
filename_fmt = "{num:>04}_{id}_{filename}.{extension}"
@@ -237,50 +282,28 @@ class DanbooruPoolExtractor(DanbooruExtractor):
example = "https://danbooru.donmai.us/pools/12345"
def metadata(self):
- self.pool_id = self.groups[-1]
- url = "{}/pools/{}.json".format(self.root, self.pool_id)
- pool = self.request(url).json()
- pool["name"] = pool["name"].replace("_", " ")
- self.post_ids = pool.pop("post_ids", ())
- return {"pool": pool}
+ return self._collection_metadata(self.groups[-1], "pool")
def posts(self):
- reverse = prefix = None
+ return self._collection_posts(self.groups[-1], "pool")
- order = self.config("order-posts")
- if not order or order in ("asc", "pool", "pool_asc", "asc_pool"):
- params = {"tags": "ordpool:" + self.pool_id}
- elif order in ("id", "desc_id", "id_desc"):
- params = {"tags": "pool:" + self.pool_id}
- prefix = "b"
- elif order in ("desc", "desc_pool", "pool_desc"):
- params = {"tags": "ordpool:" + self.pool_id}
- reverse = True
- elif order in ("asc_id", "id_asc"):
- params = {"tags": "pool:" + self.pool_id}
- reverse = True
- posts = self._pagination("/posts.json", params, prefix)
- if reverse:
- return self._enumerate_posts_reverse(posts)
- else:
- return self._enumerate_posts(posts)
-
- def _enumerate_posts(self, posts):
- pid_to_num = {pid: num+1 for num, pid in enumerate(self.post_ids)}
- for post in posts:
- post["num"] = pid_to_num[post["id"]]
- yield post
+class DanbooruFavgroupExtractor(DanbooruExtractor):
+ """Extractor for Danbooru favorite groups"""
+ subcategory = "favgroup"
+ directory_fmt = ("{category}", "Favorite Groups",
+ "{favgroup[id]} {favgroup[name]}")
+ filename_fmt = "{num:>04}_{id}_{filename}.{extension}"
+ archive_fmt = "fg_{favgroup[id]}_{id}"
+ pattern = BASE_PATTERN + r"/favorite_group(?:s|/show)/(\d+)"
+ example = "https://danbooru.donmai.us/favorite_groups/12345"
- def _enumerate_posts_reverse(self, posts):
- self.log.info("Collecting posts of pool %s", self.pool_id)
- posts = list(posts)
- posts.reverse()
+ def metadata(self):
+ return self._collection_metadata(
+ self.groups[-1], "favgroup", "favorite_group")
- pid_to_num = {pid: num+1 for num, pid in enumerate(self.post_ids)}
- for post in posts:
- post["num"] = pid_to_num[post["id"]]
- return posts
+ def posts(self):
+ return self._collection_posts(self.groups[-1], "favgroup")
class DanbooruPostExtractor(DanbooruExtractor):