diff --git a/beets/autotag/mb.py b/beets/autotag/mb.py index 0721b4601..17f83aa63 100644 --- a/beets/autotag/mb.py +++ b/beets/autotag/mb.py @@ -198,6 +198,7 @@ def album_info(release): for medium in release['medium-list']: disctitle = medium.get('title') for track in medium['track-list']: + # Basic information from the recording. index += 1 ti = track_info( track['recording'], @@ -206,27 +207,21 @@ def album_info(release): int(track['position']), len(medium['track-list']), ) + ti.disctitle = disctitle + + # Prefer track data, where present, over recording data. if track.get('title'): - # Track title may be distinct from underlying recording - # title. ti.title = track['title'] if track.get('artist-credit'): - # Track artist may be distinct from underlying recording - # title. - # Get the artist names. ti.artist, ti.artist_sort, ti.artist_credit = \ _flatten_artist_credit(track['artist-credit']) - - # Get the ID and sort name of the first artist. - artist = track['artist-credit'][0]['artist'] - ti.artist_id = artist['id'] + ti.artist_id = track['artist-credit'][0]['artist']['id'] if track.get('length'): - # Track duration is preferred over the recording - # duration. ti.length = int(track['length']) / (1000.0) - ti.disctitle = disctitle + track_infos.append(ti) + info = beets.autotag.hooks.AlbumInfo( release['title'], release['id'], diff --git a/docs/changelog.rst b/docs/changelog.rst index 27b925ebd..1adc69b08 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -14,6 +14,9 @@ New stuff: * The :doc:`/plugins/ftintitle`, by `@Verrus`_, is now distributed with beets. It helps you rewrite tags to move "featured" artists from the artist field to the title field. +* The MusicBrainz data source now uses track artists over recording + artists. This leads to better metadata when tagging classical music. Thanks + to Henrique Ferreiro. And some fixes: diff --git a/test/test_mb.py b/test/test_mb.py index 0f2366a25..590578ddb 100644 --- a/test/test_mb.py +++ b/test/test_mb.py @@ -20,7 +20,8 @@ from beets.autotag import mb from beets import config class MBAlbumInfoTest(_common.TestCase): - def _make_release(self, date_str='2009', tracks=None, track_length=None): + def _make_release(self, date_str='2009', tracks=None, track_length=None, + track_artist=False): release = { 'title': 'ALBUM TITLE', 'id': 'ALBUM ID', @@ -65,6 +66,19 @@ class MBAlbumInfoTest(_common.TestCase): if track_length: # Track lengths are distinct from recording lengths. track['length'] = track_length + if track_artist: + # Similarly, track artists can differ from recording + # artists. + track['artist-credit'] = [ + { + 'artist': { + 'name': 'TRACK ARTIST NAME', + 'id': 'TRACK ARTIST ID', + 'sort-name': 'TRACK ARTIST SORT NAME', + }, + 'name': 'TRACK ARTIST CREDIT', + } + ] track_list.append(track) release['medium-list'].append({ 'position': '1', @@ -85,11 +99,11 @@ class MBAlbumInfoTest(_common.TestCase): track['artist-credit'] = [ { 'artist': { - 'name': 'TRACK ARTIST NAME', - 'id': 'TRACK ARTIST ID', - 'sort-name': 'TRACK ARTIST SORT NAME', + 'name': 'RECORDING ARTIST NAME', + 'id': 'RECORDING ARTIST ID', + 'sort-name': 'RECORDING ARTIST SORT NAME', }, - 'name': 'TRACK ARTIST CREDIT', + 'name': 'RECORDING ARTIST CREDIT', } ] return track @@ -279,10 +293,19 @@ class MBAlbumInfoTest(_common.TestCase): d = mb.album_info(release) self.assertEqual(d.language, None) - def test_parse_track_artist(self): + def test_parse_recording_artist(self): tracks = [self._make_track('a', 'b', 1, True)] release = self._make_release(None, tracks=tracks) track = mb.album_info(release).tracks[0] + self.assertEqual(track.artist, 'RECORDING ARTIST NAME') + self.assertEqual(track.artist_id, 'RECORDING ARTIST ID') + self.assertEqual(track.artist_sort, 'RECORDING ARTIST SORT NAME') + self.assertEqual(track.artist_credit, 'RECORDING ARTIST CREDIT') + + def test_track_artist_overrides_recording_artist(self): + tracks = [self._make_track('a', 'b', 1, True)] + release = self._make_release(None, tracks=tracks, track_artist=True) + track = mb.album_info(release).tracks[0] self.assertEqual(track.artist, 'TRACK ARTIST NAME') self.assertEqual(track.artist_id, 'TRACK ARTIST ID') self.assertEqual(track.artist_sort, 'TRACK ARTIST SORT NAME')