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.py58
1 files changed, 41 insertions, 17 deletions
diff --git a/gallery_dl/extractor/danbooru.py b/gallery_dl/extractor/danbooru.py
index 29c7763..5ea33c4 100644
--- a/gallery_dl/extractor/danbooru.py
+++ b/gallery_dl/extractor/danbooru.py
@@ -9,8 +9,7 @@
"""Extractors for https://danbooru.donmai.us/ and other Danbooru instances"""
from .common import BaseExtractor, Message
-from .. import text, util
-import datetime
+from .. import text, util, dt
class DanbooruExtractor(BaseExtractor):
@@ -64,13 +63,12 @@ class DanbooruExtractor(BaseExtractor):
except KeyError:
if self.external and post["source"]:
post.update(data)
- yield Message.Directory, post
+ yield Message.Directory, "", post
yield Message.Queue, post["source"], post
continue
text.nameext_from_url(url, post)
- post["date"] = text.parse_datetime(
- post["created_at"], "%Y-%m-%dT%H:%M:%S.%f%z")
+ post["date"] = dt.parse_iso(post["created_at"])
post["tags"] = (
post["tag_string"].split(" ")
@@ -108,7 +106,7 @@ class DanbooruExtractor(BaseExtractor):
url = self.root + url
post.update(data)
- yield Message.Directory, post
+ yield Message.Directory, "", post
yield Message.Url, url, post
def items_artists(self):
@@ -253,7 +251,7 @@ class DanbooruTagExtractor(DanbooruExtractor):
subcategory = "tag"
directory_fmt = ("{category}", "{search_tags}")
archive_fmt = "t_{search_tags}_{id}"
- pattern = BASE_PATTERN + r"/posts\?(?:[^&#]*&)*tags=([^&#]*)"
+ pattern = rf"{BASE_PATTERN}/posts\?(?:[^&#]*&)*tags=([^&#]*)"
example = "https://danbooru.donmai.us/posts?tags=TAG"
def metadata(self):
@@ -281,7 +279,7 @@ class DanbooruTagExtractor(DanbooruExtractor):
class DanbooruRandomExtractor(DanbooruTagExtractor):
"""Extractor for a random danbooru post"""
subcategory = "random"
- pattern = BASE_PATTERN + r"/posts/random(?:\?(?:[^&#]*&)*tags=([^&#]*))?"
+ pattern = rf"{BASE_PATTERN}/posts/random(?:\?(?:[^&#]*&)*tags=([^&#]*))?"
example = "https://danbooru.donmai.us/posts/random?tags=TAG"
def metadata(self):
@@ -301,7 +299,7 @@ class DanbooruPoolExtractor(DanbooruExtractor):
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+)"
+ pattern = rf"{BASE_PATTERN}/pool(?:s|/show)/(\d+)"
example = "https://danbooru.donmai.us/pools/12345"
def metadata(self):
@@ -319,7 +317,7 @@ class DanbooruFavgroupExtractor(DanbooruExtractor):
"{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+)"
+ pattern = rf"{BASE_PATTERN}/favorite_group(?:s|/show)/(\d+)"
example = "https://danbooru.donmai.us/favorite_groups/12345"
def metadata(self):
@@ -334,7 +332,7 @@ class DanbooruPostExtractor(DanbooruExtractor):
"""Extractor for single danbooru posts"""
subcategory = "post"
archive_fmt = "{id}"
- pattern = BASE_PATTERN + r"/post(?:s|/show)/(\d+)"
+ pattern = rf"{BASE_PATTERN}/post(?:s|/show)/(\d+)"
example = "https://danbooru.donmai.us/posts/12345"
def posts(self):
@@ -346,22 +344,48 @@ class DanbooruPostExtractor(DanbooruExtractor):
return (post,)
+class DanbooruMediaassetExtractor(DanbooruExtractor):
+ """Extractor for a danbooru media asset"""
+ subcategory = "media-asset"
+ filename_fmt = "{category}_ma{id}_{filename}.{extension}"
+ archive_fmt = "m{id}"
+ pattern = rf"{BASE_PATTERN}/media_assets/(\d+)"
+ example = "https://danbooru.donmai.us/media_assets/12345"
+
+ def posts(self):
+ url = f"{self.root}/media_assets/{self.groups[-1]}.json"
+ asset = self.request_json(url)
+
+ asset["file_url"] = asset["variants"][-1]["url"]
+ asset["tag_string"] = \
+ asset["tag_string_artist"] = \
+ asset["tag_string_character"] = \
+ asset["tag_string_copyright"] = \
+ asset["tag_string_general"] = \
+ asset["tag_string_meta"] = ""
+
+ if self.includes:
+ params = {"only": self.includes}
+ asset.update(self.request_json(url, params=params))
+ return (asset,)
+
+
class DanbooruPopularExtractor(DanbooruExtractor):
"""Extractor for popular images from danbooru"""
subcategory = "popular"
directory_fmt = ("{category}", "popular", "{scale}", "{date}")
archive_fmt = "P_{scale[0]}_{date}_{id}"
- pattern = BASE_PATTERN + r"/(?:explore/posts/)?popular(?:\?([^#]*))?"
+ pattern = rf"{BASE_PATTERN}/(?:explore/posts/)?popular(?:\?([^#]*))?"
example = "https://danbooru.donmai.us/explore/posts/popular"
def metadata(self):
self.params = params = text.parse_query(self.groups[-1])
scale = params.get("scale", "day")
- date = params.get("date") or datetime.date.today().isoformat()
+ date = params.get("date") or dt.date.today().isoformat()
if scale == "week":
- date = datetime.date.fromisoformat(date)
- date = (date - datetime.timedelta(days=date.weekday())).isoformat()
+ date = dt.date.fromisoformat(date)
+ date = (date - dt.timedelta(days=date.weekday())).isoformat()
elif scale == "month":
date = date[:-3]
@@ -374,7 +398,7 @@ class DanbooruPopularExtractor(DanbooruExtractor):
class DanbooruArtistExtractor(DanbooruExtractor):
"""Extractor for danbooru artists"""
subcategory = "artist"
- pattern = BASE_PATTERN + r"/artists/(\d+)"
+ pattern = rf"{BASE_PATTERN}/artists/(\d+)"
example = "https://danbooru.donmai.us/artists/12345"
items = DanbooruExtractor.items_artists
@@ -387,7 +411,7 @@ class DanbooruArtistExtractor(DanbooruExtractor):
class DanbooruArtistSearchExtractor(DanbooruExtractor):
"""Extractor for danbooru artist searches"""
subcategory = "artist-search"
- pattern = BASE_PATTERN + r"/artists/?\?([^#]+)"
+ pattern = rf"{BASE_PATTERN}/artists/?\?([^#]+)"
example = "https://danbooru.donmai.us/artists?QUERY"
items = DanbooruExtractor.items_artists