From 63def728dc3127cfbee5d2bed54e71dff58afc69 Mon Sep 17 00:00:00 2001 From: Thomas Scholtes Date: Sun, 9 Mar 2014 01:48:56 +0100 Subject: [PATCH] Implement ImageListField for WMA --- beets/mediafile.py | 24 +++++++++++------------- test/rsrc/image.wma | Bin 0 -> 24561 bytes test/test_mediafile.py | 9 +++++++-- 3 files changed, 18 insertions(+), 15 deletions(-) create mode 100644 test/rsrc/image.wma diff --git a/beets/mediafile.py b/beets/mediafile.py index 106e0afc6..ae97e46cb 100644 --- a/beets/mediafile.py +++ b/beets/mediafile.py @@ -691,7 +691,6 @@ class ASFImageStorageStyle(ListStorageStyle): def __init__(self): super(ASFImageStorageStyle, self).__init__(key='WM/Picture') - self.as_type = str def fetch(self, mutagen_file): if 'WM/Picture' not in mutagen_file: @@ -700,19 +699,18 @@ class ASFImageStorageStyle(ListStorageStyle): pictures = [] for picture in mutagen_file['WM/Picture']: try: - pictures.append(_unpack_asf_image(picture.value)[1]) + mime, data, type, desc = _unpack_asf_image(picture.value) except: - pass + continue + pictures.append(TagImage(data, desc=desc, type=type)) return pictures - def store(self, mutagen_file, images): - if 'WM/Picture' in mutagen_file: - del mutagen_file['WM/Picture'] - - for image in images: - pic = mutagen.asf.ASFByteArrayAttribute() - pic.value = _pack_asf_image(_image_mime_type(image), image) - mutagen_file['WM/Picture'] = [pic] + def serialize(self, image): + pic = mutagen.asf.ASFByteArrayAttribute() + pic.value = _pack_asf_image(image.mime_type, image.data, + type=image.type_index or 3, + description=image.desc or u'') + return pic class VorbisImageStorageStyle(ListStorageStyle): @@ -971,7 +969,7 @@ class CoverArtField(MediaField): ) def __get__(self, mediafile, _): - if mediafile.type in ['mp3', 'flac'] + VorbisImageStorageStyle.formats: + if mediafile.type in ['mp3', 'flac', 'asf'] + VorbisImageStorageStyle.formats: try: return mediafile.images[0].data except IndexError: @@ -980,7 +978,7 @@ class CoverArtField(MediaField): return style.get(mediafile.mgfile) def __set__(self, mediafile, data): - if mediafile.type in ['mp3', 'flac'] + VorbisImageStorageStyle.formats: + if mediafile.type in ['mp3', 'flac', 'asf'] + VorbisImageStorageStyle.formats: if data: mediafile.images = [TagImage(data=data)] else: diff --git a/test/rsrc/image.wma b/test/rsrc/image.wma new file mode 100644 index 0000000000000000000000000000000000000000..2158978f3e0e5543727650324f4ecc4ac165bae5 GIT binary patch literal 24561 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