Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions beetsplug/musicbrainz.py
Original file line number Diff line number Diff line change
Expand Up @@ -314,9 +314,8 @@ def _parse_artist_credits(artist_credits: list[ArtistCredit]) -> ArtistInfo:
- Parallel lists that keep the per-artist granularity for callers that
need to reason about individual credited artists.

When available, a preferred alias is used for the canonical artist name
and sort name, while the credit name preserves the exact credited text
from the release.
When available, a preferred alias is used for the canonical artist name,
sort name and the credit name.
"""
artist_parts: list[str] = []
artist_sort_parts: list[str] = []
Expand All @@ -330,12 +329,17 @@ def _parse_artist_credits(artist_credits: list[ArtistCredit]) -> ArtistInfo:
artists_ids.append(el["artist"]["id"])
alias = _preferred_alias(el["artist"].get("aliases", []))
artist_object = alias or el["artist"]
credit_artist_object = alias or el
Comment thread
Morikko marked this conversation as resolved.

joinphrase = el["joinphrase"]
for name, parts, multi in (
(artist_object["name"], artist_parts, artists),
(artist_object["sort_name"], artist_sort_parts, artists_sort),
(el["name"], artist_credit_parts, artists_credit),
(
credit_artist_object["name"],
artist_credit_parts,
artists_credit,
),
):
parts.extend([name, joinphrase])
multi.append(name)
Expand Down
1 change: 1 addition & 0 deletions docs/changelog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ New features
- :doc:`plugins/lyrics`: Add ``keep_synced`` config option and ``--keep-synced``
CLI flag to skip re-fetching lyrics for tracks that already have synced
lyrics, even when ``force`` is enabled. :bug:`5249`
- :doc:`plugins/musicbrainz`: Use aliases for artist credit.

Bug fixes
~~~~~~~~~
Expand Down
9 changes: 9 additions & 0 deletions test/plugins/factories/musicbrainz.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,15 @@ class Params:
name = "Artist"
type = "Person"
type_id = "b6e035f4-3ce9-331c-97df-83397230b0df"
aliases = factory.List(
[
factory.SubFactory(
AliasFactory,
type="Artist name",
prefix=factory.SelfAttribute("...name"),
)
]
)


class ArtistCreditFactory(factory.DictFactory):
Expand Down
51 changes: 29 additions & 22 deletions test/plugins/test_musicbrainz.py
Original file line number Diff line number Diff line change
Expand Up @@ -652,33 +652,40 @@ def test_missing_language(self, mb):
def test_genres(self, mb, expected_genres):
assert mb.album_info(release_factory()).genres == expected_genres

@pytest.mark.parametrize(
"languages_config, expected_titles",
[
_p([], ("Album", "Release Group", "Recording"), id="no aliases"),
_p(
["en"],
(
"Album Alias en",
"Release Group Alias en",
"Recording Alias en",
),
id="aliases",
),
],
)
def test_parse_titles(self, config, mb, languages_config, expected_titles):
def test_parse_aliased_titles(self, config, mb: MusicBrainzPlugin):
release = release_factory()

config["import"]["languages"] = languages_config

album, release_group_title, track_title = expected_titles
config["import"]["languages"] = ["en"]

d = mb.album_info(release)

assert d.album == album
assert d.release_group_title == release_group_title
assert d.tracks[0].title == track_title
assert d.album == "Album Alias en"
assert d.release_group_title == "Release Group Alias en"
assert d.tracks[0].title == "Recording Alias en"

album_artist = "Artist Alias en"
assert d.artist == album_artist
assert d.artists == [album_artist]
# There is no artist credit specific alias
assert d.artist_credit == album_artist
assert d.artists_credit == [album_artist]

album_artist_sort = "Artist Alias en, The"
assert d.artist_sort == album_artist_sort
assert d.artists_sort == [album_artist_sort]

first_track = d.tracks[0]

track_artist = "Recording Artist Alias en"
assert first_track.artist == track_artist
assert first_track.artists == [track_artist]
# There is no artist credit specific alias
assert first_track.artist_credit == track_artist
assert first_track.artists_credit == [track_artist]

track_artist_sort = "Recording Artist Alias en, The"
assert first_track.artist_sort == track_artist_sort
assert first_track.artists_sort == [track_artist_sort]

def test_ensure_complete_recordings(self, monkeypatch, mb):
titles = ["Recording", "Other Recording"]
Expand Down
Loading