Merge branch 'master' of github.com:sampsyo/beets

This commit is contained in:
Adrian Sampson 2014-12-01 11:28:57 -08:00
commit d97b90d363
4 changed files with 36 additions and 14 deletions

View file

@ -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.

View file

@ -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

View file

@ -276,5 +276,5 @@ def clear(lib, query):
displayable_path(item.path), exc
))
continue
mf.art = None
del mf.art
mf.save()

View file

@ -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.
"""