From c3d8602418b057496e5e9ce4afb78c59469d0cbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Thu, 18 Dec 2025 09:53:26 +0100 Subject: [PATCH] [path] implement dynamic length directories (#1350) append directory segments for each item of a list (or general non-string iterable), which can be returned with the 'I' specifier --- gallery_dl/extractor/aryion.py | 2 +- gallery_dl/extractor/bbc.py | 3 +-- gallery_dl/path.py | 20 ++++++++++++++------ 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/gallery_dl/extractor/aryion.py b/gallery_dl/extractor/aryion.py index 57cf27e5..e6542660 100644 --- a/gallery_dl/extractor/aryion.py +++ b/gallery_dl/extractor/aryion.py @@ -19,7 +19,7 @@ BASE_PATTERN = r"(?:https?://)?(?:www\.)?aryion\.com/g4" class AryionExtractor(Extractor): """Base class for aryion extractors""" category = "aryion" - directory_fmt = ("{category}", "{user!l}", "{path:J - }") + directory_fmt = ("{category}", "{user!l}", "{path:I}") filename_fmt = "{id} {title}.{extension}" archive_fmt = "{id}" cookies_domain = ".aryion.com" diff --git a/gallery_dl/extractor/bbc.py b/gallery_dl/extractor/bbc.py index c37c629a..cb357d1c 100644 --- a/gallery_dl/extractor/bbc.py +++ b/gallery_dl/extractor/bbc.py @@ -18,8 +18,7 @@ class BbcGalleryExtractor(GalleryExtractor): """Extractor for a programme gallery on bbc.co.uk""" category = "bbc" root = "https://www.bbc.co.uk" - directory_fmt = ("{category}", "{path[0]}", "{path[1]}", "{path[2]}", - "{path[3:]:J - /}") + directory_fmt = ("{category}", "{path:I}") filename_fmt = "{num:>02}.{extension}" archive_fmt = "{programme}_{num}" pattern = rf"{BASE_PATTERN}[^/?#]+(?!/galleries)(?:/[^/?#]+)?)$" diff --git a/gallery_dl/path.py b/gallery_dl/path.py index 0b1a5b50..be2dcc97 100644 --- a/gallery_dl/path.py +++ b/gallery_dl/path.py @@ -282,12 +282,20 @@ class PathFormat(): segments = [] strip = self.strip for fmt in formatters: - segment = fmt(kwdict).strip() - if strip and segment not in {".", ".."}: - # remove trailing dots and spaces (#647) - segment = segment.rstrip(strip) - if segment: - segments.append(self.clean_segment(segment)) + segment = fmt(kwdict) + if segment.__class__ is str: + segment = segment.strip() + if strip and segment not in {".", ".."}: + segment = segment.rstrip(strip) + if segment: + segments.append(self.clean_segment(segment)) + else: # assume list + for segment in segment: + segment = segment.strip() + if strip and segment not in {".", ".."}: + segment = segment.rstrip(strip) + if segment: + segments.append(self.clean_segment(segment)) return segments except Exception as exc: raise exception.DirectoryFormatError(exc)