From c22fe4cd6434bcc1cc4904748f1f4889eb52343e Mon Sep 17 00:00:00 2001 From: twodoorcoupe Date: Sat, 15 Jun 2024 11:37:21 +0200 Subject: [PATCH] Add new external image to artwork infodialog --- picard/coverart/image.py | 2 +- picard/coverart/processing/__init__.py | 25 +++++++++------- picard/ui/infodialog.py | 41 +++++++++++++++++++++++++- test/test_coverart_processing.py | 4 ++- 4 files changed, 59 insertions(+), 13 deletions(-) diff --git a/picard/coverart/image.py b/picard/coverart/image.py index ab74bdb3b..c9a1b8812 100644 --- a/picard/coverart/image.py +++ b/picard/coverart/image.py @@ -322,7 +322,7 @@ class CoverArtImage: raise CoverArtImageIOError(e) def set_external_file_data(self, data): - self.external_file_coverart = CoverArtImage(data=data) + self.external_file_coverart = CoverArtImage(data=data, url=self.url) @property def maintype(self): diff --git a/picard/coverart/processing/__init__.py b/picard/coverart/processing/__init__.py index dca8fc27e..4e9ecee21 100644 --- a/picard/coverart/processing/__init__.py +++ b/picard/coverart/processing/__init__.py @@ -21,6 +21,7 @@ import time from picard import log +from picard.config import get_config from picard.coverart.processing import ( # noqa: F401 # pylint: disable=unused-import filters, processors, @@ -53,6 +54,7 @@ def run_image_metadata_filters(metadata): def run_image_processors(data, coverartimage): + config = get_config() tags_data = data file_data = data try: @@ -61,16 +63,18 @@ def run_image_processors(data, coverartimage): both_queue, tags_queue, file_queue = get_cover_art_processors() for processor in both_queue: processor.run(image, ProcessingTarget.BOTH) - tags_image = image.copy() - for processor in tags_queue: - processor.run(tags_image, ProcessingTarget.TAGS) - tags_data = tags_image.get_result(default_format=True) + if config.setting['save_images_to_tags']: + tags_image = image.copy() + for processor in tags_queue: + processor.run(tags_image, ProcessingTarget.TAGS) + tags_data = tags_image.get_result(default_format=True) coverartimage.set_tags_data(tags_data) - file_image = image.copy() - for processor in file_queue: - processor.run(file_image, ProcessingTarget.FILE) - file_data = file_image.get_result(default_format=True) - coverartimage.set_external_file_data(file_data) + if config.setting['save_images_to_files']: + file_image = image.copy() + for processor in file_queue: + processor.run(file_image, ProcessingTarget.FILE) + file_data = file_image.get_result(default_format=True) + coverartimage.set_external_file_data(file_data) log.debug( "Image processing for %s finished in %d ms", coverartimage, @@ -80,5 +84,6 @@ def run_image_processors(data, coverartimage): raise CoverArtProcessingError(e) except CoverArtProcessingError as e: coverartimage.set_tags_data(tags_data) - coverartimage.set_external_file_data(file_data) + if config.setting['save_images_to_files']: + coverartimage.set_external_file_data(file_data) raise e diff --git a/picard/ui/infodialog.py b/picard/ui/infodialog.py index a1a831802..ebd36c1ec 100644 --- a/picard/ui/infodialog.py +++ b/picard/ui/infodialog.py @@ -137,6 +137,19 @@ class ArtworkTableSimple(ArtworkTable): self.setColumnWidth(self.get_column_index('type'), self.TYPE_COLUMN_SIZE) +class ArtworkTableSimpleExternal(ArtworkTableSimple): + NUM_COLS = 3 + + _columns = { + 'type': 0, + 'new': 1, + 'external': 2, + } + + _labels = (_("Type"), _("Cover"), _("External Cover"),) + artwork_columns = ('new', 'external',) + + class ArtworkTableExisting(ArtworkTable): NUM_COLS = 3 @@ -150,11 +163,28 @@ class ArtworkTableExisting(ArtworkTable): artwork_columns = ('orig', 'new',) +class ArtworkTableExistingExternal(ArtworkTable): + NUM_COLS = 4 + + _columns = { + 'orig': 0, + 'type': 1, + 'new': 2, + 'external': 3, + } + + _labels = (_("Existing Cover"), _("Type"), _("New Cover"), _("New External Cover"),) + artwork_columns = ('orig', 'new', 'external',) + + class ArtworkRow: def __init__(self, orig_image=None, new_image=None, types=None): self.orig_image = orig_image self.new_image = new_image self.types = types + self.new_external_image = None + if self.new_image: + self.new_external_image = self.new_image.external_file_coverart class InfoDialog(PicardDialog): @@ -171,6 +201,9 @@ class InfoDialog(PicardDialog): self.new_images = sorted(obj.metadata.images) or [] self.orig_images = [] artworktable_class = ArtworkTableSimple + has_external_images = any(image.external_file_coverart for image in self.new_images) + if has_external_images: + artworktable_class = ArtworkTableSimpleExternal has_orig_images = hasattr(obj, 'orig_metadata') and obj.orig_metadata.images if has_orig_images and obj.orig_metadata.images != obj.metadata.images: @@ -180,6 +213,8 @@ class InfoDialog(PicardDialog): if is_track or is_linked_file or is_album_with_files: self.orig_images = sorted(obj.orig_metadata.images) artworktable_class = ArtworkTableExisting + if has_external_images: + artworktable_class = ArtworkTableExistingExternal self.ui.setupUi(self) self.ui.buttonBox.addButton( @@ -242,7 +277,11 @@ class InfoDialog(PicardDialog): col_index = self.artwork_table.get_column_index(colname) pixmap = None infos = None - source = 'new_image' if colname == 'new' else 'orig_image' + source = 'orig_image' + if colname == 'new': + source = 'new_image' + elif colname == 'external': + source = 'new_external_image' image = getattr(self.artwork_rows[row_index], source) item = QtWidgets.QTableWidgetItem() diff --git a/test/test_coverart_processing.py b/test/test_coverart_processing.py index 3c2fc7b6a..e16a15acb 100644 --- a/test/test_coverart_processing.py +++ b/test/test_coverart_processing.py @@ -115,7 +115,9 @@ class ImageProcessorsTest(PicardTestCase): 'cover_tags_maximum_height': 500, 'resize_images_saved_to_file': True, 'cover_file_maximum_width': 750, - 'cover_file_maximum_height': 750 + 'cover_file_maximum_height': 750, + 'save_images_to_tags': True, + 'save_images_to_files': True, } self.set_config_values(settings) sizes = [