diff --git a/picard/file.py b/picard/file.py index 0779e034a..2b65e820b 100644 --- a/picard/file.py +++ b/picard/file.py @@ -193,7 +193,7 @@ class File(LockableObject, Item): def save_images(self): """Save the cover images to disk.""" - if not "~artwork" in self.metadata: + if not self.metadata.images: return settings = self.config.setting filename = self.__script_to_filename(self.config.setting["cover_image_filename"], settings) @@ -203,9 +203,8 @@ class File(LockableObject, Item): if settings['windows_compatible_filenames'] or sys.platform == 'win32': filename = filename.replace('./', '_/').replace('.\\', '_\\') filename = encode_filename(filename) - images = self.metadata.getall("~artwork") i = 0 - for mime, data in images: + for mime, data in self.metadata.images: image_filename = filename ext = ".jpg" # TODO if i > 0: diff --git a/picard/formats/id3.py b/picard/formats/id3.py index 16d6da9b3..ec4f946bc 100644 --- a/picard/formats/id3.py +++ b/picard/formats/id3.py @@ -172,7 +172,7 @@ class ID3File(File): else: metadata['discnumber'] = value[0] elif frameid == 'APIC': - metadata.add('~artwork', (frame.mime, frame.data)) + metadata.add_image(frame.mime, frame.data) if 'date' in metadata: metadata['date'] = sanitize_date(metadata.getall('date')[0]) @@ -214,8 +214,7 @@ class ID3File(File): tags.add(id3.TPOS(encoding=0, text=text)) if self.config.setting['save_images_to_tags']: - images = self.metadata.getall('~artwork') - for mime, data in images: + for mime, data in self.metadata.images: tags.add(id3.APIC(encoding=0, mime=mime, type=3, desc='', data=data)) tmcl = mutagen.id3.TMCL(encoding=encoding, people=[]) diff --git a/picard/formats/mp4.py b/picard/formats/mp4.py index 165cdc848..4265745a8 100644 --- a/picard/formats/mp4.py +++ b/picard/formats/mp4.py @@ -93,7 +93,10 @@ class MP4File(File): metadata["totaldiscs"] = str(values[0][1]) elif name == "covr": for value in values: - metadata.add("~artwork", (None, value)) + if value.format == value.FORMAT_JPEG: + metadata.add_image("image/jpeg", value) + else: + metadata.add_image("image/png", value) self.metadata.update(metadata) self._info(file) @@ -127,6 +130,8 @@ class MP4File(File): else: file.tags["disk"] = [(int(self.metadata["discnumber"]), 0)] + # TODO save embedded images + file.save() def supports_tag(self, name): diff --git a/picard/metadata.py b/picard/metadata.py index 7c3c0cc88..3a63c911f 100644 --- a/picard/metadata.py +++ b/picard/metadata.py @@ -40,6 +40,10 @@ class Metadata(LockableObject): LockableObject.__init__(self) self._items = {} self.changed = False + self.images = [] + + def add_image(self, mime, data): + self.images.append((mime, data)) @needs_read_lock def __repr__(self): @@ -70,6 +74,7 @@ class Metadata(LockableObject): self._items = {} for key, values in other.rawitems(): self._items[key] = values[:] + self.images = other.images[:] @needs_write_lock def update(self, other): @@ -80,12 +85,7 @@ class Metadata(LockableObject): def clear(self): self._items = {} - def is_readable(self, name): - return name not in ['~artwork'] - def __get(self, name, default=None): - if not self.is_readable(name): - return default values = self._items.get(name, None) if values: if len(values) > 1: diff --git a/picard/ui/coverartbox.py b/picard/ui/coverartbox.py index f399f54ae..a9b99e308 100644 --- a/picard/ui/coverartbox.py +++ b/picard/ui/coverartbox.py @@ -83,8 +83,8 @@ class CoverArtBox(QtGui.QGroupBox): def set_metadata(self, metadata): data = None - if metadata and "~artwork" in metadata: - data = metadata.getall("~artwork")[0] + if metadata and metadata.images: + data = metadata.images[0] self.__set_data(data) if metadata: asin = metadata.get("asin", None) diff --git a/picard/ui/tageditor.py b/picard/ui/tageditor.py index 43f8fd659..ba56461d4 100644 --- a/picard/ui/tageditor.py +++ b/picard/ui/tageditor.py @@ -135,6 +135,15 @@ class TagEditor(QtGui.QDialog): item.setData(0, QtCore.Qt.UserRole, QtCore.QVariant(name)) item.setText(1, value) + if len(self.files) == 1: + for mime, data in self.files[0].metadata.images: + item = QtGui.QListWidgetItem() + pixmap = QtGui.QPixmap() + pixmap.loadFromData(data) + icon = QtGui.QIcon(pixmap) + item.setIcon(icon) + self.ui.artwork_list.addItem(item) + def save(self): metadata = Metadata() for i in range(self.ui.tags.topLevelItemCount()): diff --git a/plugins/coverart.py b/plugins/coverart.py index 3d7932569..0e5ac0645 100644 --- a/plugins/coverart.py +++ b/plugins/coverart.py @@ -40,10 +40,9 @@ def _coverart_downloaded(album, metadata, release, try_list, data, http, error): album.log.error(str(http.errorString())) coverart(album, metadata, release, try_list) else: - image = ("image/jpeg", data) - metadata.add("~artwork", image) + metadata.add_image("image/jpeg", data) for track in album._new_tracks: - track.metadata.add("~artwork", image) + track.metadata.add_image("image/jpeg", data) finally: album._requests -= 1 album._finalize_loading(None)