From 5eac4598f5681d34ff9b42bd6afac7a361245324 Mon Sep 17 00:00:00 2001 From: oskvr37 Date: Thu, 23 Jan 2025 19:26:03 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20#68=20#69?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_utils.py | 19 ++++++----------- tiddl/utils.py | 52 ++++++++++++++++++++++----------------------- 2 files changed, 32 insertions(+), 39 deletions(-) diff --git a/tests/test_utils.py b/tests/test_utils.py index 34d8d2b..24e5aeb 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -108,28 +108,23 @@ class TestFormatTrack(unittest.TestCase): ("{album}", "Konnichiwa"), ("{number}", "9"), ("{disc}", "1"), - ("{date}", "11-15-16"), + ("{date:%m-%d-%y}", "11-15-16"), + ("{date:%Y}", "2016"), ("{year}", "2016"), ("{playlist_number}", ""), ("{bpm}", "69"), ("{quality}", "high"), ("{artist}/{album}/{title}", "Skepta/Konnichiwa/Shutdown"), + ("{number:02d}. {title}", "09. Shutdown"), ] for template, expected_result in test_cases: - result = formatTrack(template, self.track) - self.assertEqual(result, expected_result) + with self.subTest(template=template, expected_result=expected_result): + result = formatTrack(template, self.track) + self.assertEqual(result, expected_result) def test_invalid_characters(self): - test_cases = [ - "\\", - ":", - '"', - "?", - "<", - ">", - "|", - ] + test_cases = ["\\", ":", '"', "?", "<", ">", "|", "{number}:{title}"] for template in test_cases: with self.subTest(template=template): diff --git a/tiddl/utils.py b/tiddl/utils.py index b6ba52e..913543b 100644 --- a/tiddl/utils.py +++ b/tiddl/utils.py @@ -47,44 +47,42 @@ def sanitizeString(string: str) -> str: return re.sub(pattern, "", string) -def formatTrack(template: str, track: Track, date_format="%x") -> str: - disallowed_chars = r'[\\:"*?<>|]+' - invalid_chars = re.findall(disallowed_chars, template) - - if invalid_chars: - raise ValueError( - f"Template '{template}' contains disallowed characters: {' '.join(sorted(set(invalid_chars)))}" - ) - - artist = track.artist.name if track.artist else "" +def formatTrack(template: str, track: Track, album_artist="", playlist_title="") -> str: + artist = sanitizeString(track.artist.name) if track.artist else "" features = [ - track_artist.name + sanitizeString(track_artist.name) for track_artist in track.artists if track_artist.name != artist ] - track_dict: dict[str, str] = { + track_dict = { "id": str(track.id), - "title": track.title, - "version": track.version or "", + "title": sanitizeString(track.title), + "version": sanitizeString(track.version or ""), "artist": artist, "artists": ", ".join(features + [artist]), "features": ", ".join(features), - "album": track.album.title, - "number": str(track.trackNumber), - "disc": str(track.volumeNumber), - "date": ( - track.streamStartDate.strftime(date_format).replace("/", "-") - if track.streamStartDate - else "" - ), + "album": sanitizeString(track.album.title), + "number": track.trackNumber, + "disc": track.volumeNumber, + "date": (track.streamStartDate if track.streamStartDate else ""), + # i think we can remove year as we are able to format date "year": track.streamStartDate.strftime("%Y") if track.streamStartDate else "", - "playlist_number": str(track.playlistNumber or ""), - "bpm": str(track.bpm or ""), + "playlist": sanitizeString(playlist_title), + "bpm": track.bpm or "", "quality": QUALITY_TO_ARG[track.audioQuality], + "album_artist": sanitizeString(album_artist), + "playlist_number": track.playlistNumber or "", } - for key, value in track_dict.items(): - track_dict[key] = sanitizeString(value) + formatted_track = template.format(**track_dict) - return template.format(**track_dict) + disallowed_chars = r'[\\:"*?<>|]+' + invalid_chars = re.findall(disallowed_chars, formatted_track) + + if invalid_chars: + raise ValueError( + f"Template '{template}' and formatted track '{formatted_track}' contains disallowed characters: {' '.join(sorted(set(invalid_chars)))}" + ) + + return formatted_track