From 34e402a01dd85d885075c106e7cae051055326c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Thu, 12 Feb 2026 21:37:18 +0100 Subject: [PATCH] [koofr] improve subdirectory handling - re-add 'num' & 'count' --- gallery_dl/extractor/koofr.py | 72 ++++++++++++++++++++--------------- test/results/koofr.py | 10 +++-- 2 files changed, 48 insertions(+), 34 deletions(-) diff --git a/gallery_dl/extractor/koofr.py b/gallery_dl/extractor/koofr.py index 80b0ab5a..6368449b 100644 --- a/gallery_dl/extractor/koofr.py +++ b/gallery_dl/extractor/koofr.py @@ -18,7 +18,7 @@ class KoofrSharedExtractor(Extractor): subcategory = "shared" root = "https://app.koofr.net" directory_fmt = ("{category}", "{post[title]} ({post[id]})", "{path:I}") - filename_fmt = "{filename} ({hash[:8]}).{extension}" + filename_fmt = "{num:>03} {filename} ({hash|id:[:8]}).{extension}" archive_fmt = "{post[id]}_{path:J/}_{hash|id}" pattern = (r"(?:https?://)?(?:" r"(?:app\.)?koofr\.(?:net|eu)/links/([\w-]+)|" @@ -48,10 +48,10 @@ class KoofrSharedExtractor(Extractor): file = data["file"] file["path"] = [] if file["type"] == "dir" and self.config("recursive", True): - files = self._extract_files(file, url + "/bundle", params, headers) + items = self._extract_files(file, url + "/bundle", params, headers) recursive = True else: - files = (file,) + items = ((file, (file,)),) recursive = False post = { @@ -65,42 +65,54 @@ class KoofrSharedExtractor(Extractor): headers = {"Referer": referer} password = "&password=" + text.escape(password) if password else "" - for file in files: - file["post"] = post - file["date"] = self.parse_timestamp(file["modified"] / 1000) - file["_http_headers"] = headers + for dir, files in items: + dir["post"] = post + dir["count"] = count = len(files) + yield Message.Directory, "", dir - name = file["name"] - text.nameext_from_name(name, file) + num = 0 + for file in files: + num += 1 + file["num"] = num + file["count"] = count + file["post"] = post + file["date"] = self.parse_timestamp(file["modified"] / 1000) + file["_http_headers"] = headers - if recursive: - if path := file["path"]: - path = f"{'/'.join(path)}/{name}" + name = file["name"] + text.nameext_from_name(name, file) + + if recursive: + if path := file["path"]: + path = f"{'/'.join(path)}/{name}" + else: + path = name else: - path = name - else: - path = "" - password += "&force" + path = "" + password += "&force" - url = (f"{base}{text.escape(name)}" - f"?path=/{text.escape(path)}{password}") - - yield Message.Directory, "", file - yield Message.Url, url, file + url = (f"{base}{text.escape(name)}" + f"?path=/{text.escape(path)}{password}") + yield Message.Url, url, file def _extract_files(self, dir, url, params, headers): path = dir["path"] params["path"] = "/" + "/".join(path) - files = self.request_json( + items = self.request_json( url, params=params, headers=headers)["files"] - for file in files: - if file["type"] == "dir": - file["path"] = path.copy() - file["path"].append(file["name"]) - yield from self._extract_files( - file, url, params.copy(), headers) + dirs = [] + files = [] + for item in items: + if item["type"] == "dir": + item["path"] = path.copy() + item["path"].append(item["name"]) + dirs.append(item) else: - file["path"] = path - yield file + item["path"] = path + files.append(item) + + yield dir, files + for sub in dirs: + yield from self._extract_files(sub, url, params.copy(), headers) diff --git a/test/results/koofr.py b/test/results/koofr.py index 77b976ec..ce192e9e 100644 --- a/test/results/koofr.py +++ b/test/results/koofr.py @@ -56,8 +56,8 @@ __tests__ = ( "#count" : 18, "contentType": "application/octet-stream", - "!count" : 18, - "!num" : range(1, 18), + "count" : 18, + "num" : range(1, 18), "date" : "type:datetime", "extension" : "pcm", "filename" : r"re:smw_msu1-\d+", @@ -83,8 +83,8 @@ __tests__ = ( "#results" : "https://app.koofr.net/content/links/01deac62-f5d6-4d2b-7043-53b24cc0a038/files/get/Church of Kondo?path=/&force", "contentType": "", - "!count" : 1, - "!num" : 1, + "count" : 1, + "num" : 1, "date" : "dt:2023-11-19 16:27:56", "extension" : "", "filename" : "Church of Kondo", @@ -109,6 +109,8 @@ __tests__ = ( "#count" : 16, "contentType": "image/png", + "count" : 4, + "num" : range(1, 4), "date" : "type:datetime", "extension" : "png", "filename" : r"re:^[1-8a-d]$",