From ab77f71017b31e3110d018bb079fd45e04503875 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0ar=C5=ABnas=20Nejus?= Date: Fri, 15 Mar 2024 11:15:51 +0000 Subject: [PATCH] internal: normalize track delimiter in tracks.py --- beetsplug/bandcamp/track.py | 8 +++----- beetsplug/bandcamp/tracks.py | 15 +++++++++++---- tests/test_track.py | 2 +- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/beetsplug/bandcamp/track.py b/beetsplug/bandcamp/track.py index f828b206..12edd1b9 100644 --- a/beetsplug/bandcamp/track.py +++ b/beetsplug/bandcamp/track.py @@ -68,7 +68,7 @@ class Track: track_alt: Optional[str] = None @classmethod - def from_json(cls, json: JSONDict, delim: str, label: str) -> "Track": + def from_json(cls, json: JSONDict, label: str) -> "Track": try: artist = json["inAlbum"]["byArtist"]["name"] except KeyError: @@ -81,7 +81,7 @@ def from_json(cls, json: JSONDict, delim: str, label: str) -> "Track": "index": json.get("position"), "catalognum": json.get("catalognum"), } - return cls(**cls.parse_name(data, json["name"], delim, label)) + return cls(**cls.parse_name(data, json["name"], label)) @staticmethod def clean_digi_name(name: str) -> Tuple[str, bool]: @@ -113,9 +113,7 @@ def find_featuring(data: JSONDict) -> JSONDict: return data @staticmethod - def parse_name(data: JSONDict, name: str, delim: str, label: str) -> JSONDict: - name = name.replace(f" {delim} ", " - ") - + def parse_name(data: JSONDict, name: str, label: str) -> JSONDict: # remove label from the end of the track name # see https://gutterfunkuk.bandcamp.com/album/gutterfunk-all-subject-to-vibes-various-artists-lp # noqa if name.endswith(label): diff --git a/beetsplug/bandcamp/tracks.py b/beetsplug/bandcamp/tracks.py index b2d4ca2f..618b1818 100644 --- a/beetsplug/bandcamp/tracks.py +++ b/beetsplug/bandcamp/tracks.py @@ -1,4 +1,5 @@ """Module with tracks parsing functionality.""" + import itertools as it import operator as op import re @@ -40,7 +41,7 @@ def remove_number_prefix(names: List[str]) -> List[str]: return names @staticmethod - def track_delimiter(names: List[str]) -> str: + def find_common_track_delimiter(names: List[str]) -> str: """Return the track parts delimiter that is in effect in the current release. In some (rare) situations track parts are delimited by a pipe character or some UTF-8 equivalent of a dash. @@ -98,6 +99,13 @@ def common_name_parts(tracks, names): return tracks + @classmethod + def normalize_delimiter(cls, names: List[str]) -> List[str]: + delim = cls.find_common_track_delimiter(names) + return ( + names if delim == "-" else [n.replace(f" {delim} ", " - ") for n in names] + ) + @classmethod def from_json(cls, meta: JSONDict) -> "Tracks": try: @@ -108,13 +116,12 @@ def from_json(cls, meta: JSONDict) -> "Tracks": names = [i.get("name", "") for i in tracks] names = cls.split_quoted_titles(names) names = cls.remove_number_prefix(names) + names = cls.normalize_delimiter(names) for track, name in zip(tracks, names): track["name"] = name tracks = cls.common_name_parts(tracks, names) - - delim = cls.track_delimiter(names) - return cls([Track.from_json(t, delim, Helpers.get_label(meta)) for t in tracks]) + return cls([Track.from_json(t, Helpers.get_label(meta)) for t in tracks]) @cached_property def first(self) -> Track: diff --git a/tests/test_track.py b/tests/test_track.py index 27368432..7695a0cf 100644 --- a/tests/test_track.py +++ b/tests/test_track.py @@ -20,7 +20,7 @@ def test_parse_catalognum_from_track_name( "catalognum": initial_catalognum, } - track = Track.from_json(json_track, "-", "Label") + track = Track.from_json(json_track, "Label") assert track.title == expected_title, print(track) assert track.catalognum == expected_catalognum, print(track)