Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
mikf
GitHub Repository: mikf/gallery-dl
Path: blob/master/gallery_dl/extractor/dankefuerslesen.py
9006 views
1
# -*- coding: utf-8 -*-
2
3
# Copyright 2025 Mike Fährmann
4
#
5
# This program is free software; you can redistribute it and/or modify
6
# it under the terms of the GNU General Public License version 2 as
7
# published by the Free Software Foundation.
8
9
"""Extractors for https://danke.moe/"""
10
11
from .common import ChapterExtractor, MangaExtractor
12
from .. import text, util
13
from ..cache import memcache
14
15
BASE_PATTERN = r"(?:https?://)?(?:www\.)?danke\.moe"
16
MANGA_PATTERN = BASE_PATTERN + r"/read(?:er)?/(?:manga|series)/([\w-]+)"
17
18
19
class DankefuerslesenBase():
20
"""Base class for dankefuerslesen extractors"""
21
category = "dankefuerslesen"
22
root = "https://danke.moe"
23
24
@memcache(keyarg=1)
25
def _manga_info(self, slug):
26
url = f"{self.root}/api/series/{slug}/"
27
return self.request_json(url)
28
29
30
class DankefuerslesenChapterExtractor(DankefuerslesenBase, ChapterExtractor):
31
"""Extractor for Danke fürs Lesen manga chapters"""
32
pattern = MANGA_PATTERN + r"/([\w-]+)"
33
example = "https://danke.moe/read/manga/TITLE/123/1/"
34
35
def _init(self):
36
self.zip = self.config("zip", False)
37
if self.zip:
38
self.filename_fmt = self.directory_fmt[-1] + ".{extension}"
39
self.directory_fmt = self.directory_fmt[:-1]
40
41
def metadata(self, page):
42
slug, ch = self.groups
43
manga = self._manga_info(slug)
44
45
if "-" in ch:
46
chapter, sep, minor = ch.rpartition("-")
47
ch = ch.replace("-", ".")
48
minor = "." + minor
49
else:
50
chapter = ch
51
minor = ""
52
53
data = manga["chapters"][ch]
54
group_id, self._files = next(iter(data["groups"].items()))
55
56
if not self.zip:
57
self.base = (f"{self.root}/media/manga/{slug}/chapters"
58
f"/{data['folder']}/{group_id}/")
59
60
return {
61
"manga" : manga["title"],
62
"manga_slug": manga["slug"],
63
"author" : manga["author"],
64
"artist" : manga["artist"],
65
"description": manga["description"],
66
"title" : data["title"],
67
"volume" : text.parse_int(data["volume"]),
68
"chapter" : text.parse_int(chapter),
69
"chapter_minor": minor,
70
"group" : manga["groups"][group_id].split(" & "),
71
"group_id" : text.parse_int(group_id),
72
"date" : self.parse_timestamp(data["release_date"][group_id]),
73
"lang" : util.NONE,
74
"language" : util.NONE,
75
}
76
77
def images(self, page):
78
if self.zip:
79
return ()
80
81
base = self.base
82
return [(base + file, None) for file in self._files]
83
84
def assets(self, page):
85
if self.zip:
86
slug, ch = self.groups
87
url = f"{self.root}/api/download_chapter/{slug}/{ch}/"
88
return ({
89
"type" : "archive",
90
"extension": "zip",
91
"url" : url,
92
},)
93
94
95
class DankefuerslesenMangaExtractor(DankefuerslesenBase, MangaExtractor):
96
"""Extractor for Danke fürs Lesen manga"""
97
chapterclass = DankefuerslesenChapterExtractor
98
reverse = False
99
pattern = MANGA_PATTERN
100
example = "https://danke.moe/read/manga/TITLE/"
101
102
def chapters(self, page):
103
results = []
104
105
manga = self._manga_info(self.groups[0]).copy()
106
manga["lang"] = util.NONE
107
manga["language"] = util.NONE
108
109
base = f"{self.root}/read/manga/{manga['slug']}/"
110
for ch, data in manga.pop("chapters").items():
111
112
if "." in ch:
113
chapter, sep, minor = ch.rpartition(".")
114
ch = ch.replace('.', '-')
115
data["chapter"] = text.parse_int(chapter)
116
data["chapter_minor"] = sep + minor
117
else:
118
data["chapter"] = text.parse_int(ch)
119
data["chapter_minor"] = ""
120
121
results.append((f"{base}{ch}/1/", {**manga, **data}))
122
123
return results
124
125