summaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/e621.py
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2025-12-20 05:49:04 -0500
committerLibravatarUnit 193 <unit193@unit193.net>2025-12-20 05:49:04 -0500
commita24ec1647aeac35a63b744ea856011ad6e06be3b (patch)
treeae94416de786aeddd05d99559098f7f16bb103a6 /gallery_dl/extractor/e621.py
parent33f8a8a37a9cba738ef25fb99955f0730da9eb48 (diff)
New upstream version 1.31.1.upstream/1.31.1
Diffstat (limited to 'gallery_dl/extractor/e621.py')
-rw-r--r--gallery_dl/extractor/e621.py40
1 files changed, 32 insertions, 8 deletions
diff --git a/gallery_dl/extractor/e621.py b/gallery_dl/extractor/e621.py
index 71c3b30..cc6708d 100644
--- a/gallery_dl/extractor/e621.py
+++ b/gallery_dl/extractor/e621.py
@@ -51,13 +51,18 @@ class E621Extractor(danbooru.DanbooruExtractor):
post["filename"] = file["md5"]
post["extension"] = file["ext"]
- post["date"] = text.parse_datetime(
- post["created_at"], "%Y-%m-%dT%H:%M:%S.%f%z")
+ post["date"] = self.parse_datetime_iso(post["created_at"])
post.update(data)
- yield Message.Directory, post
+ yield Message.Directory, "", post
yield Message.Url, file["url"], post
+ def items_artists(self):
+ for artist in self.artists():
+ artist["_extractor"] = E621TagExtractor
+ url = f"{self.root}/posts?tags={text.quote(artist['name'])}"
+ yield Message.Queue, url, artist
+
def _get_notes(self, id):
return self.request_json(
f"{self.root}/notes.json?search[post_id]={id}")
@@ -89,13 +94,13 @@ BASE_PATTERN = E621Extractor.update({
class E621TagExtractor(E621Extractor, danbooru.DanbooruTagExtractor):
"""Extractor for e621 posts from tag searches"""
- pattern = BASE_PATTERN + r"/posts?(?:\?[^#]*?tags=|/index/\d+/)([^&#]*)"
+ pattern = rf"{BASE_PATTERN}/posts?(?:\?[^#]*?tags=|/index/\d+/)([^&#]*)"
example = "https://e621.net/posts?tags=TAG"
class E621PoolExtractor(E621Extractor, danbooru.DanbooruPoolExtractor):
"""Extractor for e621 pools"""
- pattern = BASE_PATTERN + r"/pool(?:s|/show)/(\d+)"
+ pattern = rf"{BASE_PATTERN}/pool(?:s|/show)/(\d+)"
example = "https://e621.net/pools/12345"
def posts(self):
@@ -120,7 +125,7 @@ class E621PoolExtractor(E621Extractor, danbooru.DanbooruPoolExtractor):
class E621PostExtractor(E621Extractor, danbooru.DanbooruPostExtractor):
"""Extractor for single e621 posts"""
- pattern = BASE_PATTERN + r"/post(?:s|/show)/(\d+)"
+ pattern = rf"{BASE_PATTERN}/post(?:s|/show)/(\d+)"
example = "https://e621.net/posts/12345"
def posts(self):
@@ -130,19 +135,38 @@ class E621PostExtractor(E621Extractor, danbooru.DanbooruPostExtractor):
class E621PopularExtractor(E621Extractor, danbooru.DanbooruPopularExtractor):
"""Extractor for popular images from e621"""
- pattern = BASE_PATTERN + r"/explore/posts/popular(?:\?([^#]*))?"
+ pattern = rf"{BASE_PATTERN}/explore/posts/popular(?:\?([^#]*))?"
example = "https://e621.net/explore/posts/popular"
def posts(self):
return self._pagination("/popular.json", self.params)
+class E621ArtistExtractor(E621Extractor, danbooru.DanbooruArtistExtractor):
+ """Extractor for e621 artists"""
+ subcategory = "artist"
+ pattern = rf"{BASE_PATTERN}/artists/(\d+)"
+ example = "https://e621.net/artists/12345"
+
+ items = E621Extractor.items_artists
+
+
+class E621ArtistSearchExtractor(E621Extractor,
+ danbooru.DanbooruArtistSearchExtractor):
+ """Extractor for e621 artist searches"""
+ subcategory = "artist-search"
+ pattern = rf"{BASE_PATTERN}/artists/?\?([^#]+)"
+ example = "https://e621.net/artists?QUERY"
+
+ items = E621Extractor.items_artists
+
+
class E621FavoriteExtractor(E621Extractor):
"""Extractor for e621 favorites"""
subcategory = "favorite"
directory_fmt = ("{category}", "Favorites", "{user_id}")
archive_fmt = "f_{user_id}_{id}"
- pattern = BASE_PATTERN + r"/favorites(?:\?([^#]*))?"
+ pattern = rf"{BASE_PATTERN}/favorites(?:\?([^#]*))?"
example = "https://e621.net/favorites"
def metadata(self):