Skip to content

Commit cb4b4fc

Browse files
Cleanup for #6177, #6068
1 parent d68514e commit cb4b4fc

File tree

3 files changed

+54
-70
lines changed

3 files changed

+54
-70
lines changed

beetsplug/discogs.py

Lines changed: 40 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,17 @@ class AlbumArtistInfo(ArtistInfo):
124124
albumartists_ids: list[str]
125125

126126

127+
class TracklistInfo:
128+
def __init__(self):
129+
self.index: int = 0
130+
self.index_tracks: dict[int, str] = {}
131+
self.tracks: list[TrackInfo] = []
132+
self.divisions: list[str] = []
133+
self.next_divisions: list[str] = []
134+
self.mediums: list[str | None] = []
135+
self.medium_indices: list[str | None] = []
136+
137+
127138
class DiscogsPlugin(MetadataSourcePlugin):
128139
def __init__(self):
129140
super().__init__()
@@ -371,7 +382,6 @@ def build_albumartistinfo(self, artists: list[Artist]) -> AlbumArtistInfo:
371382
"albumartist": info["artist"],
372383
"albumartist_id": info["artist_id"],
373384
"albumartists": info["artists"],
374-
"albumartists_ids": info["artists_ids"],
375385
"albumartist_credit": info["artist_credit"],
376386
"albumartists_credit": info["artists_credit"],
377387
}
@@ -386,12 +396,6 @@ def build_artistinfo(
386396
"""Iterates through a discogs result and builds
387397
up the artist fields. Does not contribute to
388398
artist_sort as Discogs does not define that.
389-
390-
:param artists: A list of Discogs Artist objects
391-
392-
:param album_artist: If building an album artist,
393-
we need to account for the album_artist anv parameter.
394-
:return an ArtistInfo dictionary.
395399
"""
396400
info: ArtistInfo = {
397401
"artist": "",
@@ -420,7 +424,7 @@ def build_artistinfo(
420424
for a in given_artists:
421425
# Get the artist name
422426
name = self.strip_disambiguation(a["name"])
423-
discogs_id = a["id"]
427+
discogs_id = str(a["id"])
424428
anv = a.get("anv", name)
425429
role = a.get("role", "").lower()
426430
# Check if the artist is Various
@@ -621,63 +625,41 @@ def _process_clean_tracklist(
621625
self,
622626
clean_tracklist: list[Track],
623627
albumartistinfo: ArtistInfo,
624-
) -> tuple[
625-
list[TrackInfo],
626-
dict[int, str],
627-
int,
628-
list[str],
629-
list[str],
630-
list[str | None],
631-
list[str | None],
632-
]:
628+
) -> TracklistInfo:
633629
# Distinct works and intra-work divisions, as defined by index tracks.
634-
tracks: list[TrackInfo] = []
635-
mediums: list[str | None] = []
636-
medium_indices: list[str | None] = []
637-
index_tracks = {}
638-
index = 0
639-
divisions: list[str] = []
640-
next_divisions: list[str] = []
630+
t = TracklistInfo()
641631
for track in clean_tracklist:
642632
# Only real tracks have `position`. Otherwise, it's an index track.
643633
if track["position"]:
644-
index += 1
645-
if next_divisions:
634+
t.index += 1
635+
if t.next_divisions:
646636
# End of a block of index tracks: update the current
647637
# divisions.
648-
divisions += next_divisions
649-
del next_divisions[:]
638+
t.divisions += t.next_divisions
639+
del t.next_divisions[:]
650640
track_info, medium, medium_index = self.get_track_info(
651-
track, index, divisions, albumartistinfo
641+
track, t.index, t.divisions, albumartistinfo
652642
)
653643
track_info.track_alt = track["position"]
654-
tracks.append(track_info)
644+
t.tracks.append(track_info)
655645
if medium:
656-
mediums.append(medium)
646+
t.mediums.append(medium)
657647
else:
658-
mediums.append(None)
648+
t.mediums.append(None)
659649
if medium_index:
660-
medium_indices.append(medium_index)
650+
t.medium_indices.append(medium_index)
661651
else:
662-
medium_indices.append(None)
652+
t.medium_indices.append(None)
663653
else:
664-
next_divisions.append(track["title"])
654+
t.next_divisions.append(track["title"])
665655
# We expect new levels of division at the beginning of the
666656
# tracklist (and possibly elsewhere).
667657
try:
668-
divisions.pop()
658+
t.divisions.pop()
669659
except IndexError:
670660
pass
671-
index_tracks[index + 1] = track["title"]
672-
return (
673-
tracks,
674-
index_tracks,
675-
index,
676-
divisions,
677-
next_divisions,
678-
mediums,
679-
medium_indices,
680-
)
661+
t.index_tracks[t.index + 1] = track["title"]
662+
return t
681663

682664
def get_tracks(
683665
self,
@@ -694,18 +676,9 @@ def get_tracks(
694676
self._log.debug("{}", traceback.format_exc())
695677
self._log.error("uncaught exception in coalesce_tracks: {}", exc)
696678
clean_tracklist = tracklist
697-
processed = self._process_clean_tracklist(
679+
t: TracklistInfo = self._process_clean_tracklist(
698680
clean_tracklist, albumartistinfo
699681
)
700-
(
701-
tracks,
702-
index_tracks,
703-
index,
704-
divisions,
705-
next_divisions,
706-
mediums,
707-
medium_indices,
708-
) = processed
709682
# Fix up medium and medium_index for each track. Discogs position is
710683
# unreliable, but tracks are in order.
711684
medium = None
@@ -714,22 +687,24 @@ def get_tracks(
714687

715688
# If a medium has two sides (ie. vinyl or cassette), each pair of
716689
# consecutive sides should belong to the same medium.
717-
if all([medium is not None for medium in mediums]):
718-
m = sorted({medium.lower() if medium else "" for medium in mediums})
690+
if all([medium is not None for medium in t.mediums]):
691+
m = sorted(
692+
{medium.lower() if medium else "" for medium in t.mediums}
693+
)
719694
# If all track.medium are single consecutive letters, assume it is
720695
# a 2-sided medium.
721696
if "".join(m) in ascii_lowercase:
722697
sides_per_medium = 2
723698

724-
for i, track in enumerate(tracks):
699+
for i, track in enumerate(t.tracks):
725700
# Handle special case where a different medium does not indicate a
726701
# new disc, when there is no medium_index and the ordinal of medium
727702
# is not sequential. For example, I, II, III, IV, V. Assume these
728703
# are the track index, not the medium.
729704
# side_count is the number of mediums or medium sides (in the case
730705
# of two-sided mediums) that were seen before.
731-
medium_str = mediums[i]
732-
medium_index = medium_indices[i]
706+
medium_str = t.mediums[i]
707+
medium_index = t.medium_indices[i]
733708
medium_is_index = (
734709
medium_str
735710
and not medium_index
@@ -760,15 +735,15 @@ def get_tracks(
760735

761736
# Get `disctitle` from Discogs index tracks. Assume that an index track
762737
# before the first track of each medium is a disc title.
763-
for track in tracks:
738+
for track in t.tracks:
764739
if track.medium_index == 1:
765-
if track.index in index_tracks:
766-
disctitle = index_tracks[track.index]
740+
if track.index in t.index_tracks:
741+
disctitle = t.index_tracks[track.index]
767742
else:
768743
disctitle = None
769744
track.disctitle = disctitle
770745

771-
return tracks
746+
return t.tracks
772747

773748
def coalesce_tracks(self, raw_tracklist: list[Track]) -> list[Track]:
774749
"""Pre-process a tracklist, merging subtracks into a single track. The

docs/changelog.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ New features:
3131
no_convert, never_convert_lossy_files, same format, and max_bitrate
3232
- :doc:`plugins/titlecase`: Add the `titlecase` plugin to allow users to
3333
resolve differences in metadata source styles.
34-
- :doc:`plugins/discogs`: Added support for multi value fields. :bug:`6068`
34+
- :doc:`plugins/discogs`: Added support for multi-value fields. :bug:`6068`
3535

3636
Bug fixes:
3737

@@ -59,8 +59,8 @@ Bug fixes:
5959
"albumartist" instead of a list of unique album artists.
6060
- Sanitize log messages by removing control characters preventing terminal
6161
rendering issues.
62-
- :doc:`plugins/discogs`: Fixed unexpected flex attr from the Discogs plugin.
63-
:bug:`6177`
62+
- :doc:`plugins/discogs`: Fixed an unexpected flexible attribute originating
63+
from the Discogs plugin. :bug:`6177`
6464

6565
For plugin developers:
6666

test/plugins/test_discogs.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -410,8 +410,11 @@ def test_strip_disambiguation(self):
410410
d = DiscogsPlugin().get_album_info(release)
411411
assert d.artist == "ARTIST NAME & OTHER ARTIST"
412412
assert d.artists == ["ARTIST NAME", "OTHER ARTIST"]
413+
assert d.artists_ids == ["321", "321"]
413414
assert d.tracks[0].artist == "TEST ARTIST"
414415
assert d.tracks[0].artists == ["TEST ARTIST"]
416+
assert d.tracks[0].artist_id == "11146"
417+
assert d.tracks[0].artists_ids == ["11146"]
415418
assert d.label == "LABEL NAME"
416419

417420
def test_strip_disambiguation_false(self):
@@ -460,7 +463,7 @@ def test_strip_disambiguation_false(self):
460463
@pytest.mark.parametrize(
461464
"track_artist_anv,track_artist,track_artists",
462465
[
463-
(False, "ARTIST Feat. PERFORMER", ["ARTIST", "PEFORMER"]),
466+
(False, "ARTIST Feat. PERFORMER", ["ARTIST", "PERFORMER"]),
464467
(True, "VARIATION Feat. VARIATION", ["VARIATION", "VARIATION"]),
465468
],
466469
)
@@ -480,7 +483,7 @@ def test_strip_disambiguation_false(self):
480483
(
481484
False,
482485
"ARTIST Feat. PERFORMER",
483-
["ARTIST", "PEFORMER"],
486+
["ARTIST", "PERFORMER"],
484487
"ARTIST & SOLOIST",
485488
["ARTIST", "SOLOIST"],
486489
),
@@ -551,9 +554,14 @@ def test_anv(
551554
config["discogs"]["anv"]["artist_credit"] = artist_credit_anv
552555
r = DiscogsPlugin().get_album_info(release)
553556
assert r.artist == album_artist
557+
assert r.albumartists == album_artists
554558
assert r.artist_credit == album_artist_credit
559+
assert r.albumartist_credit == album_artist_credit
560+
assert r.albumartists_credit == album_artists_credit
555561
assert r.tracks[0].artist == track_artist
562+
assert r.tracks[0].artists == track_artists
556563
assert r.tracks[0].artist_credit == track_artist_credit
564+
assert r.tracks[0].artists_credit == track_artists_credit
557565

558566

559567
@patch("beetsplug.discogs.DiscogsPlugin.setup", Mock())
@@ -590,6 +598,7 @@ def test_anv_album_artist():
590598
assert r.artists == ["ARTIST"]
591599
assert r.albumartist == "ARTIST"
592600
assert r.albumartist_credit == "ARTIST"
601+
assert r.albumartist_id == "321"
593602
assert r.albumartists == ["ARTIST"]
594603
assert r.albumartists_credit == ["ARTIST"]
595604
assert r.artist_credit == "ARTIST"

0 commit comments

Comments
 (0)