summaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/itaku.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/itaku.py
parent33f8a8a37a9cba738ef25fb99955f0730da9eb48 (diff)
New upstream version 1.31.1.upstream/1.31.1
Diffstat (limited to 'gallery_dl/extractor/itaku.py')
-rw-r--r--gallery_dl/extractor/itaku.py64
1 files changed, 35 insertions, 29 deletions
diff --git a/gallery_dl/extractor/itaku.py b/gallery_dl/extractor/itaku.py
index 19ffc50..566ee8b 100644
--- a/gallery_dl/extractor/itaku.py
+++ b/gallery_dl/extractor/itaku.py
@@ -13,7 +13,7 @@ from ..cache import memcache
from .. import text, util
BASE_PATTERN = r"(?:https?://)?itaku\.ee"
-USER_PATTERN = BASE_PATTERN + r"/profile/([^/?#]+)"
+USER_PATTERN = rf"{BASE_PATTERN}/profile/([^/?#]+)"
class ItakuExtractor(Extractor):
@@ -32,8 +32,7 @@ class ItakuExtractor(Extractor):
def items(self):
if images := self.images():
for image in images:
- image["date"] = text.parse_datetime(
- image["date_added"], "%Y-%m-%dT%H:%M:%S.%fZ")
+ image["date"] = self.parse_datetime_iso(image["date_added"])
for category, tags in image.pop("categorized_tags").items():
image[f"tags_{category.lower()}"] = [
t["name"] for t in tags]
@@ -52,7 +51,7 @@ class ItakuExtractor(Extractor):
else:
url = image["image"]
- yield Message.Directory, image
+ yield Message.Directory, "", image
yield Message.Url, url, text.nameext_from_url(url, image)
return
@@ -60,15 +59,14 @@ class ItakuExtractor(Extractor):
for post in posts:
images = post.pop("gallery_images") or ()
post["count"] = len(images)
- post["date"] = text.parse_datetime(
- post["date_added"], "%Y-%m-%dT%H:%M:%S.%fZ")
+ post["date"] = self.parse_datetime_iso(post["date_added"])
post["tags"] = [t["name"] for t in post["tags"]]
- yield Message.Directory, post
+ yield Message.Directory, "", post
for post["num"], image in enumerate(images, 1):
post["file"] = image
- image["date"] = text.parse_datetime(
- image["date_added"], "%Y-%m-%dT%H:%M:%S.%fZ")
+ image["date"] = self.parse_datetime_iso(
+ image["date_added"])
url = image["image"]
yield Message.Url, url, text.nameext_from_url(url, post)
@@ -88,7 +86,7 @@ class ItakuExtractor(Extractor):
class ItakuGalleryExtractor(ItakuExtractor):
"""Extractor for an itaku user's gallery"""
subcategory = "gallery"
- pattern = USER_PATTERN + r"/gallery(?:/(\d+))?"
+ pattern = rf"{USER_PATTERN}/gallery(?:/(\d+))?"
example = "https://itaku.ee/profile/USER/gallery"
def images(self):
@@ -106,7 +104,7 @@ class ItakuPostsExtractor(ItakuExtractor):
"{id}{title:? //}")
filename_fmt = "{file[id]}{file[title]:? //}.{extension}"
archive_fmt = "{id}_{file[id]}"
- pattern = USER_PATTERN + r"/posts(?:/(\d+))?"
+ pattern = rf"{USER_PATTERN}/posts(?:/(\d+))?"
example = "https://itaku.ee/profile/USER/posts"
def posts(self):
@@ -120,7 +118,7 @@ class ItakuPostsExtractor(ItakuExtractor):
class ItakuStarsExtractor(ItakuExtractor):
"""Extractor for an itaku user's starred images"""
subcategory = "stars"
- pattern = USER_PATTERN + r"/stars(?:/(\d+))?"
+ pattern = rf"{USER_PATTERN}/stars(?:/(\d+))?"
example = "https://itaku.ee/profile/USER/stars"
def images(self):
@@ -134,7 +132,7 @@ class ItakuStarsExtractor(ItakuExtractor):
class ItakuFollowingExtractor(ItakuExtractor):
subcategory = "following"
- pattern = USER_PATTERN + r"/following"
+ pattern = rf"{USER_PATTERN}/following"
example = "https://itaku.ee/profile/USER/following"
def users(self):
@@ -145,7 +143,7 @@ class ItakuFollowingExtractor(ItakuExtractor):
class ItakuFollowersExtractor(ItakuExtractor):
subcategory = "followers"
- pattern = USER_PATTERN + r"/followers"
+ pattern = rf"{USER_PATTERN}/followers"
example = "https://itaku.ee/profile/USER/followers"
def users(self):
@@ -157,7 +155,7 @@ class ItakuFollowersExtractor(ItakuExtractor):
class ItakuBookmarksExtractor(ItakuExtractor):
"""Extractor for an itaku bookmarks folder"""
subcategory = "bookmarks"
- pattern = USER_PATTERN + r"/bookmarks/(image|user)/(\d+)"
+ pattern = rf"{USER_PATTERN}/bookmarks/(image|user)/(\d+)"
example = "https://itaku.ee/profile/USER/bookmarks/image/12345"
def _init(self):
@@ -178,23 +176,23 @@ class ItakuBookmarksExtractor(ItakuExtractor):
class ItakuUserExtractor(Dispatch, ItakuExtractor):
"""Extractor for itaku user profiles"""
- pattern = USER_PATTERN + r"/?(?:$|\?|#)"
+ pattern = rf"{USER_PATTERN}/?(?:$|\?|#)"
example = "https://itaku.ee/profile/USER"
def items(self):
base = f"{self.root}/profile/{self.groups[0]}/"
return self._dispatch_extractors((
- (ItakuGalleryExtractor , base + "gallery"),
- (ItakuPostsExtractor , base + "posts"),
- (ItakuFollowersExtractor, base + "followers"),
- (ItakuFollowingExtractor, base + "following"),
- (ItakuStarsExtractor , base + "stars"),
+ (ItakuGalleryExtractor , f"{base}gallery"),
+ (ItakuPostsExtractor , f"{base}posts"),
+ (ItakuFollowersExtractor, f"{base}followers"),
+ (ItakuFollowingExtractor, f"{base}following"),
+ (ItakuStarsExtractor , f"{base}stars"),
), ("gallery",))
class ItakuImageExtractor(ItakuExtractor):
subcategory = "image"
- pattern = BASE_PATTERN + r"/images/(\d+)"
+ pattern = rf"{BASE_PATTERN}/images/(\d+)"
example = "https://itaku.ee/images/12345"
def images(self):
@@ -207,7 +205,7 @@ class ItakuPostExtractor(ItakuExtractor):
"{id}{title:? //}")
filename_fmt = "{file[id]}{file[title]:? //}.{extension}"
archive_fmt = "{id}_{file[id]}"
- pattern = BASE_PATTERN + r"/posts/(\d+)"
+ pattern = rf"{BASE_PATTERN}/posts/(\d+)"
example = "https://itaku.ee/posts/12345"
def posts(self):
@@ -216,7 +214,7 @@ class ItakuPostExtractor(ItakuExtractor):
class ItakuSearchExtractor(ItakuExtractor):
subcategory = "search"
- pattern = BASE_PATTERN + r"/home/images/?\?([^#]+)"
+ pattern = rf"{BASE_PATTERN}/home/images/?\?([^#]+)"
example = "https://itaku.ee/home/images?tags=SEARCH"
def images(self):
@@ -248,7 +246,7 @@ class ItakuAPI():
def __init__(self, extractor):
self.extractor = extractor
- self.root = extractor.root + "/api"
+ self.root = f"{extractor.root}/api"
self.headers = {
"Accept": "application/json, text/plain, */*",
}
@@ -259,7 +257,7 @@ class ItakuAPI():
"cursor" : None,
"date_range": "",
"maturity_rating": ("SFW", "Questionable", "NSFW"),
- "ordering" : "-date_added",
+ "ordering" : self._order(),
"page" : "1",
"page_size" : "30",
"visibility": ("PUBLIC", "PROFILE_ONLY"),
@@ -273,7 +271,7 @@ class ItakuAPI():
"cursor" : None,
"date_range": "",
"maturity_rating": ("SFW", "Questionable", "NSFW"),
- "ordering" : "-date_added",
+ "ordering" : self._order(),
"page" : "1",
"page_size" : "30",
**params,
@@ -284,7 +282,7 @@ class ItakuAPI():
endpoint = "/user_profiles/"
params = {
"cursor" : None,
- "ordering" : "-date_added",
+ "ordering" : self._order(),
"page" : "1",
"page_size": "50",
"sfw_only" : "false",
@@ -311,7 +309,7 @@ class ItakuAPI():
def _call(self, endpoint, params=None):
if not endpoint.startswith("http"):
- endpoint = self.root + endpoint
+ endpoint = f"{self.root}{endpoint}"
return self.extractor.request_json(
endpoint, params=params, headers=self.headers)
@@ -330,3 +328,11 @@ class ItakuAPI():
return
data = self._call(url_next)
+
+ def _order(self):
+ if order := self.extractor.config("order"):
+ if order in {"a", "asc", "r", "reverse"}:
+ return "date_added"
+ if order not in {"d", "desc"}:
+ return order
+ return "-date_added"