summaryrefslogtreecommitdiffstats
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.py84
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}