diff options
Diffstat (limited to 'gallery_dl/extractor/danbooru.py')
| -rw-r--r-- | gallery_dl/extractor/danbooru.py | 58 |
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 |
