From 9be8f7e1062660c0850bd818ce7bc0f15902e0f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Wed, 12 Jul 2017 17:05:31 +0200 Subject: [PATCH] [deviantart] add "extractor.deviantart.flat" option Setting this to 'false' downloads images into individual subdirectories for each gallery-folder or favourite-collection, otherwise it is just creating a flat list of images. --- docs/configuration.rst | 18 +++++++++++++++- gallery_dl/extractor/deviantart.py | 34 ++++++++++++++++++++---------- 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/docs/configuration.rst b/docs/configuration.rst index a8f82209..a7d5790a 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -242,6 +242,22 @@ Description The password belonging to the username. Extractor-specific Options ========================== +extractor.deviantart.flat +------------------------- +=========== ===== +Type ``bool`` +Default ``true`` +Description Select the directory structure created by the Gallery- and + Favorite-Extractors. + + * ``true``: Use a flat directory structure. + * ``false``: Collect a list of all gallery-folders or + favorites-collections and defere any further work to other + extractors (``folder`` or ``collection``), which will then + create individual subdirectories for each of them. +=========== ===== + + extractor.deviantart.mature --------------------------- =========== ===== @@ -261,7 +277,7 @@ extractor.exhentai.original Type ``bool`` Default ``true`` Description | Always download the original image or - | download the down-sampled version for larger images. + | download the down-sampled version of larger images. =========== ===== diff --git a/gallery_dl/extractor/deviantart.py b/gallery_dl/extractor/deviantart.py index 39d3cc8e..56727fd1 100644 --- a/gallery_dl/extractor/deviantart.py +++ b/gallery_dl/extractor/deviantart.py @@ -135,6 +135,10 @@ class DeviantartExtractor(Extractor): deviation["extension"] = "htm" return Message.Url, html, deviation + @property + def flat(self): + return self.config("flat", True) + @staticmethod def _find_folder(folders, name): regex = re.compile("[^\w]*" + name.replace("-", "[^\w]+") + "[^\w]*$") @@ -143,6 +147,13 @@ class DeviantartExtractor(Extractor): return folder raise exception.NotFoundError("folder") + def _folder_urls(self, folders, category): + urlfmt = "https://{}.deviantart.com/{}/0/{}" + return [ + urlfmt.format(self.user, category, folder["name"]) + for folder in folders + ] + class DeviantartGalleryExtractor(DeviantartExtractor): """Extractor for all deviations from an artist's gallery""" @@ -154,21 +165,18 @@ class DeviantartGalleryExtractor(DeviantartExtractor): "url": "63bfa8efba199e27181943c9060f6770f91a8441", "keyword": "9342c2a7a2bd6eb9f4a6ea539d04d75248ebe05f", }), - ("http://shimoda7.deviantart.com/gallery/?catpath=/", None), ("https://yakuzafc.deviantart.com/", { "url": "fa6ecb2c3aa78872f762d43f7809b7f0580debc1", }), + ("http://shimoda7.deviantart.com/gallery/?catpath=/", None), ] def deviations(self): - if self.api.user_profile(self.user): + if self.api.user_profile(self.user) and self.flat: return self.api.gallery_all(self.user, self.offset) else: - urlfmt = "https://{}.deviantart.com/gallery/0/{}" - return [ - urlfmt.format(self.user, folder["name"]) - for folder in self.api.gallery_folders(self.user) - ] + folders = self.api.gallery_folders(self.user) + return self._folder_urls(folders, "gallery") class DeviantartFolderExtractor(DeviantartExtractor): @@ -257,10 +265,14 @@ class DeviantartFavoriteExtractor(DeviantartExtractor): ] def deviations(self): - return itertools.chain.from_iterable([ - self.api.collections(self.user, folder["folderid"]) - for folder in self.api.collections_folders(self.user) - ]) + folders = self.api.collections_folders(self.user) + if self.flat: + return itertools.chain.from_iterable([ + self.api.collections(self.user, folder["folderid"]) + for folder in folders + ]) + else: + return self._folder_urls(folders, "favourites") class DeviantartCollectionExtractor(DeviantartExtractor):