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.py53
1 files changed, 28 insertions, 25 deletions
diff --git a/gallery_dl/extractor/danbooru.py b/gallery_dl/extractor/danbooru.py
index 06c31b9..ff071c5 100644
--- a/gallery_dl/extractor/danbooru.py
+++ b/gallery_dl/extractor/danbooru.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Copyright 2014-2023 Mike Fährmann
+# Copyright 2014-2025 Mike Fährmann
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
@@ -49,8 +49,7 @@ class DanbooruExtractor(BaseExtractor):
def items(self):
# 'includes' initialization must be done here and not in '_init()'
# or it'll cause an exception with e621 when 'metadata' is enabled
- includes = self.config("metadata")
- if includes:
+ if includes := self.config("metadata"):
if isinstance(includes, (list, tuple)):
includes = ",".join(includes)
elif not isinstance(includes, str):
@@ -112,8 +111,7 @@ class DanbooruExtractor(BaseExtractor):
def items_artists(self):
for artist in self.artists():
artist["_extractor"] = DanbooruTagExtractor
- url = "{}/posts?tags={}".format(
- self.root, text.quote(artist["name"]))
+ url = f"{self.root}/posts?tags={text.quote(artist['name'])}"
yield Message.Queue, url, artist
def metadata(self):
@@ -129,7 +127,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 +140,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"]])
@@ -157,7 +154,7 @@ class DanbooruExtractor(BaseExtractor):
return
if prefix:
- params["page"] = "{}{}".format(prefix, posts[-1]["id"])
+ params["page"] = f"{prefix}{posts[-1]['id']}"
elif params["page"]:
params["page"] += 1
else:
@@ -165,11 +162,17 @@ class DanbooruExtractor(BaseExtractor):
first = False
def _ugoira_frames(self, post):
- data = self.request("{}/posts/{}.json?only=media_metadata".format(
- self.root, post["id"])
- ).json()["media_metadata"]["metadata"]
+ data = self.request_json(
+ f"{self.root}/posts/{post['id']}.json?only=media_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["ZIP:ZipFileName"].rpartition(".")[2]
fmt = ("{:>06}." + ext).format
delays = data["Ugoira:FrameDelays"]
return [{"file": fmt(index), "delay": delay}
@@ -180,15 +183,15 @@ class DanbooruExtractor(BaseExtractor):
order = self.config("order-posts")
if not order or order in {"asc", "pool", "pool_asc", "asc_pool"}:
- params = {"tags": "ord{}:{}".format(ctype, cid)}
+ params = {"tags": f"ord{ctype}:{cid}"}
elif order in {"id", "desc_id", "id_desc"}:
- params = {"tags": "{}:{}".format(ctype, cid)}
+ params = {"tags": f"{ctype}:{cid}"}
prefix = "b"
elif order in {"desc", "desc_pool", "pool_desc"}:
- params = {"tags": "ord{}:{}".format(ctype, cid)}
+ params = {"tags": f"ord{ctype}:{cid}"}
reverse = True
elif order in {"asc_id", "id_asc"}:
- params = {"tags": "{}:{}".format(ctype, cid)}
+ params = {"tags": f"{ctype}:{cid}"}
reverse = True
posts = self._pagination("/posts.json", params, prefix)
@@ -199,8 +202,8 @@ class DanbooruExtractor(BaseExtractor):
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()
+ url = f"{self.root}/{cname or ctype}s/{cid}.json"
+ collection = self.request_json(url)
collection["name"] = collection["name"].replace("_", " ")
self.post_ids = collection.pop("post_ids", ())
return {ctype: collection}
@@ -315,11 +318,11 @@ class DanbooruPostExtractor(DanbooruExtractor):
example = "https://danbooru.donmai.us/posts/12345"
def posts(self):
- url = "{}/posts/{}.json".format(self.root, self.groups[-1])
- post = self.request(url).json()
+ url = f"{self.root}/posts/{self.groups[-1]}.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,)
@@ -357,8 +360,8 @@ class DanbooruArtistExtractor(DanbooruExtractor):
items = DanbooruExtractor.items_artists
def artists(self):
- url = "{}/artists/{}.json".format(self.root, self.groups[-1])
- return (self.request(url).json(),)
+ url = f"{self.root}/artists/{self.groups[-1]}.json"
+ return (self.request_json(url),)
class DanbooruArtistSearchExtractor(DanbooruExtractor):
@@ -375,7 +378,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