From 010274e703e6bd25b543a32a60bb160beab095ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Deniz=20=C5=9Eafak?= Date: Wed, 28 May 2025 01:12:38 +0300 Subject: [PATCH] Improved chapter filename generation --- CHANGELOG.md | 1 + abogen/conversion.py | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51e7cba..edfa426 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # v1.0.9 (pre-release) - Added chunking/segmenting system that fixes memory outage issues when processing large audio files. +- Improved chapter filename generation with smart word-boundary truncation at 80 characters, preventing mid-word cuts in filenames. - `Composer` and `Genre` metadata fields for M4B files are now editable from the text editor. # v1.0.8 diff --git a/abogen/conversion.py b/abogen/conversion.py index 7fcf3ce..ff72a8e 100644 --- a/abogen/conversion.py +++ b/abogen/conversion.py @@ -652,12 +652,19 @@ class ConversionThread(QThread): and chapters_out_dir and chapter_audio_segments ): - # Sanitize chapter name for use in filenames - sanitized_chapter_name = re.sub(r"[^\w\-\. ]", "_", chapter_name) - sanitized_chapter_name = re.sub( - r"_+", "_", sanitized_chapter_name - ) # Replace multiple underscores with one - chapter_filename = f"{chapter_idx:02d}_{sanitized_chapter_name}" + + # strip any non‐alphanumeric or space/dash + sanitized = re.sub(r"[^\w\s\-]", "", chapter_name) + # collapse spaces or dashes to single underscore + sanitized = re.sub(r"[\s\-]+", "_", sanitized).strip("_") + # enforce max length + MAX_LEN = 80 + if len(sanitized) > MAX_LEN: + # Find last word boundary before limit + pos = sanitized[:MAX_LEN].rfind("_") + # Use word boundary if found, otherwise use hard limit + sanitized = sanitized[:pos if pos > 0 else MAX_LEN].rstrip("_") + chapter_filename = f"{chapter_idx:02d}_{sanitized}" # Use separate_chapters_format separate_format = getattr(self, 'separate_chapters_format', 'wav')