From 6e120f25510b8fd7263b8d5bc272af411c288167 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Sat, 7 Jun 2025 07:47:03 +0200 Subject: [PATCH] [danbooru] fix Ugoira for instances without 'Ugoira:FrameMimeType' (#7630) fixes regression introduced in 1866f8b97be2a27413cfeec45456bacf4ee08def0 --- gallery_dl/extractor/danbooru.py | 29 ++++++++++++++++------------- test/results/aibooru.py | 12 ++++++++++++ 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/gallery_dl/extractor/danbooru.py b/gallery_dl/extractor/danbooru.py index 84e1993c..47b117c8 100644 --- a/gallery_dl/extractor/danbooru.py +++ b/gallery_dl/extractor/danbooru.py @@ -129,7 +129,7 @@ class DanbooruExtractor(BaseExtractor): first = True while True: - posts = self.request(url, params=params).json() + posts = self.request_json(url, params=params) if isinstance(posts, dict): posts = posts["posts"] @@ -142,8 +142,7 @@ class DanbooruExtractor(BaseExtractor): } data = { meta["id"]: meta - for meta in self.request( - url, params=params_meta).json() + for meta in self.request_json(url, params=params_meta) } for post in posts: post.update(data[post["id"]]) @@ -165,13 +164,17 @@ class DanbooruExtractor(BaseExtractor): first = False def _ugoira_frames(self, post): - data = self.request("{}/posts/{}.json?only=media_metadata".format( + data = self.request_json("{}/posts/{}.json?only=media_metadata".format( self.root, post["id"]) - ).json()["media_metadata"]["metadata"] + )["media_metadata"]["metadata"] + + if "Ugoira:FrameMimeType" in data: + ext = data["Ugoira:FrameMimeType"].rpartition("/")[2] + if ext == "jpeg": + ext = "jpg" + else: + ext = data["ZIP:ZipFileName"].rpartition(".")[2] - ext = data["Ugoira:FrameMimeType"].rpartition("/")[2] - if ext == "jpeg": - ext = "jpg" fmt = ("{:>06}." + ext).format delays = data["Ugoira:FrameDelays"] return [{"file": fmt(index), "delay": delay} @@ -202,7 +205,7 @@ class DanbooruExtractor(BaseExtractor): def _collection_metadata(self, cid, ctype, cname=None): url = "{}/{}s/{}.json".format(self.root, cname or ctype, cid) - collection = self.request(url).json() + collection = self.request_json(url) collection["name"] = collection["name"].replace("_", " ") self.post_ids = collection.pop("post_ids", ()) return {ctype: collection} @@ -318,10 +321,10 @@ class DanbooruPostExtractor(DanbooruExtractor): def posts(self): url = "{}/posts/{}.json".format(self.root, self.groups[-1]) - post = self.request(url).json() + post = self.request_json(url) if self.includes: params = {"only": self.includes} - post.update(self.request(url, params=params).json()) + post.update(self.request_json(url, params=params)) return (post,) @@ -360,7 +363,7 @@ class DanbooruArtistExtractor(DanbooruExtractor): def artists(self): url = "{}/artists/{}.json".format(self.root, self.groups[-1]) - return (self.request(url).json(),) + return (self.request_json(url),) class DanbooruArtistSearchExtractor(DanbooruExtractor): @@ -377,7 +380,7 @@ class DanbooruArtistSearchExtractor(DanbooruExtractor): params["page"] = text.parse_int(params.get("page"), 1) while True: - artists = self.request(url, params=params).json() + artists = self.request_json(url, params=params) yield from artists diff --git a/test/results/aibooru.py b/test/results/aibooru.py index 41408423..42936dfe 100644 --- a/test/results/aibooru.py +++ b/test/results/aibooru.py @@ -35,6 +35,18 @@ __tests__ = ( "#sha1_content": "54d548743cd67799a62c77cbae97cfa0fec1b7e9", }, +{ + "#url" : "https://aibooru.online/posts/18315", + "#comment" : "ugoira ()", + "#category": ("Danbooru", "aibooru", "post"), + "#class" : danbooru.DanbooruPostExtractor, + "#options" : {"ugoira": True}, + "#urls" : "https://cdn.aibooru.download/original/f9/6b/f96b2b3254884ab527fab0a7e9c39ba9.zip", + + "_ugoira_frame_data": "len:list:60", + "_ugoira_original" : False, +}, + { "#url" : "https://aibooru.online/explore/posts/popular", "#category": ("Danbooru", "aibooru", "popular"),