diff --git a/docs/supportedsites.md b/docs/supportedsites.md index d6e6b64c..2849948b 100644 --- a/docs/supportedsites.md +++ b/docs/supportedsites.md @@ -223,6 +223,12 @@ Consider all listed sites to potentially be NSFW. Files, Folders + + Dandadan + https://dandadan.net/ + Chapters, Manga + + Danke fürs Lesen https://danke.moe/ diff --git a/gallery_dl/extractor/__init__.py b/gallery_dl/extractor/__init__.py index a3df6342..c7e33c80 100644 --- a/gallery_dl/extractor/__init__.py +++ b/gallery_dl/extractor/__init__.py @@ -47,6 +47,7 @@ modules = [ "cyberdrop", "cyberfile", "danbooru", + "dandadan", "dankefuerslesen", "desktopography", "deviantart", diff --git a/gallery_dl/extractor/dandadan.py b/gallery_dl/extractor/dandadan.py new file mode 100644 index 00000000..48dc0b7c --- /dev/null +++ b/gallery_dl/extractor/dandadan.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- + +# Copyright 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://dandadan.net/""" + +from .common import ChapterExtractor, MangaExtractor +from .. import text + +BASE_PATTERN = r"(?:https?://)?(?:www\.)?dandadan\.net" + + +class DandadanBase(): + """Base class for dandadan extractors""" + category = "dandadan" + root = "https://dandadan.net" + + +class DandadanChapterExtractor(DandadanBase, ChapterExtractor): + """Extractor for dandadan manga chapters""" + pattern = rf"{BASE_PATTERN}(/manga/dandadan-chapter-([^/?#]+)/?)" + example = "https://dandadan.net/manga/dandadan-chapter-123/" + + def metadata(self, page): + chapter, sep, minor = text.extr( + page, "hapter ", " - ").partition(".") + return { + "manga" : "Dandadan", + "chapter" : text.parse_int(chapter), + "chapter_minor": f"{sep}{minor}", + "lang" : "en", + } + + def images(self, page): + images = [ + (text.extr(figure, 'src="', '"'), None) + for figure in text.extract_iter(page, "") + ] + + if images: + return images + + return [ + (src, None) + for src in text.extract_iter( + page, '") + ] diff --git a/test/results/dandadan.py b/test/results/dandadan.py new file mode 100644 index 00000000..cc987d87 --- /dev/null +++ b/test/results/dandadan.py @@ -0,0 +1,51 @@ +# -*- 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 dandadan + + +__tests__ = ( +{ + "#url" : "https://dandadan.net/manga/dandadan-chapter-1/", + "#class" : dandadan.DandadanChapterExtractor, + "#pattern" : r"https://cdn\.readkakegurui\.com/file/cdnpog/dandadan/chapter\-1/\d+\.webp", + "#count" : 67, + + "chapter" : 1, + "count" : 67, + "page" : range(1, 67), + "extension": "webp", + "lang" : "en", + "manga" : "Dandadan", +}, + +{ + "#url" : "https://dandadan.net/manga/dandadan-chapter-40-5-3/", + "#class" : dandadan.DandadanChapterExtractor, + "#pattern" : r"https://cdn\.readkakegurui\.com/file/cdnpog/dandadan/chapter\-40\.5/\d+\.webp", + "#count" : 35, + + "chapter" : 40, + "chapter_minor": ".5", +}, + +{ + "#url" : "https://dandadan.net/manga/dandadan-chapter-203/", + "#class" : dandadan.DandadanChapterExtractor, + "#pattern" : r"https://pic\.readkakegurui\.com/file/sancdn/dandadan/chapter\-203/\d+\.webp", + "#count" : 22, + + "chapter": 203, +}, + +{ + "#url" : "https://dandadan.net/", + "#class" : dandadan.DandadanMangaExtractor, + "#pattern" : dandadan.DandadanChapterExtractor.pattern, + "#count" : range(210, 300), +}, + +)