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),
+},
+
+)