diff options
Diffstat (limited to 'gallery_dl/extractor/danbooru.py')
| -rw-r--r-- | gallery_dl/extractor/danbooru.py | 62 |
1 files changed, 41 insertions, 21 deletions
diff --git a/gallery_dl/extractor/danbooru.py b/gallery_dl/extractor/danbooru.py index d0a9397..8d00728 100644 --- a/gallery_dl/extractor/danbooru.py +++ b/gallery_dl/extractor/danbooru.py @@ -205,12 +205,8 @@ class DanbooruTagExtractor(DanbooruExtractor): pattern = BASE_PATTERN + r"/posts\?(?:[^&#]*&)*tags=([^&#]*)" example = "https://danbooru.donmai.us/posts?tags=TAG" - def __init__(self, match): - DanbooruExtractor.__init__(self, match) - tags = match.group(match.lastindex) - self.tags = text.unquote(tags.replace("+", " ")) - def metadata(self): + self.tags = text.unquote(self.groups[-1].replace("+", " ")) return {"search_tags": self.tags} def posts(self): @@ -235,15 +231,13 @@ class DanbooruPoolExtractor(DanbooruExtractor): """Extractor for posts from danbooru pools""" subcategory = "pool" directory_fmt = ("{category}", "pool", "{pool[id]} {pool[name]}") + filename_fmt = "{num:>04}_{id}_{filename}.{extension}" archive_fmt = "p_{pool[id]}_{id}" pattern = BASE_PATTERN + r"/pool(?:s|/show)/(\d+)" example = "https://danbooru.donmai.us/pools/12345" - def __init__(self, match): - DanbooruExtractor.__init__(self, match) - self.pool_id = match.group(match.lastindex) - 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("_", " ") @@ -251,8 +245,42 @@ class DanbooruPoolExtractor(DanbooruExtractor): return {"pool": pool} def posts(self): - params = {"tags": "pool:" + self.pool_id} - return self._pagination("/posts.json", params, "b") + reverse = prefix = None + + 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 + + def _enumerate_posts_reverse(self, posts): + self.log.info("Collecting posts of pool %s", self.pool_id) + posts = list(posts) + posts.reverse() + + 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 class DanbooruPostExtractor(DanbooruExtractor): @@ -262,12 +290,8 @@ class DanbooruPostExtractor(DanbooruExtractor): pattern = BASE_PATTERN + r"/post(?:s|/show)/(\d+)" example = "https://danbooru.donmai.us/posts/12345" - def __init__(self, match): - DanbooruExtractor.__init__(self, match) - self.post_id = match.group(match.lastindex) - def posts(self): - url = "{}/posts/{}.json".format(self.root, self.post_id) + url = "{}/posts/{}.json".format(self.root, self.groups[-1]) post = self.request(url).json() if self.includes: params = {"only": self.includes} @@ -283,12 +307,8 @@ class DanbooruPopularExtractor(DanbooruExtractor): pattern = BASE_PATTERN + r"/(?:explore/posts/)?popular(?:\?([^#]*))?" example = "https://danbooru.donmai.us/explore/posts/popular" - def __init__(self, match): - DanbooruExtractor.__init__(self, match) - self.params = match.group(match.lastindex) - def metadata(self): - self.params = params = text.parse_query(self.params) + self.params = params = text.parse_query(self.groups[-1]) scale = params.get("scale", "day") date = params.get("date") or datetime.date.today().isoformat() |
