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.py90
1 files changed, 54 insertions, 36 deletions
diff --git a/gallery_dl/extractor/pixiv.py b/gallery_dl/extractor/pixiv.py
index d732894..3479b88 100644
--- a/gallery_dl/extractor/pixiv.py
+++ b/gallery_dl/extractor/pixiv.py
@@ -94,12 +94,39 @@ class PixivExtractor(Extractor):
work.get("id"), exc.message)
continue
- url = ugoira["zip_urls"]["medium"].replace(
- "_ugoira600x600", "_ugoira1920x1080")
- work["frames"] = ugoira["frames"]
+ url = ugoira["zip_urls"]["medium"]
+ work["frames"] = frames = ugoira["frames"]
work["date_url"] = self._date_from_url(url)
work["_http_adjust_extension"] = False
- yield Message.Url, url, text.nameext_from_url(url, work)
+
+ if self.load_ugoira == "original":
+ base, sep, _ = url.rpartition("_ugoira")
+ base = base.replace(
+ "/img-zip-ugoira/", "/img-original/", 1) + sep
+
+ for ext in ("jpg", "png", "gif"):
+ try:
+ url = ("{}0.{}".format(base, ext))
+ self.request(url, method="HEAD")
+ break
+ except exception.HttpError:
+ pass
+ else:
+ self.log.warning(
+ "Unable to find Ugoira frame URLs (%s)",
+ work.get("id"))
+ continue
+
+ for num, frame in enumerate(frames):
+ url = ("{}{}.{}".format(base, num, ext))
+ work["num"] = work["_ugoira_frame_index"] = num
+ work["suffix"] = "_p{:02}".format(num)
+ text.nameext_from_url(url, work)
+ yield Message.Url, url, work
+
+ else:
+ url = url.replace("_ugoira600x600", "_ugoira1920x1080")
+ yield Message.Url, url, text.nameext_from_url(url, work)
elif work["page_count"] == 1:
url = meta_single_page["original_image_url"]
@@ -551,9 +578,6 @@ class PixivSeriesExtractor(PixivExtractor):
directory_fmt = ("{category}", "{user[id]} {user[account]}",
"{series[id]} {series[title]}")
filename_fmt = "{num_series:>03}_{id}_p{num}.{extension}"
- cookies_domain = ".pixiv.net"
- browser = "firefox"
- tls12 = False
pattern = BASE_PATTERN + r"/user/(\d+)/series/(\d+)"
example = "https://www.pixiv.net/user/12345/series/12345"
@@ -562,34 +586,18 @@ class PixivSeriesExtractor(PixivExtractor):
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",
- }
+ series = None
- 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.extr(series["title"], '"', '"')
-
- 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
+ for work in self.api.illust_series(self.series_id):
+ if series is None:
+ series = self.api.data
+ series["total"] = num_series = series.pop("series_work_count")
+ else:
+ num_series -= 1
+
+ work["num_series"] = num_series
+ work["series"] = series
+ yield work
class PixivNovelExtractor(PixivExtractor):
@@ -916,6 +924,11 @@ class PixivAppAPI():
params = {"illust_id": illust_id}
return self._pagination("/v2/illust/related", params)
+ def illust_series(self, series_id, offset=0):
+ params = {"illust_series_id": series_id, "offset": offset}
+ return self._pagination("/v1/illust/series", params,
+ key_data="illust_series_detail")
+
def novel_bookmark_detail(self, novel_id):
params = {"novel_id": novel_id}
return self._call(
@@ -1013,10 +1026,15 @@ class PixivAppAPI():
raise exception.StopExtraction("API request failed: %s", error)
- def _pagination(self, endpoint, params, key="illusts"):
+ def _pagination(self, endpoint, params,
+ key_items="illusts", key_data=None):
while True:
data = self._call(endpoint, params)
- yield from data[key]
+
+ if key_data:
+ self.data = data.get(key_data)
+ key_data = None
+ yield from data[key_items]
if not data["next_url"]:
return