From e69ee41f25d11eaf3a95e2f8060d2d768d3f71dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Sat, 18 Sep 2021 02:15:42 +0200 Subject: [PATCH] implement 'page-reverse' option (#1854) --- docs/configuration.rst | 9 +++++++++ gallery_dl/extractor/common.py | 17 ++++++++++++----- gallery_dl/extractor/foolslide.py | 4 +++- gallery_dl/extractor/mangadex.py | 5 ++++- gallery_dl/util.py | 11 +++++++++++ 5 files changed, 39 insertions(+), 7 deletions(-) diff --git a/docs/configuration.rst b/docs/configuration.rst index 65e6430c..b8bfe6e4 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -2262,6 +2262,15 @@ Description * ``false``: Start with the first chapter +extractor.[manga-extractor].page-reverse +---------------------------------------- +Type + ``bool`` +Default + ``false`` +Description + Download manga chapter pages in reverse order. + Downloader Options ================== diff --git a/gallery_dl/extractor/common.py b/gallery_dl/extractor/common.py index d54ef48f..4f42477b 100644 --- a/gallery_dl/extractor/common.py +++ b/gallery_dl/extractor/common.py @@ -447,16 +447,23 @@ class GalleryExtractor(Extractor): imgs = self.images(page) if "count" in data: - images = zip( - range(1, data["count"]+1), - imgs, - ) + if self.config("page-reverse"): + images = util.enumerate_reversed(imgs, 1, data["count"]) + else: + images = zip( + range(1, data["count"]+1), + imgs, + ) else: + enum = enumerate try: data["count"] = len(imgs) except TypeError: pass - images = enumerate(imgs, 1) + else: + if self.config("page-reverse"): + enum = util.enumerate_reversed + images = enum(imgs, 1) yield Message.Directory, data for data[self.enum], (url, imgdata) in images: diff --git a/gallery_dl/extractor/foolslide.py b/gallery_dl/extractor/foolslide.py index a1470dcc..c09eb969 100644 --- a/gallery_dl/extractor/foolslide.py +++ b/gallery_dl/extractor/foolslide.py @@ -88,7 +88,9 @@ class FoolslideChapterExtractor(FoolslideExtractor): data["chapter_id"] = text.parse_int(imgs[0]["chapter_id"]) yield Message.Directory, data - for data["page"], image in enumerate(imgs, 1): + enum = util.enumerate_reversed if self.config( + "page-reverse") else enumerate + for data["page"], image in enum(imgs, 1): try: url = image["url"] del image["url"] diff --git a/gallery_dl/extractor/mangadex.py b/gallery_dl/extractor/mangadex.py index 1f577127..93bc3f34 100644 --- a/gallery_dl/extractor/mangadex.py +++ b/gallery_dl/extractor/mangadex.py @@ -122,7 +122,10 @@ class MangadexChapterExtractor(MangadexExtractor): data["_http_headers"] = self._headers base = "{}/data/{}/".format( self.api.athome_server(self.uuid)["baseUrl"], cattributes["hash"]) - for data["page"], page in enumerate(cattributes["data"], 1): + + enum = util.enumerate_reversed if self.config( + "page-reverse") else enumerate + for data["page"], page in enum(cattributes["data"], 1): text.nameext_from_url(page, data) yield Message.Url, base + page, data diff --git a/gallery_dl/util.py b/gallery_dl/util.py index 1842ff97..ef0de465 100644 --- a/gallery_dl/util.py +++ b/gallery_dl/util.py @@ -139,6 +139,17 @@ def delete_items(obj, keys): del obj[key] +def enumerate_reversed(iterable, start=0, length=None): + """Enumerate 'iterable' and return its elements in reverse order""" + start -= 1 + if length is None: + length = len(iterable) + return zip( + range(length - start, start, -1), + reversed(iterable), + ) + + def number_to_string(value, numbers=(int, float)): """Convert numbers (int, float) to string; Return everything else as is.""" return str(value) if value.__class__ in numbers else value