[manganelo] support 'nelomanga.net' and mirror domains (#7423)
- natomanga.com - nelomanga.net - manganato.gg - mangakakalot.gg
This commit is contained in:
@@ -565,24 +565,12 @@ Consider all listed sites to potentially be NSFW.
|
||||
<td>Authors, Chapters, Followed Feed, Lists, Manga</td>
|
||||
<td>Supported</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>MangaKakalot</td>
|
||||
<td>https://mangakakalot.tv/</td>
|
||||
<td>Chapters, Manga</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>MangaLife</td>
|
||||
<td>https://manga4life.com/</td>
|
||||
<td>Chapters, Manga</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Manganato</td>
|
||||
<td>https://manganato.com/</td>
|
||||
<td>Chapters, Manga</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>MangaPark</td>
|
||||
<td>https://mangapark.net/</td>
|
||||
@@ -1408,6 +1396,34 @@ Consider all listed sites to potentially be NSFW.
|
||||
<td></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="4"><strong>MangaNelo and Mirror Sites</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>MangaNelo</td>
|
||||
<td>https://www.nelomanga.net/</td>
|
||||
<td>Chapters, Manga</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>MangaNato</td>
|
||||
<td>https://www.natomanga.com/</td>
|
||||
<td>Chapters, Manga</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>MangaNato</td>
|
||||
<td>https://www.manganato.gg/</td>
|
||||
<td>Chapters, Manga</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>MangaKakalot</td>
|
||||
<td>https://www.mangakakalot.gg/</td>
|
||||
<td>Chapters, Manga</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="4"><strong>Misskey Instances</strong></td>
|
||||
</tr>
|
||||
|
||||
@@ -105,7 +105,6 @@ modules = [
|
||||
"mangadex",
|
||||
"mangafox",
|
||||
"mangahere",
|
||||
"mangakakalot",
|
||||
"manganelo",
|
||||
"mangapark",
|
||||
"mangaread",
|
||||
|
||||
@@ -1,92 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2020 Jake Mannens
|
||||
# Copyright 2021-2023 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
|
||||
# published by the Free Software Foundation.
|
||||
|
||||
"""Extractors for https://mangakakalot.tv/"""
|
||||
|
||||
from .common import ChapterExtractor, MangaExtractor
|
||||
from .. import text
|
||||
import re
|
||||
|
||||
BASE_PATTERN = r"(?:https?://)?(?:ww[\dw]?\.)?mangakakalot\.tv"
|
||||
|
||||
|
||||
class MangakakalotBase():
|
||||
"""Base class for mangakakalot extractors"""
|
||||
category = "mangakakalot"
|
||||
root = "https://ww8.mangakakalot.tv"
|
||||
|
||||
|
||||
class MangakakalotChapterExtractor(MangakakalotBase, ChapterExtractor):
|
||||
"""Extractor for manga chapters from mangakakalot.tv"""
|
||||
pattern = BASE_PATTERN + r"(/chapter/[^/?#]+/chapter[_-][^/?#]+)"
|
||||
example = "https://ww6.mangakakalot.tv/chapter/manga-ID/chapter-01"
|
||||
|
||||
def __init__(self, match):
|
||||
self.path = match.group(1)
|
||||
ChapterExtractor.__init__(self, match, self.root + self.path)
|
||||
|
||||
def metadata(self, page):
|
||||
_ , pos = text.extract(page, '<span itemprop="title">', '<')
|
||||
manga , pos = text.extract(page, '<span itemprop="title">', '<', pos)
|
||||
info , pos = text.extract(page, '<span itemprop="title">', '<', pos)
|
||||
author, pos = text.extract(page, '. Author:', ' already has ', pos)
|
||||
|
||||
match = re.match(
|
||||
r"(?:[Vv]ol\. *(\d+) )?"
|
||||
r"[Cc]hapter *([^:]*)"
|
||||
r"(?:: *(.+))?", info or "")
|
||||
volume, chapter, title = match.groups() if match else ("", "", info)
|
||||
chapter, sep, minor = chapter.partition(".")
|
||||
|
||||
return {
|
||||
"manga" : text.unescape(manga),
|
||||
"title" : text.unescape(title) if title else "",
|
||||
"author" : text.unescape(author).strip() if author else "",
|
||||
"volume" : text.parse_int(volume),
|
||||
"chapter" : text.parse_int(chapter),
|
||||
"chapter_minor": sep + minor,
|
||||
"lang" : "en",
|
||||
"language" : "English",
|
||||
}
|
||||
|
||||
def images(self, page):
|
||||
return [
|
||||
(url, None)
|
||||
for url in text.extract_iter(page, '<img data-src="', '"')
|
||||
]
|
||||
|
||||
|
||||
class MangakakalotMangaExtractor(MangakakalotBase, MangaExtractor):
|
||||
"""Extractor for manga from mangakakalot.tv"""
|
||||
chapterclass = MangakakalotChapterExtractor
|
||||
pattern = BASE_PATTERN + r"(/manga/[^/?#]+)"
|
||||
example = "https://ww6.mangakakalot.tv/manga/manga-ID"
|
||||
|
||||
def chapters(self, page):
|
||||
data = {"lang": "en", "language": "English"}
|
||||
data["manga"], pos = text.extract(page, "<h1>", "<")
|
||||
author, pos = text.extract(page, "<li>Author(s) :", "</a>", pos)
|
||||
data["author"] = text.remove_html(author)
|
||||
|
||||
results = []
|
||||
for chapter in text.extract_iter(page, '<div class="row">', '</div>'):
|
||||
url, pos = text.extract(chapter, '<a href="', '"')
|
||||
title, pos = text.extract(chapter, '>', '</a>', pos)
|
||||
data["title"] = title.partition(": ")[2]
|
||||
data["date"] , pos = text.extract(
|
||||
chapter, '<span title=" ', '"', pos)
|
||||
|
||||
chapter, sep, minor = url.rpartition("/chapter-")[2].partition(".")
|
||||
data["chapter"] = text.parse_int(chapter)
|
||||
data["chapter_minor"] = sep + minor
|
||||
|
||||
if url[0] == "/":
|
||||
url = self.root + url
|
||||
results.append((url, data.copy()))
|
||||
return results
|
||||
@@ -1,107 +1,119 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright 2020 Jake Mannens
|
||||
# Copyright 2021-2025 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
|
||||
# published by the Free Software Foundation.
|
||||
|
||||
"""Extractors for https://manganato.com/"""
|
||||
"""Extractors for https://www.mangakakalot.gg/ and mirror sites"""
|
||||
|
||||
from .common import ChapterExtractor, MangaExtractor
|
||||
from .. import text
|
||||
import re
|
||||
|
||||
BASE_PATTERN = (
|
||||
r"(?:https?://)?"
|
||||
r"((?:chap|read|www\.|m\.)?mangan(?:at|el)o"
|
||||
r"\.(?:to|com))"
|
||||
)
|
||||
from .common import BaseExtractor, ChapterExtractor, MangaExtractor
|
||||
from .. import text, util
|
||||
|
||||
|
||||
class ManganeloBase():
|
||||
category = "manganelo"
|
||||
root = "https://chapmanganato.com"
|
||||
_match_chapter = None
|
||||
class ManganeloExtractor(BaseExtractor):
|
||||
basecategory = "manganelo"
|
||||
|
||||
|
||||
BASE_PATTERN = ManganeloExtractor.update({
|
||||
"nelomanga": {
|
||||
"root" : "https://www.nelomanga.net",
|
||||
"pattern": r"(?:www\.)?nelomanga\.net",
|
||||
},
|
||||
"natomanga": {
|
||||
"root" : "https://www.natomanga.com",
|
||||
"pattern": r"(?:www\.)?natomanga\.com",
|
||||
},
|
||||
"manganato": {
|
||||
"root" : "https://www.manganato.gg",
|
||||
"pattern": r"(?:www\.)?manganato\.gg",
|
||||
},
|
||||
"mangakakalot": {
|
||||
"root" : "https://www.mangakakalot.gg",
|
||||
"pattern": r"(?:www\.)?mangakakalot\.gg",
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
class ManganeloChapterExtractor(ManganeloExtractor, ChapterExtractor):
|
||||
"""Extractor for manganelo manga chapters"""
|
||||
pattern = BASE_PATTERN + r"(/manga/[^/?#]+/chapter-[^/?#]+)"
|
||||
example = "https://www.mangakakalot.gg/manga/MANGA_NAME/chapter-123"
|
||||
|
||||
def __init__(self, match):
|
||||
domain, path = match.groups()
|
||||
super().__init__(match, "https://" + domain + path)
|
||||
|
||||
def _init(self):
|
||||
if self._match_chapter is None:
|
||||
ManganeloBase._match_chapter = re.compile(
|
||||
r"(?:[Vv]ol\.?\s*(\d+)\s?)?"
|
||||
r"[Cc]hapter\s*(\d+)([^:]*)"
|
||||
r"(?::\s*(.+))?").match
|
||||
|
||||
def _parse_chapter(self, info, manga, author, date=None):
|
||||
match = self._match_chapter(info)
|
||||
if match:
|
||||
volume, chapter, minor, title = match.groups()
|
||||
else:
|
||||
volume = chapter = minor = ""
|
||||
title = info
|
||||
|
||||
return {
|
||||
"manga" : manga,
|
||||
"author" : author,
|
||||
"date" : date,
|
||||
"title" : text.unescape(title) if title else "",
|
||||
"volume" : text.parse_int(volume),
|
||||
"chapter" : text.parse_int(chapter),
|
||||
"chapter_minor": minor,
|
||||
"lang" : "en",
|
||||
"language" : "English",
|
||||
}
|
||||
|
||||
|
||||
class ManganeloChapterExtractor(ManganeloBase, ChapterExtractor):
|
||||
"""Extractor for manga chapters from manganelo.com"""
|
||||
pattern = BASE_PATTERN + r"(/(?:manga-\w+|chapter/\w+)/chapter[-_][^/?#]+)"
|
||||
example = "https://chapmanganato.com/manga-ID/chapter-01"
|
||||
ManganeloExtractor.__init__(self, match)
|
||||
self.gallery_url = self.root + self.groups[-1]
|
||||
|
||||
def metadata(self, page):
|
||||
extr = text.extract_from(page)
|
||||
extr('class="a-h"', ">")
|
||||
manga = extr('title="', '"')
|
||||
info = extr('title="', '"')
|
||||
author = extr("- Author(s) : ", "</p>")
|
||||
|
||||
return self._parse_chapter(
|
||||
info, text.unescape(manga), text.unescape(author))
|
||||
data = {
|
||||
"date" : text.parse_datetime(extr(
|
||||
'"datePublished": "', '"')[:19], "%Y-%m-%dT%H:%M:%S"),
|
||||
"date_updated": text.parse_datetime(extr(
|
||||
'"dateModified": "', '"')[:19], "%Y-%m-%dT%H:%M:%S"),
|
||||
"manga_id" : text.parse_int(extr("comic_id =", ";")),
|
||||
"chapter_id" : text.parse_int(extr("chapter_id =", ";")),
|
||||
"manga" : extr("comic_name =", ";").strip('" '),
|
||||
"lang" : "en",
|
||||
"language" : "English",
|
||||
}
|
||||
|
||||
chapter_name = extr("chapter_name =", ";").strip('" ')
|
||||
chapter, sep, minor = chapter_name.rpartition(" ")[2].partition(".")
|
||||
data["chapter"] = text.parse_int(chapter)
|
||||
data["chapter_minor"] = sep + minor
|
||||
data["author"] = extr(". Author:", " already has ").strip()
|
||||
|
||||
return data
|
||||
|
||||
def images(self, page):
|
||||
page = text.extr(
|
||||
page, 'class="container-chapter-reader', 'class="container')
|
||||
extr = text.extract_from(page)
|
||||
cdns = util.json_loads(extr("var cdns =", ";"))[0]
|
||||
imgs = util.json_loads(extr("var chapterImages =", ";"))
|
||||
|
||||
if cdns[-1] != "/":
|
||||
cdns += "/"
|
||||
|
||||
return [
|
||||
(url, None)
|
||||
for url in text.extract_iter(page, '<img src="', '"')
|
||||
if not url.endswith("/gohome.png")
|
||||
] or [
|
||||
(url, None)
|
||||
for url in text.extract_iter(
|
||||
page, '<img class="reader-content" src="', '"')
|
||||
(cdns + path, None)
|
||||
for path in imgs
|
||||
]
|
||||
|
||||
|
||||
class ManganeloMangaExtractor(ManganeloBase, MangaExtractor):
|
||||
"""Extractor for manga from manganelo.com"""
|
||||
class ManganeloMangaExtractor(ManganeloExtractor, MangaExtractor):
|
||||
"""Extractor for manganelo manga"""
|
||||
chapterclass = ManganeloChapterExtractor
|
||||
pattern = BASE_PATTERN + r"(/(?:manga[-/]|read_)\w+)/?$"
|
||||
example = "https://manganato.com/manga-ID"
|
||||
pattern = BASE_PATTERN + r"(/manga/[^/?#]+)$"
|
||||
example = "https://www.mangakakalot.gg/manga/MANGA_NAME"
|
||||
|
||||
def __init__(self, match):
|
||||
ManganeloExtractor.__init__(self, match)
|
||||
self.manga_url = self.root + self.groups[-1]
|
||||
|
||||
def chapters(self, page):
|
||||
manga = text.unescape(text.extr(page, "<h1>", "<"))
|
||||
author = text.remove_html(text.extr(page, "<li>Author(s) :", "</a>"))
|
||||
|
||||
results = []
|
||||
append = results.append
|
||||
for chapter in text.extract_iter(page, '<div class="row">', '</div>'):
|
||||
url, pos = text.extract(chapter, '<a href="', '"')
|
||||
title, pos = text.extract(chapter, '>', '</a>', pos)
|
||||
date, pos = text.extract(chapter, '<span title="', '"', pos)
|
||||
chapter, sep, minor = url.rpartition("/chapter-")[2].partition("-")
|
||||
|
||||
extr = text.extract_from(page)
|
||||
manga = text.unescape(extr("<h1>", "<"))
|
||||
author = text.remove_html(extr("</i>Author(s) :</td>", "</tr>"))
|
||||
|
||||
extr('class="row-content-chapter', '')
|
||||
while True:
|
||||
url = extr('class="chapter-name text-nowrap" href="', '"')
|
||||
if not url:
|
||||
return results
|
||||
info = extr(">", "<")
|
||||
date = extr('class="chapter-time text-nowrap" title="', '"')
|
||||
append((url, self._parse_chapter(info, manga, author, date)))
|
||||
if url[0] == "/":
|
||||
url = self.root + url
|
||||
results.append((url, {
|
||||
"manga" : manga,
|
||||
"author" : author,
|
||||
"chapter" : text.parse_int(chapter),
|
||||
"chapter_minor": (sep and ".") + minor,
|
||||
"title" : title.partition(": ")[2],
|
||||
"date" : text.parse_datetime(date, "%b-%d-%Y %H:%M"),
|
||||
"lang" : "en",
|
||||
"language": "English",
|
||||
}))
|
||||
return results
|
||||
|
||||
@@ -101,7 +101,7 @@ CATEGORY_MAP = {
|
||||
"mangahere" : "Manga Here",
|
||||
"mangakakalot" : "MangaKakalot",
|
||||
"mangalife" : "MangaLife",
|
||||
"manganelo" : "Manganato",
|
||||
"manganato" : "MangaNato",
|
||||
"mangapark" : "MangaPark",
|
||||
"mangaread" : "MangaRead",
|
||||
"mangasee" : "MangaSee",
|
||||
@@ -111,7 +111,9 @@ CATEGORY_MAP = {
|
||||
"micmicidol" : "MIC MIC IDOL",
|
||||
"myhentaigallery": "My Hentai Gallery",
|
||||
"myportfolio" : "Adobe Portfolio",
|
||||
"natomanga" : "MangaNato",
|
||||
"naverwebtoon" : "NaverWebtoon",
|
||||
"nelomanga" : "MangaNelo",
|
||||
"nhentai" : "nhentai",
|
||||
"nijie" : "nijie",
|
||||
"nozomi" : "Nozomi.la",
|
||||
@@ -401,6 +403,7 @@ BASE_MAP = {
|
||||
"jschan" : "jschan Imageboards",
|
||||
"lolisafe" : "lolisafe and chibisafe",
|
||||
"lynxchan" : "LynxChan Imageboards",
|
||||
"manganelo" : "MangaNelo and Mirror Sites",
|
||||
"moebooru" : "Moebooru and MyImouto",
|
||||
"szurubooru" : "szurubooru Instances",
|
||||
"urlshortener": "URL Shorteners",
|
||||
|
||||
@@ -4,37 +4,60 @@
|
||||
# it under the terms of the GNU General Public License version 2 as
|
||||
# published by the Free Software Foundation.
|
||||
|
||||
from gallery_dl.extractor import mangakakalot
|
||||
from gallery_dl.extractor import manganelo
|
||||
|
||||
|
||||
__tests__ = (
|
||||
{
|
||||
"#url" : "https://ww3.mangakakalot.tv/chapter/manga-jk986845/chapter-34.2",
|
||||
"#category": ("", "mangakakalot", "chapter"),
|
||||
"#class" : mangakakalot.MangakakalotChapterExtractor,
|
||||
"#pattern" : r"https://cm\.blazefast\.co/[0-9a-f]{2}/[0-9a-f]{2}/[0-9a-f]{32}\.jpg",
|
||||
"#count" : 9,
|
||||
"#sha1_metadata": "0f1586ff52f0f9cbbb25306ae64ab718f8a6a633",
|
||||
"#url" : "https://www.mangakakalot.gg/manga/danzai-sareta-akuyaku-reijou-wa-gyakkou-shite-kanpeki-na-akujo-wo-mezasu/chapter-4-5",
|
||||
"#category": ("manganelo", "mangakakalot", "chapter"),
|
||||
"#class" : manganelo.ManganeloChapterExtractor,
|
||||
"#pattern" : r"https://imgs-2.2xstorage.com/danzai-sareta-akuyaku-reijou-wa-gyakkou-shite-kanpeki-na-akujo-wo-mezasu/4\.5/\d+\.webp",
|
||||
"#count" : 24,
|
||||
|
||||
"author" : "NARAYAMA Bakufu",
|
||||
"chapter" : 4,
|
||||
"chapter_id" : 6,
|
||||
"chapter_minor": ".5",
|
||||
"count" : 24,
|
||||
"date" : "dt:2025-04-29 16:08:07",
|
||||
"date_updated" : "dt:2025-04-29 16:08:07",
|
||||
"extension" : "webp",
|
||||
"filename" : str,
|
||||
"lang" : "en",
|
||||
"language" : "English",
|
||||
"manga" : "Danzai sareta Akuyaku Reijou wa, Gyakkou shite Kanpeki na Akujo wo Mezasu",
|
||||
"manga_id" : 32842,
|
||||
"page" : range(1, 24),
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://mangakakalot.tv/chapter/hatarakanai_futari_the_jobless_siblings/chapter_20.1",
|
||||
"#category": ("", "mangakakalot", "chapter"),
|
||||
"#class" : mangakakalot.MangakakalotChapterExtractor,
|
||||
"#url" : "https://mangakakalot.gg/manga/aria/chapter-60-2",
|
||||
"#category": ("manganelo", "mangakakalot", "chapter"),
|
||||
"#class" : manganelo.ManganeloChapterExtractor,
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://ww3.mangakakalot.tv/manga/manga-jk986845",
|
||||
"#category": ("", "mangakakalot", "manga"),
|
||||
"#class" : mangakakalot.MangakakalotMangaExtractor,
|
||||
"#pattern" : mangakakalot.MangakakalotChapterExtractor.pattern,
|
||||
"#count" : ">= 30",
|
||||
"#url" : "https://www.mangakakalot.gg/manga/aria",
|
||||
"#category": ("manganelo", "mangakakalot", "manga"),
|
||||
"#class" : manganelo.ManganeloMangaExtractor,
|
||||
"#pattern" : manganelo.ManganeloChapterExtractor.pattern,
|
||||
"#count" : 70,
|
||||
|
||||
"author" : "Amano Kozue",
|
||||
"chapter" : range(1, 60),
|
||||
"chapter_minor": {"", ".1", ".2", ".5"},
|
||||
"date" : "type:datetime",
|
||||
"lang" : "en",
|
||||
"language": "English",
|
||||
"manga" : "Aria",
|
||||
"title" : "",
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://mangakakalot.tv/manga/lk921810",
|
||||
"#category": ("", "mangakakalot", "manga"),
|
||||
"#class" : mangakakalot.MangakakalotMangaExtractor,
|
||||
"#url" : "https://mangakakalot.gg/manga/aria",
|
||||
"#category": ("manganelo", "mangakakalot", "manga"),
|
||||
"#class" : manganelo.ManganeloMangaExtractor,
|
||||
},
|
||||
|
||||
)
|
||||
|
||||
63
test/results/manganato.py
Normal file
63
test/results/manganato.py
Normal file
@@ -0,0 +1,63 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# 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
|
||||
# published by the Free Software Foundation.
|
||||
|
||||
from gallery_dl.extractor import manganelo
|
||||
|
||||
|
||||
__tests__ = (
|
||||
{
|
||||
"#url" : "https://www.manganato.gg/manga/danzai-sareta-akuyaku-reijou-wa-gyakkou-shite-kanpeki-na-akujo-wo-mezasu/chapter-4-5",
|
||||
"#category": ("manganelo", "manganato", "chapter"),
|
||||
"#class" : manganelo.ManganeloChapterExtractor,
|
||||
"#pattern" : r"https://imgs-2.2xstorage.com/danzai-sareta-akuyaku-reijou-wa-gyakkou-shite-kanpeki-na-akujo-wo-mezasu/4\.5/\d+\.webp",
|
||||
"#count" : 24,
|
||||
|
||||
"author" : "NARAYAMA Bakufu",
|
||||
"chapter" : 4,
|
||||
"chapter_id" : 6,
|
||||
"chapter_minor": ".5",
|
||||
"count" : 24,
|
||||
"date" : "",
|
||||
"date_updated" : "",
|
||||
"extension" : "webp",
|
||||
"filename" : str,
|
||||
"lang" : "en",
|
||||
"language" : "English",
|
||||
"manga" : "Danzai sareta Akuyaku Reijou wa, Gyakkou shite Kanpeki na Akujo wo Mezasu",
|
||||
"manga_id" : 32842,
|
||||
"page" : range(1, 24),
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://manganato.gg/manga/aria/chapter-60-2",
|
||||
"#category": ("manganelo", "manganato", "chapter"),
|
||||
"#class" : manganelo.ManganeloChapterExtractor,
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://www.manganato.gg/manga/aria",
|
||||
"#category": ("manganelo", "manganato", "manga"),
|
||||
"#class" : manganelo.ManganeloMangaExtractor,
|
||||
"#pattern" : manganelo.ManganeloChapterExtractor.pattern,
|
||||
"#count" : 70,
|
||||
|
||||
"author" : "Amano Kozue",
|
||||
"chapter" : range(1, 60),
|
||||
"chapter_minor": {"", ".1", ".2", ".5"},
|
||||
"date" : "type:datetime",
|
||||
"lang" : "en",
|
||||
"language": "English",
|
||||
"manga" : "Aria",
|
||||
"title" : "",
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://manganato.gg/manga/aria",
|
||||
"#category": ("manganelo", "manganato", "manga"),
|
||||
"#class" : manganelo.ManganeloMangaExtractor,
|
||||
},
|
||||
|
||||
)
|
||||
@@ -1,104 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# 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
|
||||
# published by the Free Software Foundation.
|
||||
|
||||
from gallery_dl.extractor import manganelo
|
||||
|
||||
|
||||
__tests__ = (
|
||||
{
|
||||
"#url" : "https://chapmanganato.com/manga-gn983696/chapter-23",
|
||||
"#category": ("", "manganelo", "chapter"),
|
||||
"#class" : manganelo.ManganeloChapterExtractor,
|
||||
"#pattern" : r"https://v\d+\.mkklcdnv6tempv5\.com/img/tab_17/03/23/39/gn983696/vol_3_chapter_23_24_yen/\d+-[no]\.jpg",
|
||||
"#count" : 25,
|
||||
|
||||
"author" : "Ei Yuzuki,Maki Hayashi",
|
||||
"chapter" : 23,
|
||||
"chapter_minor": "",
|
||||
"count" : 25,
|
||||
"date" : None,
|
||||
"extension": "jpg",
|
||||
"filename" : str,
|
||||
"lang" : "en",
|
||||
"language" : "English",
|
||||
"manga" : "By Spring",
|
||||
"page" : range(1, 25),
|
||||
"title" : "24 Yen",
|
||||
"volume" : 3,
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://chapmanganelo.com/manga-ti107776/chapter-4",
|
||||
"#category": ("", "manganelo", "chapter"),
|
||||
"#class" : manganelo.ManganeloChapterExtractor,
|
||||
"#pattern" : r"https://v\d+\.mkklcdnv6tempv5\.com/img/tab_17/01/92/08/ti970565/chapter_4_caster/\d+-o\.jpg",
|
||||
"#count" : 45,
|
||||
"#sha1_metadata": "06e01fa9b3fc9b5b954c0d4a98f0153b40922ded",
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://chapmanganato.com/manga-no991297/chapter-8",
|
||||
"#category": ("", "manganelo", "chapter"),
|
||||
"#class" : manganelo.ManganeloChapterExtractor,
|
||||
"#count" : 20,
|
||||
|
||||
"chapter" : 8,
|
||||
"chapter_minor": "-1",
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://readmanganato.com/manga-gn983696/chapter-23",
|
||||
"#category": ("", "manganelo", "chapter"),
|
||||
"#class" : manganelo.ManganeloChapterExtractor,
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://manganelo.com/chapter/gamers/chapter_15",
|
||||
"#category": ("", "manganelo", "chapter"),
|
||||
"#class" : manganelo.ManganeloChapterExtractor,
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://manganelo.com/chapter/gq921227/chapter_23",
|
||||
"#category": ("", "manganelo", "chapter"),
|
||||
"#class" : manganelo.ManganeloChapterExtractor,
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://chapmanganato.com/manga-gn983696",
|
||||
"#category": ("", "manganelo", "manga"),
|
||||
"#class" : manganelo.ManganeloMangaExtractor,
|
||||
"#pattern" : manganelo.ManganeloChapterExtractor.pattern,
|
||||
"#count" : ">= 25",
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://m.manganelo.com/manga-ti107776",
|
||||
"#category": ("", "manganelo", "manga"),
|
||||
"#class" : manganelo.ManganeloMangaExtractor,
|
||||
"#pattern" : manganelo.ManganeloChapterExtractor.pattern,
|
||||
"#count" : ">= 12",
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://readmanganato.com/manga-gn983696",
|
||||
"#category": ("", "manganelo", "manga"),
|
||||
"#class" : manganelo.ManganeloMangaExtractor,
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://manganelo.com/manga/read_otome_no_teikoku",
|
||||
"#category": ("", "manganelo", "manga"),
|
||||
"#class" : manganelo.ManganeloMangaExtractor,
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://manganelo.com/manga/ol921234/",
|
||||
"#category": ("", "manganelo", "manga"),
|
||||
"#class" : manganelo.ManganeloMangaExtractor,
|
||||
},
|
||||
|
||||
)
|
||||
63
test/results/natomanga.py
Normal file
63
test/results/natomanga.py
Normal file
@@ -0,0 +1,63 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# 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
|
||||
# published by the Free Software Foundation.
|
||||
|
||||
from gallery_dl.extractor import manganelo
|
||||
|
||||
|
||||
__tests__ = (
|
||||
{
|
||||
"#url" : "https://www.natomanga.com/manga/danzai-sareta-akuyaku-reijou-wa-gyakkou-shite-kanpeki-na-akujo-wo-mezasu/chapter-4-5",
|
||||
"#category": ("manganelo", "natomanga", "chapter"),
|
||||
"#class" : manganelo.ManganeloChapterExtractor,
|
||||
"#pattern" : r"https://imgs-2.2xstorage.com/danzai-sareta-akuyaku-reijou-wa-gyakkou-shite-kanpeki-na-akujo-wo-mezasu/4\.5/\d+\.webp",
|
||||
"#count" : 24,
|
||||
|
||||
"author" : "NARAYAMA Bakufu",
|
||||
"chapter" : 4,
|
||||
"chapter_id" : 6,
|
||||
"chapter_minor": ".5",
|
||||
"count" : 24,
|
||||
"date" : "dt:2025-04-29 16:08:07",
|
||||
"date_updated" : "dt:2025-04-29 16:08:07",
|
||||
"extension" : "webp",
|
||||
"filename" : str,
|
||||
"lang" : "en",
|
||||
"language" : "English",
|
||||
"manga" : "Danzai sareta Akuyaku Reijou wa, Gyakkou shite Kanpeki na Akujo wo Mezasu",
|
||||
"manga_id" : 32842,
|
||||
"page" : range(1, 24),
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://natomanga.com/manga/aria/chapter-60-2",
|
||||
"#category": ("manganelo", "natomanga", "chapter"),
|
||||
"#class" : manganelo.ManganeloChapterExtractor,
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://www.natomanga.com/manga/aria",
|
||||
"#category": ("manganelo", "natomanga", "manga"),
|
||||
"#class" : manganelo.ManganeloMangaExtractor,
|
||||
"#pattern" : manganelo.ManganeloChapterExtractor.pattern,
|
||||
"#count" : 70,
|
||||
|
||||
"author" : "Amano Kozue",
|
||||
"chapter" : range(1, 60),
|
||||
"chapter_minor": {"", ".1", ".2", ".5"},
|
||||
"date" : "type:datetime",
|
||||
"lang" : "en",
|
||||
"language": "English",
|
||||
"manga" : "Aria",
|
||||
"title" : "",
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://natomanga.com/manga/aria",
|
||||
"#category": ("manganelo", "natomanga", "manga"),
|
||||
"#class" : manganelo.ManganeloMangaExtractor,
|
||||
},
|
||||
|
||||
)
|
||||
63
test/results/nelomanga.py
Normal file
63
test/results/nelomanga.py
Normal file
@@ -0,0 +1,63 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# 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
|
||||
# published by the Free Software Foundation.
|
||||
|
||||
from gallery_dl.extractor import manganelo
|
||||
|
||||
|
||||
__tests__ = (
|
||||
{
|
||||
"#url" : "https://www.nelomanga.net/manga/danzai-sareta-akuyaku-reijou-wa-gyakkou-shite-kanpeki-na-akujo-wo-mezasu/chapter-4-5",
|
||||
"#category": ("manganelo", "nelomanga", "chapter"),
|
||||
"#class" : manganelo.ManganeloChapterExtractor,
|
||||
"#pattern" : r"https://imgs-2.2xstorage.com/danzai-sareta-akuyaku-reijou-wa-gyakkou-shite-kanpeki-na-akujo-wo-mezasu/4\.5/\d+\.webp",
|
||||
"#count" : 24,
|
||||
|
||||
"author" : "NARAYAMA Bakufu",
|
||||
"chapter" : 4,
|
||||
"chapter_id" : 6,
|
||||
"chapter_minor": ".5",
|
||||
"count" : 24,
|
||||
"date" : "",
|
||||
"date_updated" : "",
|
||||
"extension" : "webp",
|
||||
"filename" : str,
|
||||
"lang" : "en",
|
||||
"language" : "English",
|
||||
"manga" : "Danzai sareta Akuyaku Reijou wa, Gyakkou shite Kanpeki na Akujo wo Mezasu",
|
||||
"manga_id" : 32842,
|
||||
"page" : range(1, 24),
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://nelomanga.net/manga/aria/chapter-60-2",
|
||||
"#category": ("manganelo", "nelomanga", "chapter"),
|
||||
"#class" : manganelo.ManganeloChapterExtractor,
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://www.nelomanga.net/manga/aria",
|
||||
"#category": ("manganelo", "nelomanga", "manga"),
|
||||
"#class" : manganelo.ManganeloMangaExtractor,
|
||||
"#pattern" : manganelo.ManganeloChapterExtractor.pattern,
|
||||
"#count" : 70,
|
||||
|
||||
"author" : "Amano Kozue",
|
||||
"chapter" : range(1, 60),
|
||||
"chapter_minor": {"", ".1", ".2", ".5"},
|
||||
"date" : "type:datetime",
|
||||
"lang" : "en",
|
||||
"language": "English",
|
||||
"manga" : "Aria",
|
||||
"title" : "",
|
||||
},
|
||||
|
||||
{
|
||||
"#url" : "https://nelomanga.net/manga/aria",
|
||||
"#category": ("manganelo", "nelomanga", "manga"),
|
||||
"#class" : manganelo.ManganeloMangaExtractor,
|
||||
},
|
||||
|
||||
)
|
||||
Reference in New Issue
Block a user