From e685cb03ce54eeb2b7751de74f75f8b6ac31cef0 Mon Sep 17 00:00:00 2001 From: Nicolas Guillaumin Date: Sat, 30 Dec 2017 12:10:27 -0800 Subject: [PATCH] Fixes #2688: Skip non-audio media from MusicBrainz Some releases have non-audio media, such as CD+DVD or CD+DVD-Video. Skip these media when fetching album info as they will never match audio tracks and will always report missing tracks. I took the naive approach of cherry-picking a list of media suspected to not contain audio from the MusicBrainz formats list: https://musicbrainz.org/doc/Release/Format --- beets/autotag/mb.py | 6 ++++++ docs/changelog.rst | 4 ++++ test/test_mb.py | 25 +++++++++++++++++++++++-- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/beets/autotag/mb.py b/beets/autotag/mb.py index 5c484d2b38..437c67030d 100644 --- a/beets/autotag/mb.py +++ b/beets/autotag/mb.py @@ -36,6 +36,9 @@ else: BASE_URL = 'http://musicbrainz.org/' +NON_AUDIO_FORMATS = ['Data CD', 'DVD', 'DVD-Video', 'Blu-ray', 'HD-DVD', 'VCD', + 'SVCD', 'UMD', 'VHS'] + musicbrainzngs.set_useragent('beets', beets.__version__, 'http://beets.io/') @@ -275,6 +278,9 @@ def album_info(release): disctitle = medium.get('title') format = medium.get('format') + if format in NON_AUDIO_FORMATS: + continue + all_tracks = medium['track-list'] if 'pregap' in medium: all_tracks.insert(0, medium['pregap']) diff --git a/docs/changelog.rst b/docs/changelog.rst index bd084a8907..5c9622a1ba 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -6,6 +6,10 @@ Changelog Changelog goes here! +Fixes: +* Non-audio media (DVD-Video, etc.) are now skipped by the autotagger. + :bug:`2688` + 1.4.6 (December 21, 2017) ------------------------- diff --git a/test/test_mb.py b/test/test_mb.py index ca1bf2a1a0..9c51d0fe36 100644 --- a/test/test_mb.py +++ b/test/test_mb.py @@ -27,7 +27,7 @@ class MBAlbumInfoTest(_common.TestCase): def _make_release(self, date_str='2009', tracks=None, track_length=None, - track_artist=False): + track_artist=False, medium_format='FORMAT'): release = { 'title': 'ALBUM TITLE', 'id': 'ALBUM ID', @@ -90,7 +90,7 @@ def _make_release(self, date_str='2009', tracks=None, track_length=None, release['medium-list'].append({ 'position': '1', 'track-list': track_list, - 'format': 'FORMAT', + 'format': medium_format, 'title': 'MEDIUM TITLE', }) return release @@ -324,6 +324,27 @@ def test_data_source(self): d = mb.album_info(release) self.assertEqual(d.data_source, 'MusicBrainz') + def test_skip_non_audio_dvd(self): + tracks = [self._make_track('TITLE ONE', 'ID ONE', 100.0 * 1000.0), + self._make_track('TITLE TWO', 'ID TWO', 200.0 * 1000.0)] + release = self._make_release(tracks=tracks, medium_format="DVD") + d = mb.album_info(release) + self.assertEqual(len(d.tracks), 0) + + def test_skip_non_audio_dvd_video(self): + tracks = [self._make_track('TITLE ONE', 'ID ONE', 100.0 * 1000.0), + self._make_track('TITLE TWO', 'ID TWO', 200.0 * 1000.0)] + release = self._make_release(tracks=tracks, medium_format="DVD-Video") + d = mb.album_info(release) + self.assertEqual(len(d.tracks), 0) + + def test_no_skip_dvd_audio(self): + tracks = [self._make_track('TITLE ONE', 'ID ONE', 100.0 * 1000.0), + self._make_track('TITLE TWO', 'ID TWO', 200.0 * 1000.0)] + release = self._make_release(tracks=tracks, medium_format="DVD-Audio") + d = mb.album_info(release) + self.assertEqual(len(d.tracks), 2) + class ParseIDTest(_common.TestCase): def test_parse_id_correct(self):