diff --git a/picard/coverart/image.py b/picard/coverart/image.py index e848ce039..ab74bdb3b 100644 --- a/picard/coverart/image.py +++ b/picard/coverart/image.py @@ -28,7 +28,6 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from dataclasses import astuple from hashlib import blake2b import os import shutil @@ -309,8 +308,11 @@ class CoverArtImage: self.datahash = None try: - (self.width, self.height, self.mimetype, self.extension, - self.datalength) = astuple(imageinfo.identify(data)) + info = imageinfo.identify(data) + self.width, self.height = info.width, info.height + self.mimetype = info.mime + self.extension = info.extension + self.datalength = info.datalen except imageinfo.IdentificationError as e: raise CoverArtImageIdentificationError(e) diff --git a/picard/coverart/processing/__init__.py b/picard/coverart/processing/__init__.py index a2528cd1b..dca8fc27e 100644 --- a/picard/coverart/processing/__init__.py +++ b/picard/coverart/processing/__init__.py @@ -35,6 +35,7 @@ from picard.extension_points.cover_art_processors import ( ProcessingTarget, get_cover_art_processors, ) +from picard.util.imageinfo import IdentificationError def run_image_filters(data): @@ -75,6 +76,8 @@ def run_image_processors(data, coverartimage): coverartimage, 1000 * (time.time() - start_time) ) + except IdentificationError as e: + raise CoverArtProcessingError(e) except CoverArtProcessingError as e: coverartimage.set_tags_data(tags_data) coverartimage.set_external_file_data(file_data) diff --git a/picard/coverart/processing/processors.py b/picard/coverart/processing/processors.py index a45631ddc..7bb3ee819 100644 --- a/picard/coverart/processing/processors.py +++ b/picard/coverart/processing/processors.py @@ -70,6 +70,7 @@ class ResizeImage(ImageProcessor): ) image.info.width = scaled_image.width() image.info.height = scaled_image.height() + image.info.datalen = scaled_image.sizeInBytes() image.set_result(scaled_image) diff --git a/picard/extension_points/cover_art_processors.py b/picard/extension_points/cover_art_processors.py index 8e7b15c96..fa14404c2 100644 --- a/picard/extension_points/cover_art_processors.py +++ b/picard/extension_points/cover_art_processors.py @@ -63,14 +63,14 @@ class ProcessingImage: else: self._qimage = QImage.fromData(image) - def get_result(self, image_format=None, default_format=False): + def get_result(self, image_format=None, default_format=False, quality=90): if image_format is None: if not default_format: return self._qimage else: image_format = self.info.format buffer = QBuffer() - if not self._qimage.save(buffer, image_format, quality=90): + if not self._qimage.save(buffer, image_format, quality=quality): raise CoverArtEncodingError(f"Failed to encode into {image_format}") return buffer.data() diff --git a/picard/util/imageinfo.py b/picard/util/imageinfo.py index 9334f24ba..9e3ff33c3 100644 --- a/picard/util/imageinfo.py +++ b/picard/util/imageinfo.py @@ -74,7 +74,13 @@ class IdentifyImageType: return self._result() def _result(self): - return ImageInfo(int(self.w), int(self.h), self.mime, self.extension, self.datalen) + return ImageInfo( + width=int(self.w), + height=int(self.h), + mime=self.mime, + extension=self.extension, + datalen=self.datalen, + ) def match(self): raise NotImplementedError diff --git a/test/test_coverart_processing.py b/test/test_coverart_processing.py index 67a1094d5..3c2fc7b6a 100644 --- a/test/test_coverart_processing.py +++ b/test/test_coverart_processing.py @@ -31,10 +31,10 @@ from picard.coverart.processing.filters import ( ) from picard.coverart.processing.processors import ResizeImage from picard.extension_points.cover_art_processors import ( + CoverArtProcessingError, ProcessingImage, ProcessingTarget, ) -from picard.util.imageinfo import IdentificationError def create_fake_image(width, height, image_format): @@ -142,5 +142,5 @@ class ImageProcessorsTest(PicardTestCase): def test_identification_error(self): image = create_fake_image(0, 0, "jpg") coverartimage = CoverArtImage() - with self.assertRaises(IdentificationError): + with self.assertRaises(CoverArtProcessingError): run_image_processors(image, coverartimage) diff --git a/test/test_util_imageinfo.py b/test/test_util_imageinfo.py index 19befe1a0..66d7350cf 100644 --- a/test/test_util_imageinfo.py +++ b/test/test_util_imageinfo.py @@ -36,7 +36,13 @@ class IdentifyTest(PicardTestCase): with open(file, 'rb') as f: self.assertEqual( imageinfo.identify(f.read()), - imageinfo.ImageInfo(140, 96, 'image/gif', '.gif', 5806) + imageinfo.ImageInfo( + width=140, + height=96, + mime='image/gif', + extension='.gif', + datalen=5806 + ) ) def test_png(self): @@ -45,7 +51,13 @@ class IdentifyTest(PicardTestCase): with open(file, 'rb') as f: self.assertEqual( imageinfo.identify(f.read()), - imageinfo.ImageInfo(140, 96, 'image/png', '.png', 11137) + imageinfo.ImageInfo( + width=140, + height=96, + mime='image/png', + extension='.png', + datalen=11137 + ) ) def test_jpeg(self): @@ -54,7 +66,13 @@ class IdentifyTest(PicardTestCase): with open(file, 'rb') as f: self.assertEqual( imageinfo.identify(f.read()), - imageinfo.ImageInfo(140, 96, 'image/jpeg', '.jpg', 8550) + imageinfo.ImageInfo( + width=140, + height=96, + mime='image/jpeg', + extension='.jpg', + datalen=8550 + ) ) def test_webp_vp8(self): @@ -63,7 +81,13 @@ class IdentifyTest(PicardTestCase): with open(file, 'rb') as f: self.assertEqual( imageinfo.identify(f.read()), - imageinfo.ImageInfo(140, 96, 'image/webp', '.webp', 6178) + imageinfo.ImageInfo( + width=140, + height=96, + mime='image/webp', + extension='.webp', + datalen=6178 + ) ) def test_webp_vp8l(self): @@ -72,7 +96,13 @@ class IdentifyTest(PicardTestCase): with open(file, 'rb') as f: self.assertEqual( imageinfo.identify(f.read()), - imageinfo.ImageInfo(140, 96, 'image/webp', '.webp', 9432) + imageinfo.ImageInfo( + width=140, + height=96, + mime='image/webp', + extension='.webp', + datalen=9432 + ) ) def test_webp_vp8x(self): @@ -81,7 +111,13 @@ class IdentifyTest(PicardTestCase): with open(file, 'rb') as f: self.assertEqual( imageinfo.identify(f.read()), - imageinfo.ImageInfo(140, 96, 'image/webp', '.webp', 6858) + imageinfo.ImageInfo( + width=140, + height=96, + mime='image/webp', + extension='.webp', + datalen=6858 + ) ) def test_webp_insufficient_data(self): @@ -94,7 +130,13 @@ class IdentifyTest(PicardTestCase): with open(file, 'rb') as f: self.assertEqual( imageinfo.identify(f.read()), - imageinfo.ImageInfo(140, 96, 'image/tiff', '.tiff', 12509) + imageinfo.ImageInfo( + width=140, + height=96, + mime='image/tiff', + extension='.tiff', + datalen=12509 + ) ) def test_pdf(self): @@ -103,7 +145,13 @@ class IdentifyTest(PicardTestCase): with open(file, 'rb') as f: self.assertEqual( imageinfo.identify(f.read()), - imageinfo.ImageInfo(0, 0, 'application/pdf', '.pdf', 10362) + imageinfo.ImageInfo( + width=0, + height=0, + mime='application/pdf', + extension='.pdf', + datalen=10362 + ) ) def test_not_enough_data(self):