Path: blob/master/gallery_dl/extractor/dankefuerslesen.py
9006 views
# -*- coding: utf-8 -*-12# Copyright 2025 Mike Fährmann3#4# This program is free software; you can redistribute it and/or modify5# it under the terms of the GNU General Public License version 2 as6# published by the Free Software Foundation.78"""Extractors for https://danke.moe/"""910from .common import ChapterExtractor, MangaExtractor11from .. import text, util12from ..cache import memcache1314BASE_PATTERN = r"(?:https?://)?(?:www\.)?danke\.moe"15MANGA_PATTERN = BASE_PATTERN + r"/read(?:er)?/(?:manga|series)/([\w-]+)"161718class DankefuerslesenBase():19"""Base class for dankefuerslesen extractors"""20category = "dankefuerslesen"21root = "https://danke.moe"2223@memcache(keyarg=1)24def _manga_info(self, slug):25url = f"{self.root}/api/series/{slug}/"26return self.request_json(url)272829class DankefuerslesenChapterExtractor(DankefuerslesenBase, ChapterExtractor):30"""Extractor for Danke fürs Lesen manga chapters"""31pattern = MANGA_PATTERN + r"/([\w-]+)"32example = "https://danke.moe/read/manga/TITLE/123/1/"3334def _init(self):35self.zip = self.config("zip", False)36if self.zip:37self.filename_fmt = self.directory_fmt[-1] + ".{extension}"38self.directory_fmt = self.directory_fmt[:-1]3940def metadata(self, page):41slug, ch = self.groups42manga = self._manga_info(slug)4344if "-" in ch:45chapter, sep, minor = ch.rpartition("-")46ch = ch.replace("-", ".")47minor = "." + minor48else:49chapter = ch50minor = ""5152data = manga["chapters"][ch]53group_id, self._files = next(iter(data["groups"].items()))5455if not self.zip:56self.base = (f"{self.root}/media/manga/{slug}/chapters"57f"/{data['folder']}/{group_id}/")5859return {60"manga" : manga["title"],61"manga_slug": manga["slug"],62"author" : manga["author"],63"artist" : manga["artist"],64"description": manga["description"],65"title" : data["title"],66"volume" : text.parse_int(data["volume"]),67"chapter" : text.parse_int(chapter),68"chapter_minor": minor,69"group" : manga["groups"][group_id].split(" & "),70"group_id" : text.parse_int(group_id),71"date" : self.parse_timestamp(data["release_date"][group_id]),72"lang" : util.NONE,73"language" : util.NONE,74}7576def images(self, page):77if self.zip:78return ()7980base = self.base81return [(base + file, None) for file in self._files]8283def assets(self, page):84if self.zip:85slug, ch = self.groups86url = f"{self.root}/api/download_chapter/{slug}/{ch}/"87return ({88"type" : "archive",89"extension": "zip",90"url" : url,91},)929394class DankefuerslesenMangaExtractor(DankefuerslesenBase, MangaExtractor):95"""Extractor for Danke fürs Lesen manga"""96chapterclass = DankefuerslesenChapterExtractor97reverse = False98pattern = MANGA_PATTERN99example = "https://danke.moe/read/manga/TITLE/"100101def chapters(self, page):102results = []103104manga = self._manga_info(self.groups[0]).copy()105manga["lang"] = util.NONE106manga["language"] = util.NONE107108base = f"{self.root}/read/manga/{manga['slug']}/"109for ch, data in manga.pop("chapters").items():110111if "." in ch:112chapter, sep, minor = ch.rpartition(".")113ch = ch.replace('.', '-')114data["chapter"] = text.parse_int(chapter)115data["chapter_minor"] = sep + minor116else:117data["chapter"] = text.parse_int(ch)118data["chapter_minor"] = ""119120results.append((f"{base}{ch}/1/", {**manga, **data}))121122return results123124125