diff --git a/beetsplug/musicbrainz.py b/beetsplug/musicbrainz.py index 8a95b3b57..9f4581004 100644 --- a/beetsplug/musicbrainz.py +++ b/beetsplug/musicbrainz.py @@ -477,7 +477,7 @@ class MusicBrainzPlugin(MusicBrainzAPIMixin, MetadataSourcePlugin): release["artist-credit"], include_join_phrase=False ) - ntracks = sum(len(m["tracks"]) for m in release["media"]) + ntracks = sum(len(m.get("tracks", [])) for m in release["media"]) # The MusicBrainz API omits 'relations' # when the release has more than 500 tracks. So we use browse_recordings @@ -512,7 +512,7 @@ class MusicBrainzPlugin(MusicBrainzAPIMixin, MetadataSourcePlugin): if format in config["match"]["ignored_media"].as_str_seq(): continue - all_tracks = medium["tracks"] + all_tracks = medium.get("tracks", []) if ( "data-tracks" in medium and not config["match"]["ignore_data_tracks"] diff --git a/docs/changelog.rst b/docs/changelog.rst index 621dfbf2f..ee094f4a1 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -16,6 +16,8 @@ Unreleased Bug fixes ~~~~~~~~~ +- :doc:`plugins/musicbrainz`: Fix crash when release mediums lack the ``tracks`` + key. :bug:`6302` - :doc:`plugins/musicbrainz`: Fix search terms escaping. :bug:`6347` - :doc:`plugins/musicbrainz`: Fix support for ``alias`` and ``tracks`` :conf:`plugins.musicbrainz:extra_tags`. diff --git a/test/plugins/test_musicbrainz.py b/test/plugins/test_musicbrainz.py index 069f1fb99..8d7c5a2f8 100644 --- a/test/plugins/test_musicbrainz.py +++ b/test/plugins/test_musicbrainz.py @@ -691,6 +691,23 @@ class MBAlbumInfoTest(MusicBrainzTestCase): assert t[0].trackdisambig is None assert t[1].trackdisambig == "SECOND TRACK" + def test_missing_tracks(self): + tracks = [ + self._make_track("TITLE ONE", "ID ONE", 100.0 * 1000.0), + self._make_track( + "TITLE TWO", + "ID TWO", + 200.0 * 1000.0, + disambiguation="SECOND TRACK", + ), + ] + release = self._make_release(tracks=tracks) + release["media"].append(release["media"][0]) + del release["media"][0]["tracks"] + del release["media"][0]["data-tracks"] + d = self.mb.album_info(release) + assert d.mediums == 2 + class ArtistFlatteningTest(unittest.TestCase): def _credit_dict(self, suffix=""):