From 92e3da6b826499f67a17fade0d1773f48b30e87a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Reuh=20Fildadut?= Date: Thu, 9 Oct 2025 14:48:34 +0200 Subject: [PATCH] feat: make max filename configurable --- config.default.toml | 2 ++ main.py | 26 +++++++++++++++++--------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/config.default.toml b/config.default.toml index dc8b491..9a28f71 100644 --- a/config.default.toml +++ b/config.default.toml @@ -14,6 +14,8 @@ items_per_request = 500 data = "data" # Directory path where the user-facing files will be stored. reader = "reader" +# Maximum allowed filename length before ellipsing +max_filename_length = 200 [time] # Which timezone to use when writing date and time. diff --git a/main.py b/main.py index 8ef583d..4129de0 100644 --- a/main.py +++ b/main.py @@ -36,12 +36,13 @@ class Config: # Get config fields self.html_root: Path = Path(get_config("directories", "reader")) self.json_root: Path = Path(get_config("directories", "data")) - self.server_url: str = get_config("server", "url", False) - self.server_user: str = get_config("server", "user", False) - self.server_password: str = get_config("server", "password", False) + self.max_filename_length: int = int(get_config("directories", "max_filename_length")) + self.server_url: str = str(get_config("server", "url", False)) + self.server_user: str = str(get_config("server", "user", False)) + self.server_password: str = str(get_config("server", "password", False)) self.items_per_query: int = int(get_config("server", "items_per_request")) self.timezone: ZoneInfo = ZoneInfo(get_config("time", "timezone")) - self.time_format: str = get_config("time", "format") + self.time_format: str = str(get_config("time", "format")) # Computed config fields self.update_lock = self.json_root / "update.lock" @@ -105,13 +106,20 @@ def mark_deleted_as_read(config, client_session): print(f"Marked {marked_as_read} items as read") +def escape_filename(filename): + return filename.replace("/", "-") + def get_html_path(config, item_json): - html_directory = config.html_root / item_json["folder"].replace("/", "-") - html_directory.mkdir(exist_ok=True) + max_filename_length = config.max_filename_length + + folder_directory = config.html_root / escape_filename(item_json["folder"]) + folder_directory.mkdir(exist_ok=True) + datetime_published = datetime.fromtimestamp(item_json["published"], config.timezone).strftime(config.time_format) - html_name = f"{datetime_published}\t[{item_json["origin_title"]}]\t{item_json["title"]}.html".replace("/", "-") - html_name = html_name[:200] + '...html' if len(html_name) > 200 else html_name - html_path = html_directory / html_name + html_name = escape_filename(f"{datetime_published}\t[{item_json["origin_title"]}]\t{item_json["title"]}.html") + html_name = html_name[:max_filename_length] + '….html' if len(html_name) > max_filename_length else html_name + + html_path = folder_directory / html_name return html_path def synchronize_with_server(config, client_session):