aboutsummaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/pixiv.py
diff options
context:
space:
mode:
Diffstat (limited to 'gallery_dl/extractor/pixiv.py')
-rw-r--r--gallery_dl/extractor/pixiv.py60
1 files changed, 60 insertions, 0 deletions
diff --git a/gallery_dl/extractor/pixiv.py b/gallery_dl/extractor/pixiv.py
index a589760..6b2e1c3 100644
--- a/gallery_dl/extractor/pixiv.py
+++ b/gallery_dl/extractor/pixiv.py
@@ -642,6 +642,66 @@ class PixivPixivisionExtractor(PixivExtractor):
}
+class PixivSeriesExtractor(PixivExtractor):
+ """Extractor for illustrations from a Pixiv series"""
+ subcategory = "series"
+ directory_fmt = ("{category}", "{user[id]} {user[account]}",
+ "{series[id]} {series[title]}")
+ filename_fmt = "{num_series:>03}_{id}_p{num}.{extension}"
+ pattern = (r"(?:https?://)?(?:www\.)?pixiv\.net"
+ r"/user/(\d+)/series/(\d+)")
+ test = ("https://www.pixiv.net/user/10509347/series/21859", {
+ "range": "1-10",
+ "count": 10,
+ "keyword": {
+ "num_series": int,
+ "series": {
+ "canonical": "https://www.pixiv.net/user/10509347"
+ "/series/21859",
+ "description": str,
+ "ogp": dict,
+ "title": "先輩がうざい後輩の話",
+ "total": int,
+ "twitter": dict,
+ },
+ },
+ })
+
+ def __init__(self, match):
+ PixivExtractor.__init__(self, match)
+ self.user_id, self.series_id = match.groups()
+
+ def works(self):
+ url = self.root + "/ajax/series/" + self.series_id
+ params = {"p": 1}
+ headers = {
+ "Accept": "application/json",
+ "Referer": "{}/user/{}/series/{}".format(
+ self.root, self.user_id, self.series_id),
+ "Alt-Used": "www.pixiv.net",
+ }
+
+ while True:
+ data = self.request(url, params=params, headers=headers).json()
+ body = data["body"]
+ page = body["page"]
+
+ series = body["extraData"]["meta"]
+ series["id"] = self.series_id
+ series["total"] = page["total"]
+ series["title"] = text.extract(series["title"], '"', '"')[0]
+
+ for info in page["series"]:
+ work = self.api.illust_detail(info["workId"])
+ work["num_series"] = info["order"]
+ work["series"] = series
+ yield work
+
+ if len(page["series"]) < 10:
+ return
+ params["p"] += 1
+
+
class PixivSketchExtractor(Extractor):
"""Extractor for user pages on sketch.pixiv.net"""
category = "pixiv"