diff options
| author | 2020-03-16 23:20:15 -0400 | |
|---|---|---|
| committer | 2020-03-16 23:20:15 -0400 | |
| commit | e8cc000750de972384f2f34d02d42222b4018ae9 (patch) | |
| tree | 26eb0bacedff7480d29bafcf184ca529cf9f1d9f /gallery_dl/extractor/pixiv.py | |
| parent | 4366125d2580982abb57bc65a26fc1fb8ef2a5df (diff) | |
New upstream version 1.13.2upstream/1.13.2
Diffstat (limited to 'gallery_dl/extractor/pixiv.py')
| -rw-r--r-- | gallery_dl/extractor/pixiv.py | 84 |
1 files changed, 59 insertions, 25 deletions
diff --git a/gallery_dl/extractor/pixiv.py b/gallery_dl/extractor/pixiv.py index 8a10028..eaf97fd 100644 --- a/gallery_dl/extractor/pixiv.py +++ b/gallery_dl/extractor/pixiv.py @@ -12,6 +12,7 @@ from .common import Extractor, Message from .. import text, exception from ..cache import cache from datetime import datetime, timedelta +import itertools import hashlib import time @@ -27,11 +28,11 @@ class PixivExtractor(Extractor): def __init__(self, match): Extractor.__init__(self, match) self.api = PixivAppAPI(self) - self.user_id = -1 self.load_ugoira = self.config("ugoira", True) def items(self): - metadata = self.get_metadata() + ratings = {0: "General", 1: "R-18", 2: "R-18G"} + metadata = self.metadata() yield Message.Version, 1 for work in self.works(): @@ -46,6 +47,7 @@ class PixivExtractor(Extractor): work["num"] = 0 work["tags"] = [tag["name"] for tag in work["tags"]] work["date"] = text.parse_datetime(work["create_date"]) + work["rating"] = ratings.get(work["x_restrict"]) work["suffix"] = "" work.update(metadata) @@ -74,11 +76,9 @@ class PixivExtractor(Extractor): def works(self): """Return an iterable containing all relevant 'work'-objects""" - def get_metadata(self, user=None): + def metadata(self): """Collect metadata for extractor-job""" - if not user: - user = self.api.user_detail(self.user_id) - return {"user": user} + return {} class PixivUserExtractor(PixivExtractor): @@ -102,8 +102,15 @@ class PixivUserExtractor(PixivExtractor): "&tag=%E6%89%8B%E3%81%B6%E3%82%8D"), { "url": "25b1cd81153a8ff82eec440dd9f20a4a22079658", }), + # avatar (#595, 623) + ("https://www.pixiv.net/en/users/173530", { + "options": (("avatar", True),), + "content": "22af450d4dbaf4973d370f164f66f48c7382a6de", + "range": "1", + }), + # deleted account ("http://www.pixiv.net/member_illust.php?id=173531", { - "exception": exception.NotFoundError, + "count": 0, }), ("https://www.pixiv.net/en/users/173530"), ("https://www.pixiv.net/en/users/173530/manga"), @@ -136,6 +143,27 @@ class PixivUserExtractor(PixivExtractor): if tag in [t["name"].lower() for t in work["tags"]] ) + if self.config("avatar"): + user = self.api.user_detail(self.user_id) + url = user["profile_image_urls"]["medium"].replace("_170.", ".") + avatar = { + "create_date" : None, + "height" : 0, + "id" : "avatar", + "image_urls" : None, + "meta_pages" : (), + "meta_single_page": {"original_image_url": url}, + "page_count" : 1, + "sanity_level" : 0, + "tags" : (), + "title" : "avatar", + "type" : "avatar", + "user" : user, + "width" : 0, + "x_restrict" : 0, + } + works = itertools.chain((avatar,), works) + return works @@ -203,15 +231,9 @@ class PixivWorkExtractor(PixivExtractor): def __init__(self, match): PixivExtractor.__init__(self, match) self.illust_id = match.group(1) or match.group(2) - self.load_ugoira = True - self.work = None def works(self): - return (self.work,) - - def get_metadata(self, user=None): - self.work = self.api.illust_detail(self.illust_id) - return PixivExtractor.get_metadata(self, self.work["user"]) + return (self.api.illust_detail(self.illust_id),) class PixivFavoriteExtractor(PixivExtractor): @@ -220,8 +242,8 @@ class PixivFavoriteExtractor(PixivExtractor): directory_fmt = ("{category}", "bookmarks", "{user_bookmark[id]} {user_bookmark[account]}") archive_fmt = "f_{user_bookmark[id]}_{id}{num}.{extension}" - pattern = (r"(?:https?://)?(?:www\.|touch\.)?pixiv\.net/" - r"(?:(?:en/)?users/(\d+)/(bookmarks/artworks|following)" + pattern = (r"(?:https?://)?(?:www\.|touch\.)?pixiv\.net/(?:(?:en/)?" + r"users/(\d+)/(bookmarks/artworks(?:/([^/?&#]+))?|following)" r"|bookmark\.php(?:\?([^#]*))?)") test = ( ("https://www.pixiv.net/en/users/173530/bookmarks/artworks", { @@ -231,20 +253,29 @@ class PixivFavoriteExtractor(PixivExtractor): "url": "e717eb511500f2fa3497aaee796a468ecf685cc4", }), # bookmarks with specific tag + (("https://www.pixiv.net/en/users/3137110" + "/bookmarks/artworks/%E3%81%AF%E3%82%93%E3%82%82%E3%82%93"), { + "url": "379b28275f786d946e01f721e54afe346c148a8c", + }), + # bookmarks with specific tag (legacy url) (("https://www.pixiv.net/bookmark.php?id=3137110" "&tag=%E3%81%AF%E3%82%93%E3%82%82%E3%82%93&p=1"), { - "count": 2, + "url": "379b28275f786d946e01f721e54afe346c148a8c", }), # own bookmarks ("https://www.pixiv.net/bookmark.php", { "url": "90c1715b07b0d1aad300bce256a0bc71f42540ba", }), + # own bookmarks with tag (#596) + ("https://www.pixiv.net/bookmark.php?tag=foobar", { + "count": 0, + }), # followed users (#515) ("https://www.pixiv.net/en/users/173530/following", { "pattern": PixivUserExtractor.pattern, "count": ">= 12", }), - # followed users (#515) + # followed users (legacy url) (#515) ("https://www.pixiv.net/bookmark.php?id=173530&type=user", { "pattern": PixivUserExtractor.pattern, "count": ">= 12", @@ -255,11 +286,11 @@ class PixivFavoriteExtractor(PixivExtractor): ) def __init__(self, match): - uid, kind, query = match.groups() + uid, kind, self.tag, query = match.groups() if query: self.query = text.parse_query(query) - uid = self.query.get("id", -1) + uid = self.query.get("id") if not uid: self.subcategory = "bookmark" elif self.query.get("type") == "user": @@ -280,12 +311,15 @@ class PixivFavoriteExtractor(PixivExtractor): if "tag" in self.query: tag = text.unquote(self.query["tag"]) + elif self.tag: + tag = text.unquote(self.tag) + if "rest" in self.query and self.query["rest"] == "hide": restrict = "private" return self.api.user_bookmarks_illust(self.user_id, tag, restrict) - def get_metadata(self, user=None): + def metadata(self): if self.user_id: user = self.api.user_detail(self.user_id) else: @@ -301,7 +335,7 @@ class PixivFavoriteExtractor(PixivExtractor): for preview in self.api.user_following(self.user_id): user = preview["user"] user["_extractor"] = PixivUserExtractor - url = "https://www.pixiv.net/member.php?id={}".format(user["id"]) + url = "https://www.pixiv.net/users/{}".format(user["id"]) yield Message.Queue, url, user @@ -327,7 +361,7 @@ class PixivRankingExtractor(PixivExtractor): def works(self): return self.api.illust_ranking(self.mode, self.date) - def get_metadata(self, user=None): + def metadata(self): query = text.parse_query(self.query) mode = query.get("mode", "daily").lower() @@ -393,7 +427,7 @@ class PixivSearchExtractor(PixivExtractor): def works(self): return self.api.search_illust(self.word, self.sort, self.target) - def get_metadata(self, user=None): + def metadata(self): query = text.parse_query(self.query) if self.word: @@ -446,7 +480,7 @@ class PixivFollowExtractor(PixivExtractor): def works(self): return self.api.illust_follow() - def get_metadata(self, user=None): + def metadata(self): self.api.login() return {"user_follow": self.api.user} |
