[mangapark] update and fix 'chapter' extractor (#3969)

This commit is contained in:
Mike Fährmann
2023-06-29 22:31:34 +02:00
parent 9c31c2daef
commit 10786c657e

View File

@@ -9,15 +9,15 @@
"""Extractors for https://mangapark.net/""" """Extractors for https://mangapark.net/"""
from .common import ChapterExtractor, MangaExtractor from .common import ChapterExtractor, MangaExtractor
from .. import text, util, exception from .. import text, util
import re import re
BASE_PATTERN = r"(?:https?://)?(?:www\.)?mangapark\.(?:net|com|org|io|me)"
class MangaparkBase(): class MangaparkBase():
"""Base class for mangapark extractors""" """Base class for mangapark extractors"""
category = "mangapark" category = "mangapark"
root_fmt = "https://v2.mangapark.{}"
browser = "firefox"
@staticmethod @staticmethod
def parse_chapter_path(path, data): def parse_chapter_path(path, data):
@@ -50,66 +50,85 @@ class MangaparkBase():
class MangaparkChapterExtractor(MangaparkBase, ChapterExtractor): class MangaparkChapterExtractor(MangaparkBase, ChapterExtractor):
"""Extractor for manga-chapters from mangapark.net""" """Extractor for manga-chapters from mangapark.net"""
pattern = (r"(?:https?://)?(?:www\.|v2\.)?mangapark\.(me|net|com)" pattern = BASE_PATTERN + r"/title/[^/?#]+/(\d+)"
r"/manga/([^?#]+/i\d+)")
test = ( test = (
("https://mangapark.net/manga/gosu/i811653/c055/1", { ("https://mangapark.net/title/114972-aria/6710214-en-ch.60.2", {
"count": 50, "count": 70,
"keyword": "db1ed9af4f972756a25dbfa5af69a8f155b043ff", "pattern": r"https://[\w-]+\.mpcdn\.org/comic/2002/e67"
r"/61e29278a583b9227964076e/\d+_\d+_\d+_\d+\.jpeg"
r"\?acc=[^&#]+&exp=\d+",
"keyword": {
"artist": [],
"author": ["Amano Kozue"],
"chapter": 60,
"chapter_id": 6710214,
"chapter_minor": ".2",
"count": 70,
"date": "dt:2022-01-15 09:25:03",
"extension": "jpeg",
"filename": str,
"genre": ["adventure", "comedy", "drama", "sci_fi",
"shounen", "slice_of_life"],
"lang": "en",
"language": "English",
"manga": "Aria",
"manga_id": 114972,
"page": int,
"source": "Koala",
"title": "Special Navigation - Aquaria Ii",
"volume": 12,
},
}), }),
(("https://mangapark.net/manga" ("https://mangapark.com/title/114972-aria/6710214-en-ch.60.2"),
"/ad-astra-per-aspera-hata-kenjirou/i662051/c001.2/1"), { ("https://mangapark.org/title/114972-aria/6710214-en-ch.60.2"),
"count": 40, ("https://mangapark.io/title/114972-aria/6710214-en-ch.60.2"),
"keyword": "2bb3a8f426383ea13f17ff5582f3070d096d30ac", ("https://mangapark.me/title/114972-aria/6710214-en-ch.60.2"),
}),
(("https://mangapark.net/manga"
"/gekkan-shoujo-nozaki-kun/i2067426/v7/c70/1"), {
"count": 15,
"keyword": "edc14993c4752cee3a76e09b2f024d40d854bfd1",
}),
("https://mangapark.me/manga/gosu/i811615/c55/1"),
("https://mangapark.com/manga/gosu/i811615/c55/1"),
) )
def __init__(self, match): def __init__(self, match):
tld, self.path = match.groups() self.root = text.root_from_url(match.group(0))
self.root = self.root_fmt.format(tld) url = "{}/title/_/{}".format(self.root, match.group(1))
url = "{}/manga/{}?zoom=2".format(self.root, self.path)
ChapterExtractor.__init__(self, match, url) ChapterExtractor.__init__(self, match, url)
def metadata(self, page): def metadata(self, page):
data = text.extract_all(page, ( data = util.json_loads(text.extr(
("manga_id" , "var _manga_id = '", "'"), page, 'id="__NEXT_DATA__" type="application/json">', '<'))
("chapter_id", "var _book_id = '", "'"), chapter = (data["props"]["pageProps"]["dehydratedState"]
("stream" , "var _stream = '", "'"), ["queries"][0]["state"]["data"]["data"])
("path" , "var _book_link = '", "'"), manga = chapter["comicNode"]["data"]
("manga" , "<h2>", "</h2>"), source = chapter["sourceNode"]["data"]
("title" , "</a>", "<"),
), values={"lang": "en", "language": "English"})[0]
if not data["path"]: self._urls = chapter["imageSet"]["httpLis"]
raise exception.NotFoundError("chapter") self._params = chapter["imageSet"]["wordLis"]
self.parse_chapter_path(data["path"], data) match = re.match(
if "chapter" not in data: r"(?i)"
self.parse_chapter_title(data["title"], data) r"(?:vol(?:\.|ume)?\s*(\d+)\s*)?"
r"ch(?:\.|apter)?\s*(\d+)([^\s:]*)"
r"(?:\s*:\s*(.*))?", chapter["dname"])
vol, ch, minor, title = match.groups() if match else (0, 0, "", "")
data["manga"], _, data["type"] = data["manga"].rpartition(" ") return {
data["manga"] = text.unescape(data["manga"]) "manga" : manga["name"],
data["title"] = data["title"].partition(": ")[2] "manga_id" : manga["id"],
for key in ("manga_id", "chapter_id", "stream"): "artist" : source["artists"],
data[key] = text.parse_int(data[key]) "author" : source["authors"],
"genre" : source["genres"],
return data "volume" : text.parse_int(vol),
"chapter" : text.parse_int(ch),
"chapter_minor": minor,
"chapter_id": chapter["id"],
"title" : chapter["title"] or title or "",
"lang" : chapter["lang"],
"language" : util.code_to_language(chapter["lang"]),
"source" : chapter["srcTitle"],
"date" : text.parse_timestamp(chapter["dateCreate"] // 1000),
}
def images(self, page): def images(self, page):
data = util.json_loads(text.extr(page, "var _load_pages =", ";"))
return [ return [
(text.urljoin(self.root, item["u"]), { (url + "?" + params, None)
"width": text.parse_int(item["w"]), for url, params in zip(self._urls, self._params)
"height": text.parse_int(item["h"]),
})
for item in data
] ]