diff --git a/beets/autotag/hooks.py b/beets/autotag/hooks.py index 2c78749e6..444ae7b59 100644 --- a/beets/autotag/hooks.py +++ b/beets/autotag/hooks.py @@ -148,6 +148,16 @@ class AlbumInfo(AttrDict): for track in self.tracks: track.decode(codec) + def dup_albuminfo(self): + dupe = AlbumInfo() + dupe.update(self) + if 'tracks' in self: + tracks = [] + for track in self.tracks: + tracks.append(track.dup_trackinfo()) + dupe.tracks = tracks + return dupe + class TrackInfo(AttrDict): """Describes a canonical track present on a release. Appears as part @@ -209,6 +219,10 @@ class TrackInfo(AttrDict): if isinstance(value, bytes): setattr(self, fld, value.decode(codec, 'ignore')) + def dup_trackinfo(self): + dupe = TrackInfo() + dupe.update(self) + # Candidate distance scoring. diff --git a/test/test_autotag.py b/test/test_autotag.py index 06e6b7e72..cef6364d0 100644 --- a/test/test_autotag.py +++ b/test/test_autotag.py @@ -753,32 +753,14 @@ class ApplyTest(_common.TestCase, ApplyTestUtil): def test_album_artist_overrides_empty_track_artist(self): # make a deepcopy of self.info - trackinfo = [] - track = TrackInfo() - track.update(self.info.tracks[0]) - trackinfo.append(track) - track = TrackInfo() - track.update(self.info.tracks[1]) - trackinfo.append(track) - my_info = AlbumInfo() - my_info.update(self.info) - my_info.tracks = trackinfo + my_info = self.info.dup_albuminfo() self._apply(info=my_info) self.assertEqual(self.items[0].artist, 'artistNew') self.assertEqual(self.items[1].artist, 'artistNew') def test_album_artist_overridden_by_nonempty_track_artist(self): # make a deepcopy of self.info - trackinfo = [] - track = TrackInfo() - track.update(self.info.tracks[0]) - trackinfo.append(track) - track = TrackInfo() - track.update(self.info.tracks[1]) - trackinfo.append(track) - my_info = AlbumInfo() - my_info.update(self.info) - my_info.tracks = trackinfo + my_info = self.info.dup_albuminfo() my_info.tracks[0].artist = 'artist1!' my_info.tracks[1].artist = 'artist2!' self._apply(info=my_info) @@ -801,16 +783,7 @@ class ApplyTest(_common.TestCase, ApplyTestUtil): def test_full_date_applied(self): # make a deepcopy of self.info - trackinfo = [] - track = TrackInfo() - track.update(self.info.tracks[0]) - trackinfo.append(track) - track = TrackInfo() - track.update(self.info.tracks[1]) - trackinfo.append(track) - my_info = AlbumInfo() - my_info.update(self.info) - my_info.tracks = trackinfo + my_info = self.info.dup_albuminfo() my_info.year = 2013 my_info.month = 12 my_info.day = 18 @@ -826,16 +799,7 @@ class ApplyTest(_common.TestCase, ApplyTestUtil): self.items.append(Item(year=4, month=5, day=6)) # make a deepcopy of self.info - trackinfo = [] - track = TrackInfo() - track.update(self.info.tracks[0]) - trackinfo.append(track) - track = TrackInfo() - track.update(self.info.tracks[1]) - trackinfo.append(track) - my_info = AlbumInfo() - my_info.update(self.info) - my_info.tracks = trackinfo + my_info = self.info.dup_albuminfo() my_info.year = 2013 self._apply(info=my_info) @@ -856,16 +820,7 @@ class ApplyTest(_common.TestCase, ApplyTestUtil): def test_data_source_applied(self): # make a deepcopy of self.info - trackinfo = [] - track = TrackInfo() - track.update(self.info.tracks[0]) - trackinfo.append(track) - track = TrackInfo() - track.update(self.info.tracks[1]) - trackinfo.append(track) - my_info = AlbumInfo() - my_info.update(self.info) - my_info.tracks = trackinfo + my_info = self.info.dup_albuminfo() my_info.data_source = 'MusicBrainz' self._apply(info=my_info) @@ -928,16 +883,7 @@ class ApplyCompilationTest(_common.TestCase, ApplyTestUtil): def test_va_flag_sets_comp(self): # make a deepcopy of self.info - trackinfo = [] - track = TrackInfo() - track.update(self.info.tracks[0]) - trackinfo.append(track) - track = TrackInfo() - track.update(self.info.tracks[1]) - trackinfo.append(track) - va_info = AlbumInfo() - va_info.update(self.info) - va_info.tracks = trackinfo + va_info = self.info.dup_albuminfo() va_info.va = True self._apply(info=va_info) self.assertTrue(self.items[0].comp)