[manganelo] support 'nelomanga.net' and mirror domains (#7423)

- natomanga.com
- nelomanga.net
- manganato.gg
- mangakakalot.gg
This commit is contained in:
Mike Fährmann
2025-04-28 22:12:19 +02:00
parent 5fa1e13866
commit 7b2bcf68a5
10 changed files with 355 additions and 309 deletions

View File

@@ -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>

View File

@@ -105,7 +105,6 @@ modules = [
"mangadex",
"mangafox",
"mangahere",
"mangakakalot",
"manganelo",
"mangapark",
"mangaread",

View File

@@ -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

View File

@@ -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

View File

@@ -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",

View File

@@ -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
View 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,
},
)

View File

@@ -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
View 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
View 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,
},
)