From edd6e7f7894440a610c573ff9b93b2c29cf2b9ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Detrey?= Date: Wed, 7 Oct 2015 18:17:53 +0200 Subject: [PATCH 1/6] Take the audio tracks in a data track into account. Depends on commit 6ec04e6 of `python-musicbrainzngs'. --- beets/autotag/mb.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/beets/autotag/mb.py b/beets/autotag/mb.py index 8589a62aa..ff267634f 100644 --- a/beets/autotag/mb.py +++ b/beets/autotag/mb.py @@ -217,6 +217,10 @@ def album_info(release): format = medium.get('format') all_tracks = medium['track-list'] + if 'data-track-list' in medium: + all_tracks += medium['data-track-list'] + total = len(all_tracks) + if 'pregap' in medium: all_tracks.insert(0, medium['pregap']) @@ -228,7 +232,7 @@ def album_info(release): index, int(medium['position']), int(track['position']), - len(medium['track-list']), + total, ) ti.disctitle = disctitle ti.media = format From 6ea1be731475ca5c84f498320d09c3773ba8f2bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Detrey?= Date: Wed, 7 Oct 2015 23:30:52 +0200 Subject: [PATCH 2/6] Add the `data-track-list' feature to changelog. --- docs/changelog.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/changelog.rst b/docs/changelog.rst index 1aa89ef1e..f41243e65 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -23,6 +23,11 @@ The new features: * :doc:`/plugins/plexupdate`: A new ``library_name`` option allows you to select which Plex library to update. :bug:`1572` :bug:`1595` * Add new `include` config option to allow including external config files. +* The importer now supports audio files contained in data tracks when they are + listed in MusicBrainz: the corresponding audio tracks are now merged into the + main track list. (This feature depends on a new version of the + ``musicbrainzngs`` library which is not yet released, but will start working + when it is available.) Thanks to :user:`jdetrey`. :bug:`1638` Fixes: From 1a37db732ec0eb7becd0a52d9f1af3bdb588ffae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Detrey?= Date: Sun, 29 Apr 2018 18:00:36 +0200 Subject: [PATCH 3/6] More fitting name for total track count. --- beets/autotag/mb.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/beets/autotag/mb.py b/beets/autotag/mb.py index 0539c909e..268baf766 100644 --- a/beets/autotag/mb.py +++ b/beets/autotag/mb.py @@ -283,7 +283,7 @@ def album_info(release): all_tracks = medium['track-list'] if 'data-track-list' in medium: all_tracks += medium['data-track-list'] - total = len(all_tracks) + track_count = len(all_tracks) if 'pregap' in medium: all_tracks.insert(0, medium['pregap']) @@ -306,7 +306,7 @@ def album_info(release): index, int(medium['position']), int(track['position']), - total, + track_count, ) ti.disctitle = disctitle ti.media = format From c15f1ba8773dffea94e7a17238e559aa7e015200 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Detrey?= Date: Sun, 29 Apr 2018 18:21:40 +0200 Subject: [PATCH 4/6] Add the `data-track-list' feature to changelog. --- docs/changelog.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/changelog.rst b/docs/changelog.rst index 8f45aa69c..ec6c1b3a7 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -103,6 +103,9 @@ Fixes: to which a track belongs, not the total number of different mediums present on the release. :bug:`2887` Thanks to :user:`dbogdanov`. +* The importer now supports audio files contained in data tracks when they are + listed in MusicBrainz: the corresponding audio tracks are now merged into the + main track list. Thanks to :user:`jdetrey`. :bug:`1638` For developers: From e88a7cea90a194bfedac208f423ec4e85c5169b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Detrey?= Date: Sun, 29 Apr 2018 20:05:57 +0200 Subject: [PATCH 5/6] Unit test for import with audio data tracks. --- test/test_mb.py | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/test/test_mb.py b/test/test_mb.py index 644e7f5de..585cc4f1e 100644 --- a/test/test_mb.py +++ b/test/test_mb.py @@ -27,7 +27,8 @@ import mock class MBAlbumInfoTest(_common.TestCase): def _make_release(self, date_str='2009', tracks=None, track_length=None, - track_artist=False, medium_format='FORMAT'): + track_artist=False, data_tracks=None, + medium_format='FORMAT'): release = { 'title': 'ALBUM TITLE', 'id': 'ALBUM ID', @@ -62,8 +63,8 @@ class MBAlbumInfoTest(_common.TestCase): 'country': 'COUNTRY', 'status': 'STATUS', } + track_list = [] if tracks: - track_list = [] for i, recording in enumerate(tracks): track = { 'recording': recording, @@ -87,12 +88,22 @@ class MBAlbumInfoTest(_common.TestCase): } ] track_list.append(track) - release['medium-list'].append({ - 'position': '1', - 'track-list': track_list, - 'format': medium_format, - 'title': 'MEDIUM TITLE', - }) + data_track_list = [] + if data_tracks: + for i, recording in enumerate(data_tracks): + data_track = { + 'recording': recording, + 'position': len(track_list) + i + 1, + 'number': 'A1', + } + data_track_list.append(data_track) + release['medium-list'].append({ + 'position': '1', + 'track-list': track_list, + 'data-track-list': data_track_list, + 'format': medium_format, + 'title': 'MEDIUM TITLE', + }) return release def _make_track(self, title, tr_id, duration, artist=False, video=False): @@ -354,6 +365,18 @@ class MBAlbumInfoTest(_common.TestCase): self.assertEqual(d.tracks[0].title, 'TITLE ONE') self.assertEqual(d.tracks[1].title, 'TITLE TWO') + def test_no_skip_audio_data_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)] + data_tracks = [self._make_track('TITLE AUDIO DATA', 'ID DATA TRACK', + 100.0 * 1000.0)] + release = self._make_release(tracks=tracks, data_tracks=data_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 TWO') + self.assertEqual(d.tracks[2].title, 'TITLE AUDIO DATA') + 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, From c1d1388729415d212051b7ef4249c26284851fc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Detrey?= Date: Sun, 29 Apr 2018 20:19:11 +0200 Subject: [PATCH 6/6] Unit test for import with video data tracks. --- test/test_mb.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/test_mb.py b/test/test_mb.py index 585cc4f1e..55df22944 100644 --- a/test/test_mb.py +++ b/test/test_mb.py @@ -388,6 +388,17 @@ class MBAlbumInfoTest(_common.TestCase): self.assertEqual(d.tracks[0].title, 'TITLE ONE') self.assertEqual(d.tracks[1].title, 'TITLE TWO') + def test_skip_video_data_tracks_by_default(self): + tracks = [self._make_track('TITLE ONE', 'ID ONE', 100.0 * 1000.0), + self._make_track('TITLE TWO', 'ID TWO', 200.0 * 1000.0)] + data_tracks = [self._make_track('TITLE VIDEO', 'ID VIDEO', + 100.0 * 1000.0, False, True)] + release = self._make_release(tracks=tracks, data_tracks=data_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), @@ -401,6 +412,19 @@ class MBAlbumInfoTest(_common.TestCase): self.assertEqual(d.tracks[1].title, 'TITLE VIDEO') self.assertEqual(d.tracks[2].title, 'TITLE TWO') + def test_no_skip_video_data_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 TWO', 'ID TWO', 200.0 * 1000.0)] + data_tracks = [self._make_track('TITLE VIDEO', 'ID VIDEO', + 100.0 * 1000.0, False, True)] + release = self._make_release(tracks=tracks, data_tracks=data_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 TWO') + self.assertEqual(d.tracks[2].title, 'TITLE VIDEO') + class ParseIDTest(_common.TestCase): def test_parse_id_correct(self):