From 8ecca3af58aeed9503d4d2550e0e71b72cf7adaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Wed, 7 Jul 2021 02:22:44 +0200 Subject: [PATCH] [pixiv] add extractor for 'pixivision' articles (#1672) --- docs/supportedsites.md | 2 +- gallery_dl/extractor/pixiv.py | 46 +++++++++++++++++++++++++++++++++-- scripts/supportedsites.py | 1 + 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/docs/supportedsites.md b/docs/supportedsites.md index c12d5d5f..4ebda247 100644 --- a/docs/supportedsites.md +++ b/docs/supportedsites.md @@ -550,7 +550,7 @@ Consider all sites to be NSFW unless otherwise known. Pixiv https://www.pixiv.net/ - Favorites, Follows, pixiv.me Links, Rankings, Search Results, User Profiles, individual Images + Favorites, Follows, pixiv.me Links, pixivision, Rankings, Search Results, User Profiles, individual Images OAuth diff --git a/gallery_dl/extractor/pixiv.py b/gallery_dl/extractor/pixiv.py index ff07a575..aefe644c 100644 --- a/gallery_dl/extractor/pixiv.py +++ b/gallery_dl/extractor/pixiv.py @@ -6,10 +6,10 @@ # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. -"""Extract images and ugoira from https://www.pixiv.net/""" +"""Extractors for https://www.pixiv.net/""" from .common import Extractor, Message -from .. import text, exception +from .. import text, util, exception from ..cache import cache from datetime import datetime, timedelta import itertools @@ -517,6 +517,48 @@ class PixivFollowExtractor(PixivExtractor): return {"user_follow": self.api.user} +class PixivPixivisionExtractor(PixivExtractor): + """Extractor for illustrations from a pixivision article""" + subcategory = "pixivision" + directory_fmt = ("{category}", "pixivision", + "{pixivision_id} {pixivision_title}") + archive_fmt = "V{pixivision_id}_{id}{suffix}.{extension}" + pattern = r"(?:https?://)?(?:www\.)?pixivision\.net/(?:en/)?a/(\d+)" + test = ( + ("https://www.pixivision.net/en/a/2791"), + ("https://pixivision.net/a/2791", { + "count": 7, + "keyword": { + "pixivision_id": "2791", + "pixivision_title": "What's your favorite music? Editor’s " + "picks featuring: “CD Covers”!", + }, + }), + ) + + def __init__(self, match): + PixivExtractor.__init__(self, match) + self.pixivision_id = match.group(1) + + def works(self): + return ( + self.api.illust_detail(illust_id) + for illust_id in util.unique_sequence(text.extract_iter( + self.page, '', ' - pixivision<')[0] + return { + "pixivision_id" : self.pixivision_id, + "pixivision_title": text.unescape(title), + } + + class PixivAppAPI(): """Minimal interface for the Pixiv App API for mobile devices diff --git a/scripts/supportedsites.py b/scripts/supportedsites.py index 92e70308..61da8c51 100755 --- a/scripts/supportedsites.py +++ b/scripts/supportedsites.py @@ -166,6 +166,7 @@ SUBCATEGORY_MAP = { }, "pixiv": { "me" : "pixiv.me Links", + "pixivision": "pixivision", "work": "individual Images", }, "sankaku": {