From cf836b45281f5371a92953ea0b6d9bf107ad40be Mon Sep 17 00:00:00 2001 From: dschlueter Date: Wed, 18 Feb 2026 23:25:26 +0100 Subject: [PATCH] Fix filename: omit empty artist suffix, sanitize single quotes Regular (non-compilation) tracks had an empty artist producing trailing '_-_.flac'. Now artist suffix is only appended when non-empty. Also added single quote to _sanitize_name's removed characters. Co-Authored-By: Claude Opus 4.6 --- src/musiksammlung/ripper.py | 14 +++++++++----- tests/test_ripper.py | 8 ++++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/musiksammlung/ripper.py b/src/musiksammlung/ripper.py index 690455d..e623e85 100644 --- a/src/musiksammlung/ripper.py +++ b/src/musiksammlung/ripper.py @@ -63,7 +63,7 @@ def _sanitize_name(name: str) -> str: Cleaned name (spaces -> underscores) """ name = name.replace(" ", "_") - name = re.sub(r'[<>:"/\\|?*]', "", name) + name = re.sub(r'[<>:"\'/\\|?*]', "", name) name = name.strip("_") return name @@ -323,10 +323,14 @@ def _rename_files( num = int(m.group(1)) track = by_num.get(num) if track: - new_name = ( - f"{num:02d}_-_{_sanitize_name(track.title)}_-_" - f"{_sanitize_name(track.artist)}{audio_format.extension}" - ) + safe_title = _sanitize_name(track.title) + if track.artist: + new_name = ( + f"{num:02d}_-_{safe_title}_-_" + f"{_sanitize_name(track.artist)}{audio_format.extension}" + ) + else: + new_name = f"{num:02d}_-_{safe_title}{audio_format.extension}" else: new_name = f"{num:02d}{audio_format.extension}" diff --git a/tests/test_ripper.py b/tests/test_ripper.py index ffb1bde..ec4f90e 100644 --- a/tests/test_ripper.py +++ b/tests/test_ripper.py @@ -28,6 +28,7 @@ class TestSanitizeName: assert _sanitize_name("Test/Track:Name") == "TestTrackName" assert _sanitize_name('Test"Name') == "TestTrackName" assert _sanitize_name("Test|Track?Name*") == "TestTrackName" + assert _sanitize_name("It's_a_Test") == "Its_a_Test" def test_keep_umlauts(self) -> None: assert _sanitize_name("Grüße aus Österreich") == "Grüße_aus_Österreich" @@ -282,6 +283,13 @@ class TestRenameFiles: _rename_files(tmp_path, tracks, AudioFormat.FLAC) assert (tmp_path / "01_-_My_Title_-_Art_ist.flac").exists() + def test_regular_track_without_artist(self, tmp_path: Path) -> None: + """Reguläre Tracks (artist='') → kein '_-_Artist'-Suffix.""" + (tmp_path / "track01.flac").touch() + tracks = [TrackInfo(1, "", "Allegro con brio")] + _rename_files(tmp_path, tracks, AudioFormat.FLAC) + assert (tmp_path / "01_-_Allegro_con_brio.flac").exists() + # --------------------------------------------------------------------------- # interactive_rip – EAN/Barcode-Integration