From 71b4d5c7023a8c20d1308f05a70ba1d6f7882949 Mon Sep 17 00:00:00 2001 From: Nicolas Guillaumin Date: Sat, 30 Dec 2017 19:18:07 -0800 Subject: [PATCH] Fixes #1210: Skip non-audio tracks from MusicBrainz This ignores non-audio tracks during import: - Data tracks, based on their title `[data track]` (which seems to be the MusicBrainz convention, as there's no specific flag to indicate that a track is a data one), - Video tracks, based on the `video=true` attribute. It's similar to the Picard changes mentioned in #1210, except it doesn't deal with `[silence]` tracks: These ones will probably require a setting to let the user control if they should be imported or not. --- beets/autotag/mb.py | 11 +++++++++++ docs/changelog.rst | 3 +++ test/test_mb.py | 26 +++++++++++++++++++++++++- 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/beets/autotag/mb.py b/beets/autotag/mb.py index b5ed4f358..6cf2818fd 100644 --- a/beets/autotag/mb.py +++ b/beets/autotag/mb.py @@ -39,6 +39,8 @@ else: NON_AUDIO_FORMATS = ['Data CD', 'DVD', 'DVD-Video', 'Blu-ray', 'HD-DVD', 'VCD', 'SVCD', 'UMD', 'VHS'] +SKIPPED_TRACKS = ['[data track]'] + musicbrainzngs.set_useragent('beets', beets.__version__, 'http://beets.io/') @@ -286,6 +288,15 @@ def album_info(release): all_tracks.insert(0, medium['pregap']) for track in all_tracks: + + if ('title' in track['recording'] and + track['recording']['title'] in SKIPPED_TRACKS): + continue + + if ('video' in track['recording'] and + track['recording']['video'] == 'true'): + continue + # Basic information from the recording. index += 1 ti = track_info( diff --git a/docs/changelog.rst b/docs/changelog.rst index 2a7349d65..4ff54b222 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -7,7 +7,10 @@ Changelog Changelog goes here! Fixes: + * Non-audio media (DVD-Video, etc.) are now skipped by the autotagger. :bug:`2688` +* Non-audio tracks (data tracks, video tracks, etc.) are now skipped by the + autotagger. :bug:`1210` 1.4.6 (December 21, 2017) diff --git a/test/test_mb.py b/test/test_mb.py index 9c51d0fe3..4683793f4 100644 --- a/test/test_mb.py +++ b/test/test_mb.py @@ -95,7 +95,7 @@ class MBAlbumInfoTest(_common.TestCase): }) return release - def _make_track(self, title, tr_id, duration, artist=False): + def _make_track(self, title, tr_id, duration, artist=False, video=False): track = { 'title': title, 'id': tr_id, @@ -113,6 +113,8 @@ class MBAlbumInfoTest(_common.TestCase): 'name': 'RECORDING ARTIST CREDIT', } ] + if video: + track['video'] = 'true' return track def test_parse_release_with_year(self): @@ -345,6 +347,28 @@ class MBAlbumInfoTest(_common.TestCase): d = mb.album_info(release) self.assertEqual(len(d.tracks), 2) + def test_skip_data_track(self): + tracks = [self._make_track('TITLE ONE', 'ID ONE', 100.0 * 1000.0), + self._make_track('[data track]', 'ID DATA TRACK', + 100.0 * 1000.0), + self._make_track('TITLE TWO', 'ID TWO', 200.0 * 1000.0)] + release = self._make_release(tracks=tracks) + d = mb.album_info(release) + self.assertEqual(len(d.tracks), 2) + self.assertEqual(d.tracks[0].title, 'TITLE ONE') + self.assertEqual(d.tracks[1].title, 'TITLE TWO') + + def test_skip_video_track(self): + tracks = [self._make_track('TITLE ONE', 'ID ONE', 100.0 * 1000.0), + self._make_track('TITLE VIDEO', 'ID VIDEO', 100.0 * 1000.0, + False, True), + self._make_track('TITLE TWO', 'ID TWO', 200.0 * 1000.0)] + release = self._make_release(tracks=tracks) + d = mb.album_info(release) + self.assertEqual(len(d.tracks), 2) + self.assertEqual(d.tracks[0].title, 'TITLE ONE') + self.assertEqual(d.tracks[1].title, 'TITLE TWO') + class ParseIDTest(_common.TestCase): def test_parse_id_correct(self):