From 0d69af94d5191e682441332f3c17d63fdc4eb402 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Mon, 18 Mar 2024 20:40:02 +0100 Subject: [PATCH] [gelbooru] detect returned favorites order (#5220) --- gallery_dl/extractor/gelbooru.py | 53 +++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/gallery_dl/extractor/gelbooru.py b/gallery_dl/extractor/gelbooru.py index 83f13922..0050a62d 100644 --- a/gallery_dl/extractor/gelbooru.py +++ b/gallery_dl/extractor/gelbooru.py @@ -32,6 +32,9 @@ class GelbooruBase(): url = self.root + "/index.php?page=dapi&q=index&json=1" data = self.request(url, params=params).json() + if not key: + return data + try: posts = data[key] except KeyError: @@ -167,13 +170,54 @@ class GelbooruFavoriteExtractor(GelbooruBase, params = { "s" : "favorite", "id" : self.favorite_id, - "limit": "1", + "limit": "2", } - count = self._api_request(params, "@attributes", True)[0]["count"] - if count <= self.offset: - return + data = self._api_request(params, None, True) + count = data["@attributes"]["count"] + if count <= self.offset: + return () + + favs = data["favorite"] + try: + order = 1 if favs[0]["id"] < favs[1]["id"] else -1 + except LookupError: + order = 0 + + if order > 0: + self.log.debug("API yields favorites in ascending order") + self.log.debug("Returning them in reverse") + return self._pagination_reverse(params, count) + + self.log.debug("API yields favorites in descending order") + return self._pagination(params, count) + + def _pagination(self, params, count): + if self.offset: + pnum, skip = divmod(self.offset, self.per_page) + else: + pnum = skip = 0 + + params["pid"] = pnum + params["limit"] = self.per_page + + while True: + favs = self._api_request(params, "favorite", True) + + if not favs: + return + + if skip: + favs = favs[skip:] + skip = 0 + + for fav in favs: + yield from self._api_request({"id": fav["favorite"]}) + + params["pid"] += 1 + + def _pagination_reverse(self, params, count): pnum, last = divmod(count-1, self.per_page) if self.offset > last: # page number change @@ -182,7 +226,6 @@ class GelbooruFavoriteExtractor(GelbooruBase, pnum -= diff + 1 skip = self.offset - # paginate over them in reverse params["pid"] = pnum params["limit"] = self.per_page