diff --git a/beetsplug/musicbrainz.py b/beetsplug/musicbrainz.py index 428490f46..5bbcea2fa 100644 --- a/beetsplug/musicbrainz.py +++ b/beetsplug/musicbrainz.py @@ -155,16 +155,10 @@ def track_url(trackid: str) -> str: def _get_related_artist_names( relations: list[ArtistRelation], relation_type: ArtistRelationType ) -> str: - """Given a list representing the artist relationships extract the names of - the remixers and concatenate them. - """ - related_artists = [] - - for relation in relations: - if relation["type"] == relation_type: - related_artists.append(relation["artist"]["name"]) - - return ", ".join(related_artists) + """Return a comma-separated list of artist names for a relation type.""" + return ", ".join( + r["artist"]["name"] for r in relations if r["type"] == relation_type + ) def album_url(albumid: str) -> str: diff --git a/test/plugins/factories/musicbrainz.py b/test/plugins/factories/musicbrainz.py index cae21bb98..8ef6f390d 100644 --- a/test/plugins/factories/musicbrainz.py +++ b/test/plugins/factories/musicbrainz.py @@ -1,4 +1,7 @@ import factory +from factory.fuzzy import FuzzyChoice + +from beetsplug._utils.musicbrainz import ArtistRelationType class _SortNameFactory(factory.DictFactory): @@ -6,13 +9,16 @@ class _SortNameFactory(factory.DictFactory): sort_name = factory.LazyAttribute(lambda o: f"{o.name}, The") -class AliasFactory(_SortNameFactory): - class Params: - suffix = "" - +class _PeriodFactory(factory.DictFactory): begin: str | None = None end: str | None = None ended = factory.LazyAttribute(lambda obj: obj.end is not None) + + +class AliasFactory(_SortNameFactory, _PeriodFactory): + class Params: + suffix = "" + locale: str | None = None name = factory.LazyAttribute(lambda o: f"Alias {o.suffix}") primary = False @@ -39,3 +45,20 @@ class ArtistCreditFactory(factory.DictFactory): artist = factory.SubFactory(ArtistFactory) joinphrase = "" name = factory.LazyAttribute(lambda o: f"{o.artist['name']} Credit") + + +class ArtistRelationFactory(_PeriodFactory): + artist = factory.SubFactory( + ArtistFactory, + name=factory.LazyAttribute( + lambda o: f"{o.factory_parent.type.capitalize()} Artist" + ), + ) + attribute_ids = factory.Dict({}) + attribute_credits = factory.Dict({}) + attributes = factory.List([]) + direction = "backward" + source_credit = "" + target_credit = "" + type = FuzzyChoice(ArtistRelationType.__args__) # type: ignore[attr-defined] + type_id = factory.Faker("uuid4") diff --git a/test/plugins/test_musicbrainz.py b/test/plugins/test_musicbrainz.py index 64d436820..04c926fdf 100644 --- a/test/plugins/test_musicbrainz.py +++ b/test/plugins/test_musicbrainz.py @@ -48,6 +48,10 @@ def artist_credit_factory(**kwargs) -> mb.ArtistCredit: return factories.ArtistCreditFactory.build(**kwargs) +def artist_relation_factory(**kwargs) -> mb.ArtistRelation: + return factories.ArtistRelationFactory.build(**kwargs) + + class MusicBrainzTestCase(BeetsTestCase): def setUp(self): super().setUp() @@ -187,20 +191,9 @@ class MusicBrainzTestCase(BeetsTestCase): ) if remixer: recording["artist_relations"] = [ - { - "type": "remixer", - "type_id": "RELATION TYPE ID", - "direction": "backward", - "artist": artist_factory(name="Recording Remixer"), - "attribute_ids": {}, - "attribute_values": {}, - "attributes": [], - "begin": None, - "end": None, - "ended": False, - "source_credit": "", - "target_credit": "", - } + artist_relation_factory( + type="remixer", artist__name="Recording Remixer" + ) ] return recording