aboutsummaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/foolslide.py
diff options
context:
space:
mode:
Diffstat (limited to 'gallery_dl/extractor/foolslide.py')
-rw-r--r--gallery_dl/extractor/foolslide.py190
1 files changed, 96 insertions, 94 deletions
diff --git a/gallery_dl/extractor/foolslide.py b/gallery_dl/extractor/foolslide.py
index db5e250..f8664e7 100644
--- a/gallery_dl/extractor/foolslide.py
+++ b/gallery_dl/extractor/foolslide.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Copyright 2016-2020 Mike Fährmann
+# Copyright 2016-2021 Mike Fährmann
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
@@ -8,23 +8,21 @@
"""Extractors for FoOlSlide based sites"""
-from .common import (
- Extractor,
- ChapterExtractor,
- MangaExtractor,
- Message,
- generate_extractors,
-)
+from .common import BaseExtractor, Message
from .. import text, util
import json
-class FoolslideBase():
+class FoolslideExtractor(BaseExtractor):
"""Base class for FoOlSlide extractors"""
basecategory = "foolslide"
+ def __init__(self, match):
+ BaseExtractor.__init__(self, match)
+ self.gallery_url = self.root + match.group(match.lastindex)
+
def request(self, url):
- return Extractor.request(
+ return BaseExtractor.request(
self, url, encoding="utf-8", method="POST", data={"adult": "true"})
@staticmethod
@@ -40,12 +38,53 @@ class FoolslideBase():
return data
-class FoolslideChapterExtractor(FoolslideBase, ChapterExtractor):
+BASE_PATTERN = FoolslideExtractor.update({
+ "dokireader": {
+ "root": "https://kobato.hologfx.com/reader",
+ },
+ "kireicake": {
+ "root": "https://reader.kireicake.com",
+ },
+ "powermanga": {
+ "root": "https://read.powermanga.org",
+ "pattern": r"read(?:er)?\.powermanga\.org",
+ },
+ "sensescans": {
+ "root": "https://sensescans.com/reader",
+ "pattern": r"(?:(?:www\.)?sensescans\.com/reader"
+ r"|reader\.sensescans\.com)",
+ },
+})
+
+
+class FoolslideChapterExtractor(FoolslideExtractor):
"""Base class for chapter extractors for FoOlSlide based sites"""
+ subcategory = "chapter"
directory_fmt = ("{category}", "{manga}", "{chapter_string}")
+ filename_fmt = (
+ "{manga}_c{chapter:>03}{chapter_minor:?//}_{page:>03}.{extension}")
archive_fmt = "{id}"
- pattern_fmt = r"(/read/[^/?#]+/[a-z-]+/\d+/\d+(?:/\d+)?)"
- decode = "default"
+ pattern = BASE_PATTERN + r"(/read/[^/?#]+/[a-z-]+/\d+/\d+(?:/\d+)?)"
+ test = (
+ (("https://kobato.hologfx.com/reader/read/"
+ "hitoribocchi_no_oo_seikatsu/en/3/34"), {
+ "keyword": "6e719ac86f0c6dab89390dd7e507e678459e0dbc",
+ }),
+ ("https://reader.kireicake.com/read/wonderland/en/1/1/", {
+ "url": "b2d36bc0bc67e4c461c3a4d6444a2fd339f5d07e",
+ "keyword": "9f80947920a325e33aea7f5cd69ea669171903b6",
+ }),
+ (("https://read.powermanga.org"
+ "/read/one_piece_digital_colour_comics/en/0/75/"), {
+ "url": "854c5817f8f767e1bccd05fa9d58ffb5a4b09384",
+ "keyword": "a60c42f2634b7387899299d411ff494ed0ad6dbe",
+ }),
+ ("https://sensescans.com/reader/read/ao_no_orchestra/en/0/26/", {
+ "url": "bbd428dc578f5055e9f86ad635b510386cd317cd",
+ "keyword": "083ef6f8831c84127fe4096fa340a249be9d1424",
+ }),
+ ("https://reader.sensescans.com/read/ao_no_orchestra/en/0/26/"),
+ )
def items(self):
page = self.request(self.gallery_url).text
@@ -83,9 +122,51 @@ class FoolslideChapterExtractor(FoolslideBase, ChapterExtractor):
return json.loads(text.extract(page, "var pages = ", ";")[0])
-class FoolslideMangaExtractor(FoolslideBase, MangaExtractor):
+class FoolslideMangaExtractor(FoolslideExtractor):
"""Base class for manga extractors for FoOlSlide based sites"""
- pattern_fmt = r"(/series/[^/?#]+)"
+ subcategory = "manga"
+ categorytransfer = True
+ pattern = BASE_PATTERN + r"(/series/[^/?#]+)"
+ test = (
+ (("https://kobato.hologfx.com/reader/series/"
+ "boku_ha_ohimesama_ni_narenai/"), {
+ "url": "1c1f5a7258ce4f631f5fc32be548d78a6a57990d",
+ "keyword": "614d89a6045b85c822cbd3e67578ea7577dfc995",
+ }),
+ ("https://reader.kireicake.com/series/wonderland/", {
+ "url": "d067b649af1cc88fa8c8b698fde04a10909fd169",
+ "keyword": "268f43772fb239888ca5c5f6a4f65f99ffb3eefb",
+ }),
+ (("https://read.powermanga.org"
+ "/series/one_piece_digital_colour_comics/"), {
+ "count": ">= 1",
+ "keyword": {
+ "chapter": int,
+ "chapter_minor": str,
+ "chapter_string": str,
+ "group": "PowerManga",
+ "lang": "en",
+ "language": "English",
+ "manga": "One Piece Digital Colour Comics",
+ "title": str,
+ "volume": int,
+ },
+ }),
+ ("https://sensescans.com/reader/series/yotsubato/", {
+ "count": ">= 3",
+ }),
+ )
+
+ def items(self):
+ page = self.request(self.gallery_url).text
+
+ chapters = self.chapters(page)
+ if not self.config("chapter-reverse", False):
+ chapters.reverse()
+
+ for chapter, data in chapters:
+ data["_extractor"] = FoolslideChapterExtractor
+ yield Message.Queue, chapter, data
def chapters(self, page):
extr = text.extract_from(page)
@@ -103,82 +184,3 @@ class FoolslideMangaExtractor(FoolslideBase, MangaExtractor):
"chapter_string": extr('title="', '"'),
"group" : extr('title="', '"'),
})))
-
-
-EXTRACTORS = {
- "dokireader": {
- "root": "https://kobato.hologfx.com/reader",
- "test-chapter":
- (("https://kobato.hologfx.com/reader/read/"
- "hitoribocchi_no_oo_seikatsu/en/3/34"), {
- "keyword": "6e719ac86f0c6dab89390dd7e507e678459e0dbc",
- }),
- "test-manga":
- (("https://kobato.hologfx.com/reader/series/"
- "boku_ha_ohimesama_ni_narenai/"), {
- "url": "1c1f5a7258ce4f631f5fc32be548d78a6a57990d",
- "keyword": "614d89a6045b85c822cbd3e67578ea7577dfc995",
- }),
- },
- "kireicake": {
- "root": "https://reader.kireicake.com",
- "test-chapter":
- ("https://reader.kireicake.com/read/wonderland/en/1/1/", {
- "url": "b2d36bc0bc67e4c461c3a4d6444a2fd339f5d07e",
- "keyword": "9f80947920a325e33aea7f5cd69ea669171903b6",
- }),
- "test-manga":
- ("https://reader.kireicake.com/series/wonderland/", {
- "url": "d067b649af1cc88fa8c8b698fde04a10909fd169",
- "keyword": "268f43772fb239888ca5c5f6a4f65f99ffb3eefb",
- }),
- },
- "powermanga": {
- "root": "https://read.powermanga.org",
- "pattern": r"read(?:er)?\.powermanga\.org",
- "test-chapter":
- (("https://read.powermanga.org"
- "/read/one_piece_digital_colour_comics/en/0/75/"), {
- "url": "854c5817f8f767e1bccd05fa9d58ffb5a4b09384",
- "keyword": "a60c42f2634b7387899299d411ff494ed0ad6dbe",
- }),
- "test-manga":
- (("https://read.powermanga.org"
- "/series/one_piece_digital_colour_comics/"), {
- "count": ">= 1",
- "keyword": {
- "chapter": int,
- "chapter_minor": str,
- "chapter_string": str,
- "group": "PowerManga",
- "lang": "en",
- "language": "English",
- "manga": "One Piece Digital Colour Comics",
- "title": str,
- "volume": int,
- },
- }),
- },
- "sensescans": {
- "root": "https://sensescans.com/reader",
- "pattern": r"(?:(?:www\.)?sensescans\.com/reader"
- r"|reader\.sensescans\.com)",
- "test-chapter": (
- ("https://sensescans.com/reader/read/ao_no_orchestra/en/0/26/", {
- "url": "bbd428dc578f5055e9f86ad635b510386cd317cd",
- "keyword": "083ef6f8831c84127fe4096fa340a249be9d1424",
- }),
- ("https://reader.sensescans.com/read/ao_no_orchestra/en/0/26/"),
- ),
- "test-manga":
- ("https://sensescans.com/reader/series/yotsubato/", {
- "count": ">= 3",
- }),
- },
- "_ckey": "chapterclass",
-}
-
-generate_extractors(EXTRACTORS, globals(), (
- FoolslideChapterExtractor,
- FoolslideMangaExtractor,
-))