From 9d3729dc5efe0a53d32f31f2acb5fe90a50077b5 Mon Sep 17 00:00:00 2001 From: Thomas Scholtes Date: Mon, 1 Dec 2014 17:20:16 +0100 Subject: [PATCH 1/2] mediafile: Test deleting images and implement it for MP3s --- beets/mediafile.py | 16 +++++----------- beetsplug/embedart.py | 2 +- test/test_mediafile.py | 24 ++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 12 deletions(-) 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. """ From 17117ed4ae783f972bae6a898e991a2bcc226c75 Mon Sep 17 00:00:00 2001 From: Thomas Scholtes Date: Mon, 1 Dec 2014 17:53:14 +0100 Subject: [PATCH 2/2] echonest: Remove temporary files Fixes #979. --- beetsplug/echonest.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/beetsplug/echonest.py b/beetsplug/echonest.py index a16b8cc6a..8814209f6 100644 --- a/beetsplug/echonest.py +++ b/beetsplug/echonest.py @@ -321,9 +321,10 @@ class EchonestMetadataPlugin(plugins.BeetsPlugin): # Get the file to upload (either by using the file directly or by # transcoding it first). source = item.path + tmp = None if item.format not in ALLOWED_FORMATS: if config['echonest']['convert']: - source = self.convert(item) + tmp = source = self.convert(item) if not source: log.debug(u'echonest: failed to convert file') return @@ -332,7 +333,7 @@ class EchonestMetadataPlugin(plugins.BeetsPlugin): if os.stat(item.path).st_size > UPLOAD_MAX_SIZE: if config['echonest']['truncate']: - source = self.truncate(item) + tmp = source = self.truncate(item) if not source: log.debug(u'echonest: failed to truncate file') return @@ -343,6 +344,9 @@ class EchonestMetadataPlugin(plugins.BeetsPlugin): log.info(u'echonest: uploading file, please be patient') track = self._echofun(pyechonest.track.track_from_filename, filename=source) + if tmp is not None: + util.remove(tmp) + if not track: log.debug(u'echonest: failed to upload file') return