From 030fb9b00bfccc5c0e7bb41598cd2407bc7e0042 Mon Sep 17 00:00:00 2001 From: Wieland Hoffmann Date: Wed, 22 Jan 2014 23:27:08 +0100 Subject: [PATCH] Use the same Image objects for all tracks of an album --- picard/coverart.py | 7 ++++--- picard/formats/apev2.py | 2 +- picard/formats/asf.py | 2 +- picard/formats/id3.py | 2 +- picard/formats/mp4.py | 4 ++-- picard/formats/vorbis.py | 6 +++--- picard/metadata.py | 12 +++++++++--- picard/ui/coverartbox.py | 12 ++++++------ test/test_formats.py | 2 +- 9 files changed, 28 insertions(+), 21 deletions(-) diff --git a/picard/coverart.py b/picard/coverart.py index a71264f0f..7a71c12d6 100644 --- a/picard/coverart.py +++ b/picard/coverart.py @@ -26,7 +26,7 @@ import re import traceback from functools import partial from picard import config, log -from picard.metadata import is_front_image +from picard.metadata import Image, is_front_image from picard.util import mimetype, parse_amazon_url from picard.const import CAA_HOST, CAA_PORT from PyQt4.QtCore import QUrl, QObject @@ -101,9 +101,10 @@ def _coverart_downloaded(album, metadata, release, try_list, coverinfos, data, h filename = None if not is_front_image(coverinfos) and config.setting["caa_image_type_as_filename"]: filename = coverinfos['type'] - metadata.add_image(mime, data, filename, coverinfos) + image = Image(data, mime, coverinfos['type'], coverinfos['desc']) + metadata.add_image(image) for track in album._new_tracks: - track.metadata.add_image(mime, data, filename, coverinfos) + track.metadata.add_image(image) # If the image already was a front image, there might still be some # other front images in the try_list - remove them. diff --git a/picard/formats/apev2.py b/picard/formats/apev2.py index f36903161..e358e5a1c 100644 --- a/picard/formats/apev2.py +++ b/picard/formats/apev2.py @@ -63,7 +63,7 @@ class APEv2File(File): if '\0' in values.value: descr, data = values.value.split('\0', 1) mime = mimetype.get_from_data(data, descr, 'image/jpeg') - metadata.add_image(mime, data) + metadata.make_and_add_image(mime, data) # skip EXTERNAL and BINARY values if values.kind != mutagen.apev2.TEXT: continue diff --git a/picard/formats/asf.py b/picard/formats/asf.py index 83797d7f3..b6f7eebeb 100644 --- a/picard/formats/asf.py +++ b/picard/formats/asf.py @@ -139,7 +139,7 @@ class ASFFile(File): if name == 'WM/Picture': for image in values: (mime, data, type, description) = unpack_image(image.value) - metadata.add_image(mime, data, comment=description, + metadata.make_and_add_image(mime, data, comment=description, imagetype=image_type_from_id3_num(type)) continue elif name not in self.__RTRANS: diff --git a/picard/formats/id3.py b/picard/formats/id3.py index e2e450d29..abfa1ac37 100644 --- a/picard/formats/id3.py +++ b/picard/formats/id3.py @@ -248,7 +248,7 @@ class ID3File(File): else: metadata['discnumber'] = value[0] elif frameid == 'APIC': - metadata.add_image(frame.mime, frame.data, comment=frame.desc, + metadata.make_and_add_image(frame.mime, frame.data, comment=frame.desc, imagetype=image_type_from_id3_num(frame.type)) elif frameid == 'POPM': # Rating in ID3 ranges from 0 to 255, normalize this to the range 0 to 5 diff --git a/picard/formats/mp4.py b/picard/formats/mp4.py index bc3e385dc..6837d6d81 100644 --- a/picard/formats/mp4.py +++ b/picard/formats/mp4.py @@ -140,9 +140,9 @@ class MP4File(File): elif name == "covr": for value in values: if value.imageformat == value.FORMAT_JPEG: - metadata.add_image("image/jpeg", value) + metadata.make_and_add_image("image/jpeg", value) elif value.imageformat == value.FORMAT_PNG: - metadata.add_image("image/png", value) + metadata.make_and_add_image("image/png", value) self._info(metadata, file) return metadata diff --git a/picard/formats/vorbis.py b/picard/formats/vorbis.py index ce4d722d3..7635997ec 100644 --- a/picard/formats/vorbis.py +++ b/picard/formats/vorbis.py @@ -96,7 +96,7 @@ class VCommentFile(File): name = "totaldiscs" elif name == "metadata_block_picture": image = mutagen.flac.Picture(base64.standard_b64decode(value)) - metadata.add_image(image.mime, image.data, + metadata.make_and_add_image(image.mime, image.data, comment=image.desc, imagetype=image_type_from_id3_num(image.type)) continue @@ -105,13 +105,13 @@ class VCommentFile(File): metadata.add(name, value) if self._File == mutagen.flac.FLAC: for image in file.pictures: - metadata.add_image(image.mime, image.data, comment=image.desc, + metadata.make_and_add_image(image.mime, image.data, comment=image.desc, imagetype=image_type_from_id3_num(image.type)) # Read the unofficial COVERART tags, for backward compatibillity only if not "metadata_block_picture" in file.tags: try: for index, data in enumerate(file["COVERART"]): - metadata.add_image(file["COVERARTMIME"][index], + metadata.make_and_add_image(file["COVERARTMIME"][index], base64.standard_b64decode(data) ) except KeyError: diff --git a/picard/metadata.py b/picard/metadata.py index 4f2ab432c..c1d99aed8 100644 --- a/picard/metadata.py +++ b/picard/metadata.py @@ -156,9 +156,15 @@ class Metadata(dict): self.images = [] self.length = 0 - def add_image(self, mime, data, filename=None, comment="", - imagetype="front"): - """Adds the image ``data`` to this Metadata object. + def add_image(self, image): + """Adds the Image object ``image`` to tis Metadata object. + """ + self.images.append(image) + + def make_and_add_image(self, mime, data, filename=None, comment="", + imagetype="front"): + """Build a new image object from ``data`` and adds it to this Metadata + object. Arguments: mime -- The mimetype of the image diff --git a/picard/ui/coverartbox.py b/picard/ui/coverartbox.py index b136986e1..98e925b20 100644 --- a/picard/ui/coverartbox.py +++ b/picard/ui/coverartbox.py @@ -178,16 +178,16 @@ class CoverArtBox(QtGui.QGroupBox): self.__set_data([mime, data], pixmap=pixmap) if isinstance(self.item, Album): album = self.item - album.metadata.add_image(mime, data) + album.metadata.make_and_add_image(mime, data) for track in album.tracks: - track.metadata.add_image(mime, data) + track.metadata.make_and_add_image(mime, data) for file in album.iterfiles(): - file.metadata.add_image(mime, data) + file.metadata.make_and_add_image(mime, data) elif isinstance(self.item, Track): track = self.item - track.metadata.add_image(mime, data) + track.metadata.make_and_add_image(mime, data) for file in track.iterfiles(): - file.metadata.add_image(mime, data) + file.metadata.make_and_add_image(mime, data) elif isinstance(self.item, File): file = self.item - file.metadata.add_image(mime, data) + file.metadata.make_and_add_image(mime, data) diff --git a/test/test_formats.py b/test/test_formats.py index 2b24b475b..866c1e58b 100644 --- a/test/test_formats.py +++ b/test/test_formats.py @@ -544,7 +544,7 @@ class TestCoverArt(unittest.TestCase): f = picard.formats.open(self.filename) metadata = Metadata() imgdata = tests[t]['head'] + dummyload - metadata.add_image(tests[t]['mime'], imgdata) + metadata.make_and_add_image(tests[t]['mime'], imgdata) f._save(self.filename, metadata) f = picard.formats.open(self.filename)