Path: blob/master/gallery_dl/extractor/dankefuerslesen.py
5399 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"151617class DankefuerslesenBase():18"""Base class for dankefuerslesen extractors"""19category = "dankefuerslesen"20root = "https://danke.moe"2122@memcache(keyarg=1)23def _manga_info(self, slug):24url = f"{self.root}/api/series/{slug}/"25return self.request_json(url)262728class DankefuerslesenChapterExtractor(DankefuerslesenBase, ChapterExtractor):29"""Extractor for Danke fürs Lesen manga chapters"""30pattern = BASE_PATTERN + r"/read/manga/([\w-]+)/([\w-]+)"31example = "https://danke.moe/read/manga/TITLE/123/1/"3233def _init(self):34self.zip = self.config("zip", False)35if self.zip:36self.filename_fmt = f"{self.directory_fmt[-1]}.{{extension}}"37self.directory_fmt = self.directory_fmt[:-1]3839def metadata(self, page):40slug, ch = self.groups41manga = self._manga_info(slug)4243if "-" in ch:44chapter, sep, minor = ch.rpartition("-")45ch = ch.replace("-", ".")46minor = "." + minor47else:48chapter = ch49minor = ""5051data = manga["chapters"][ch]52group_id, self._files = next(iter(data["groups"].items()))5354if not self.zip:55self.base = (f"{self.root}/media/manga/{slug}/chapters"56f"/{data['folder']}/{group_id}/")5758return {59"manga" : manga["title"],60"manga_slug": manga["slug"],61"author" : manga["author"],62"artist" : manga["artist"],63"description": manga["description"],64"title" : data["title"],65"volume" : text.parse_int(data["volume"]),66"chapter" : text.parse_int(chapter),67"chapter_minor": minor,68"group" : manga["groups"][group_id].split(" & "),69"group_id" : text.parse_int(group_id),70"date" : text.parse_timestamp(data["release_date"][group_id]),71"lang" : util.NONE,72"language" : util.NONE,73}7475def images(self, page):76if self.zip:77return ()7879base = self.base80return [(base + file, None) for file in self._files]8182def assets(self, page):83if self.zip:84slug, ch = self.groups85url = f"{self.root}/api/download_chapter/{slug}/{ch}/"86return ({87"type" : "archive",88"extension": "zip",89"url" : url,90},)919293class DankefuerslesenMangaExtractor(DankefuerslesenBase, MangaExtractor):94"""Extractor for Danke fürs Lesen manga"""95chapterclass = DankefuerslesenChapterExtractor96reverse = False97pattern = BASE_PATTERN + r"/read/manga/([^/?#]+)"98example = "https://danke.moe/read/manga/TITLE/"99100def chapters(self, page):101results = []102103manga = self._manga_info(self.groups[0]).copy()104manga["lang"] = util.NONE105manga["language"] = util.NONE106107base = f"{self.root}/read/manga/{manga['slug']}/"108for ch, data in manga.pop("chapters").items():109110if "." in ch:111chapter, sep, minor = ch.rpartition(".")112ch = ch.replace('.', '-')113data["chapter"] = text.parse_int(chapter)114data["chapter_minor"] = sep + minor115else:116data["chapter"] = text.parse_int(ch)117data["chapter_minor"] = ""118119results.append((f"{base}{ch}/1/", {**manga, **data}))120121return results122123124