summaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/bilibili.py
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2025-07-31 01:22:01 -0400
committerLibravatarUnit 193 <unit193@unit193.net>2025-07-31 01:22:01 -0400
commita6e995c093de8aae2e91a0787281bb34c0b871eb (patch)
tree2d79821b05300d34d8871eb6c9662b359a2de85d /gallery_dl/extractor/bilibili.py
parent7672a750cb74bf31e21d76aad2776367fd476155 (diff)
New upstream version 1.30.2.upstream/1.30.2
Diffstat (limited to 'gallery_dl/extractor/bilibili.py')
-rw-r--r--gallery_dl/extractor/bilibili.py76
1 files changed, 41 insertions, 35 deletions
diff --git a/gallery_dl/extractor/bilibili.py b/gallery_dl/extractor/bilibili.py
index 597ec40..3f0acff 100644
--- a/gallery_dl/extractor/bilibili.py
+++ b/gallery_dl/extractor/bilibili.py
@@ -19,20 +19,15 @@ class BilibiliExtractor(Extractor):
def _init(self):
self.api = BilibiliAPI(self)
-
-class BilibiliUserArticlesExtractor(BilibiliExtractor):
- """Extractor for a bilibili user's articles"""
- subcategory = "user-articles"
- pattern = (r"(?:https?://)?space\.bilibili\.com/(\d+)"
- r"/(?:article|upload/opus)")
- example = "https://space.bilibili.com/12345/article"
-
def items(self):
- for article in self.api.user_articles(self.groups[0]):
+ for article in self.articles():
article["_extractor"] = BilibiliArticleExtractor
- url = "{}/opus/{}".format(self.root, article["opus_id"])
+ url = f"{self.root}/opus/{article['opus_id']}"
yield Message.Queue, url, article
+ def articles(self):
+ return ()
+
class BilibiliArticleExtractor(BilibiliExtractor):
"""Extractor for a bilibili article"""
@@ -45,12 +40,16 @@ class BilibiliArticleExtractor(BilibiliExtractor):
archive_fmt = "{id}_{num}"
def items(self):
- article = self.api.article(self.groups[0])
+ article_id = self.groups[0]
+ article = self.api.article(article_id)
# Flatten modules list
modules = {}
for module in article["detail"]["modules"]:
- del module['module_type']
+ if module["module_type"] == "MODULE_TYPE_BLOCKED":
+ self.log.warning("%s: Blocked Article\n%s", article_id,
+ module["module_blocked"].get("hint_message"))
+ del module["module_type"]
modules.update(module)
article["detail"]["modules"] = modules
@@ -64,14 +63,15 @@ class BilibiliArticleExtractor(BilibiliExtractor):
except Exception:
pass
- for paragraph in modules['module_content']['paragraphs']:
- if "pic" not in paragraph:
- continue
+ if "module_content" in modules:
+ for paragraph in modules["module_content"]["paragraphs"]:
+ if "pic" not in paragraph:
+ continue
- try:
- pics.extend(paragraph["pic"]["pics"])
- except Exception:
- pass
+ try:
+ pics.extend(paragraph["pic"]["pics"])
+ except Exception:
+ pass
article["count"] = len(pics)
yield Message.Directory, article
@@ -81,6 +81,17 @@ class BilibiliArticleExtractor(BilibiliExtractor):
yield Message.Url, url, text.nameext_from_url(url, article)
+class BilibiliUserArticlesExtractor(BilibiliExtractor):
+ """Extractor for a bilibili user's articles"""
+ subcategory = "user-articles"
+ pattern = (r"(?:https?://)?space\.bilibili\.com/(\d+)"
+ r"/(?:article|upload/opus)")
+ example = "https://space.bilibili.com/12345/article"
+
+ def articles(self):
+ return self.api.user_articles(self.groups[0])
+
+
class BilibiliUserArticlesFavoriteExtractor(BilibiliExtractor):
subcategory = "user-articles-favorite"
pattern = (r"(?:https?://)?space\.bilibili\.com"
@@ -88,18 +99,12 @@ class BilibiliUserArticlesFavoriteExtractor(BilibiliExtractor):
example = "https://space.bilibili.com/12345/favlist?fid=opus"
_warning = True
- def _init(self):
- BilibiliExtractor._init(self)
+ def articles(self):
if self._warning:
if not self.cookies_check(("SESSDATA",)):
self.log.error("'SESSDATA' cookie required")
BilibiliUserArticlesFavoriteExtractor._warning = False
-
- def items(self):
- for article in self.api.user_favlist():
- article["_extractor"] = BilibiliArticleExtractor
- url = "{}/opus/{}".format(self.root, article["opus_id"])
- yield Message.Queue, url, article
+ return self.api.user_favlist()
class BilibiliAPI():
@@ -108,11 +113,11 @@ class BilibiliAPI():
def _call(self, endpoint, params):
url = "https://api.bilibili.com/x/polymer/web-dynamic/v1" + endpoint
- data = self.extractor.request(url, params=params).json()
+ data = self.extractor.request_json(url, params=params)
- if data["code"] != 0:
+ if data["code"]:
self.extractor.log.debug("Server response: %s", data)
- raise exception.StopExtraction("API request failed")
+ raise exception.AbortExtraction("API request failed")
return data
@@ -140,8 +145,8 @@ class BilibiliAPI():
page, "window.__INITIAL_STATE__=", "};") + "}")
except Exception:
if "window._riskdata_" not in page:
- raise exception.StopExtraction(
- "%s: Unable to extract INITIAL_STATE data", article_id)
+ raise exception.AbortExtraction(
+ f"{article_id}: Unable to extract INITIAL_STATE data")
self.extractor.wait(seconds=300)
def user_favlist(self):
@@ -159,12 +164,13 @@ class BilibiliAPI():
def login_user_id(self):
url = "https://api.bilibili.com/x/space/v2/myinfo"
- data = self.extractor.request(url).json()
+ data = self.extractor.request_json(url)
if data["code"] != 0:
self.extractor.log.debug("Server response: %s", data)
- raise exception.StopExtraction("API request failed,Are you login?")
+ raise exception.AbortExtraction(
+ "API request failed. Are you logges in?")
try:
return data["data"]["profile"]["mid"]
except Exception:
- raise exception.StopExtraction("API request failed")
+ raise exception.AbortExtraction("API request failed")