diff --git a/beets/mediafile.py b/beets/mediafile.py index a459e09d0..49ef10378 100644 --- a/beets/mediafile.py +++ b/beets/mediafile.py @@ -821,6 +821,9 @@ class MP3ImageStorageStyle(ListStorageStyle, MP3StorageStyle): def store(self, mutagen_file, frames): mutagen_file.tags.setall(self.key, frames) + def delete(self, mutagen_file): + mutagen_file.tags.delall(self.key) + def serialize(self, image): """Return an APIC frame populated with data from ``image``. """ @@ -1257,7 +1260,7 @@ class CoverArtField(MediaField): delattr(mediafile, 'images') -class ImageListField(MediaField): +class ImageListField(ListMediaField): """Descriptor to access the list of images embedded in tags. The getter returns a list of `Image` instances obtained from @@ -1275,18 +1278,9 @@ class ImageListField(MediaField): VorbisImageStorageStyle(), FlacImageStorageStyle(), APEv2ImageStorageStyle(), + out_type=Image, ) - def __get__(self, mediafile, _): - images = [] - for style in self.styles(mediafile.mgfile): - images.extend(style.get_list(mediafile.mgfile)) - return images - - def __set__(self, mediafile, images): - for style in self.styles(mediafile.mgfile): - style.set_list(mediafile.mgfile, images) - # MediaFile is a collection of fields. diff --git a/beetsplug/embedart.py b/beetsplug/embedart.py index d4d0fe4af..4c8b934a6 100644 --- a/beetsplug/embedart.py +++ b/beetsplug/embedart.py @@ -276,5 +276,5 @@ def clear(lib, query): displayable_path(item.path), exc )) continue - mf.art = None + del mf.art mf.save() diff --git a/test/test_mediafile.py b/test/test_mediafile.py index b27252eb0..722b74484 100644 --- a/test/test_mediafile.py +++ b/test/test_mediafile.py @@ -74,6 +74,20 @@ class ArtTestMixin(object): mediafile = MediaFile(mediafile.path) self.assertEqual(mediafile.art, self.jpg_data) + def test_delete_art(self): + mediafile = self._mediafile_fixture('empty') + mediafile.art = self.jpg_data + mediafile.save() + + mediafile = MediaFile(mediafile.path) + self.assertIsNotNone(mediafile.art) + + del mediafile.art + mediafile.save() + + mediafile = MediaFile(mediafile.path) + self.assertIsNone(mediafile.art) + class ImageStructureTestMixin(ArtTestMixin): """Test reading and writing multiple image tags. @@ -134,6 +148,16 @@ class ImageStructureTestMixin(ArtTestMixin): image, desc='the composer', type=ImageType.composer ) + def test_delete_image_structures(self): + mediafile = self._mediafile_fixture('image') + self.assertEqual(len(mediafile.images), 2) + + del mediafile.images + mediafile.save() + + mediafile = MediaFile(mediafile.path) + self.assertEqual(len(mediafile.images), 0) + def assertExtendedImageAttributes(self, image, **kwargs): """Ignore extended image attributes in the base tests. """