aboutsummaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/fanbox.py
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2025-12-20 05:49:11 -0500
committerLibravatarUnit 193 <unit193@unit193.net>2025-12-20 05:49:11 -0500
commitc586ea4b3c871f5696626f9820e8c88a4e78f4a6 (patch)
treee6d7bae96282c3d147159f091d451e53bdaa2efe /gallery_dl/extractor/fanbox.py
parent01a2bf622c31072d1322884584404b9bd59b28cc (diff)
parenta24ec1647aeac35a63b744ea856011ad6e06be3b (diff)
Update upstream source from tag 'upstream/1.31.1'
Update to upstream version '1.31.1' with Debian dir b5d91c25143175f933b1c69c7e82249cd7e145ab
Diffstat (limited to 'gallery_dl/extractor/fanbox.py')
-rw-r--r--gallery_dl/extractor/fanbox.py63
1 files changed, 39 insertions, 24 deletions
diff --git a/gallery_dl/extractor/fanbox.py b/gallery_dl/extractor/fanbox.py
index 70b06e7..036b388 100644
--- a/gallery_dl/extractor/fanbox.py
+++ b/gallery_dl/extractor/fanbox.py
@@ -66,18 +66,17 @@ class FanboxExtractor(Extractor):
if fee_max is not None and fee_max < item["feeRequired"]:
self.log.warning("Skipping post %s (feeRequired of %s > %s)",
item["id"], item["feeRequired"], fee_max)
- continue
-
- try:
- url = "https://api.fanbox.cc/post.info?postId=" + item["id"]
- body = self.request_json(url, headers=self.headers)["body"]
- content_body, post = self._extract_post(body)
- except Exception as exc:
- self.log.warning("Skipping post %s (%s: %s)",
- item["id"], exc.__class__.__name__, exc)
- continue
-
- yield Message.Directory, post
+ else:
+ try:
+ url = ("https://api.fanbox.cc/post.info?postId=" +
+ item["id"])
+ item = self.request_json(url, headers=self.headers)["body"]
+ except Exception as exc:
+ self.log.warning("Skipping post %s (%s: %s)",
+ item["id"], exc.__class__.__name__, exc)
+
+ content_body, post = self._extract_post(item)
+ yield Message.Directory, "", post
yield from self._get_urls_from_post(content_body, post)
def posts(self):
@@ -128,15 +127,19 @@ class FanboxExtractor(Extractor):
if file.get("extension", "").lower() in exts
]
- post["date"] = text.parse_datetime(post["publishedDatetime"])
+ try:
+ post["date"] = self.parse_datetime_iso(post["publishedDatetime"])
+ except Exception:
+ post["date"] = None
post["text"] = content_body.get("text") if content_body else None
post["isCoverImage"] = False
- if self._meta_user:
- post["user"] = self._get_user_data(post["creatorId"])
- if self._meta_plan:
+ cid = post.get("creatorId")
+ if self._meta_user and cid is not None:
+ post["user"] = self._get_user_data(cid)
+ if self._meta_plan and cid is not None:
plans = self._get_plan_data(post["creatorId"])
- fee = post["feeRequired"]
+ fee = post.get("feeRequired") or 0
try:
post["plan"] = plans[fee]
except KeyError:
@@ -147,7 +150,7 @@ class FanboxExtractor(Extractor):
plan["fee"] = fee
post["plan"] = plans[fee] = plan
if self._meta_comments:
- if post["commentCount"]:
+ if post.get("commentCount"):
post["comments"] = list(self._get_comment_data(post["id"]))
else:
post["commentd"] = ()
@@ -216,7 +219,7 @@ class FanboxExtractor(Extractor):
def _get_urls_from_post(self, content_body, post):
num = 0
if cover_image := post.get("coverImageUrl"):
- cover_image = util.re("/c/[0-9a-z_]+").sub("", cover_image)
+ cover_image = text.re("/c/[0-9a-z_]+").sub("", cover_image)
final_post = post.copy()
final_post["isCoverImage"] = True
final_post["fileUrl"] = cover_image
@@ -352,7 +355,7 @@ class FanboxExtractor(Extractor):
class FanboxCreatorExtractor(FanboxExtractor):
"""Extractor for a Fanbox creator's works"""
subcategory = "creator"
- pattern = USER_PATTERN + r"(?:/posts)?/?$"
+ pattern = rf"{USER_PATTERN}(?:/posts)?/?$"
example = "https://USER.fanbox.cc/"
def posts(self):
@@ -362,15 +365,26 @@ class FanboxCreatorExtractor(FanboxExtractor):
def _pagination_creator(self, url):
urls = self.request_json(url, headers=self.headers)["body"]
+ if offset := self.config("offset"):
+ quotient, remainder = divmod(offset, 10)
+ if quotient:
+ urls = urls[quotient:]
+ else:
+ remainder = None
+
for url in urls:
url = text.ensure_http_scheme(url)
- yield from self.request_json(url, headers=self.headers)["body"]
+ posts = self.request_json(url, headers=self.headers)["body"]
+ if remainder:
+ posts = posts[remainder:]
+ remainder = None
+ yield from posts
class FanboxPostExtractor(FanboxExtractor):
"""Extractor for media from a single Fanbox post"""
subcategory = "post"
- pattern = USER_PATTERN + r"/posts/(\d+)"
+ pattern = rf"{USER_PATTERN}/posts/(\d+)"
example = "https://USER.fanbox.cc/posts/12345"
def posts(self):
@@ -380,7 +394,7 @@ class FanboxPostExtractor(FanboxExtractor):
class FanboxHomeExtractor(FanboxExtractor):
"""Extractor for your Fanbox home feed"""
subcategory = "home"
- pattern = BASE_PATTERN + r"/?$"
+ pattern = rf"{BASE_PATTERN}/?$"
example = "https://fanbox.cc/"
def posts(self):
@@ -391,7 +405,7 @@ class FanboxHomeExtractor(FanboxExtractor):
class FanboxSupportingExtractor(FanboxExtractor):
"""Extractor for your supported Fanbox users feed"""
subcategory = "supporting"
- pattern = BASE_PATTERN + r"/home/supporting"
+ pattern = rf"{BASE_PATTERN}/home/supporting"
example = "https://fanbox.cc/home/supporting"
def posts(self):
@@ -403,6 +417,7 @@ class FanboxRedirectExtractor(Extractor):
"""Extractor for pixiv redirects to fanbox.cc"""
category = "fanbox"
subcategory = "redirect"
+ cookies_domain = None
pattern = r"(?:https?://)?(?:www\.)?pixiv\.net/fanbox/creator/(\d+)"
example = "https://www.pixiv.net/fanbox/creator/12345"