Repository: beetbox/beets

Issue:
Ignore missing video tracks identified by MusicBrainz during import and in missing plugin
Musicbrainz albums sometimes have video tracks in them (example: http://musicbrainz.org/release/49da37ee-065a-4d7f-a204-9dda8047aad4 ) -- is it possible to ignore video tracks we importing or using `beet missing`?


Discussion:

Patch:
diff --git a/beets/autotag/mb.py b/beets/autotag/mb.py
index b5ed4f358..eb7c30808 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,16 @@ 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' and
+                    config['match']['ignore_video_tracks']):
+                continue
+
             # Basic information from the recording.
             index += 1
             ti = track_info(
diff --git a/beets/config_default.yaml b/beets/config_default.yaml
index 942459738..01c1e0f65 100644
--- a/beets/config_default.yaml
+++ b/beets/config_default.yaml
@@ -126,5 +126,6 @@ match:
         original_year: no
     ignored: []
     required: []
+    ignore_video_tracks: yes
     track_length_grace: 10
     track_length_max: 30
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/docs/reference/config.rst b/docs/reference/config.rst
index 4015a4fc2..84f41a385 100644
--- a/docs/reference/config.rst
+++ b/docs/reference/config.rst
@@ -774,6 +774,17 @@ want to enforce to the ``required`` setting::
 
 No tags are required by default.
 
+.. _ignore_video_tracks:
+
+ignore_video_tracks
+~~~~~~~~~~~~~~~~~~~
+
+By default, video tracks within a release will be ignored. If you want them to
+be included (for example if you would like to track the audio-only versions of
+the video tracks), set it to ``no``.
+
+Default: ``yes``.
+
 .. _path-format-config:
 
 Path Format Configuration


Test patch:
diff --git a/test/test_mb.py b/test/test_mb.py
index 9c51d0fe3..35f7c3aa2 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,41 @@ 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_tracks_by_default(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')
+
+    def test_no_skip_video_tracks_if_configured(self):
+        config['match']['ignore_video_tracks'] = False
+        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), 3)
+        self.assertEqual(d.tracks[0].title, 'TITLE ONE')
+        self.assertEqual(d.tracks[1].title, 'TITLE VIDEO')
+        self.assertEqual(d.tracks[2].title, 'TITLE TWO')
+
 
 class ParseIDTest(_common.TestCase):
     def test_parse_id_correct(self):