diff --git a/picard/coverartproviders/caa.py b/picard/coverartproviders/caa.py index 44579ce23..a83a78c16 100644 --- a/picard/coverartproviders/caa.py +++ b/picard/coverartproviders/caa.py @@ -51,6 +51,7 @@ class CoverArtProviderCaa(CoverArtProvider): CoverArtProvider.__init__(self, coverart) self.caa_types = map(unicode.lower, config.setting["caa_image_types"]) self.len_caa_types = len(self.caa_types) + self.restrict_types = config.setting["caa_restrict_image_types"] @property def _has_suitable_artwork(self): @@ -69,29 +70,30 @@ class CoverArtProviderCaa(CoverArtProvider): % self.release.id) return False - want_front = 'front' in self.caa_types - want_back = 'back' in self.caa_types - caa_has_front = caa_node.front[0].text == 'true' - caa_has_back = caa_node.back[0].text == 'true' + if self.restrict_types: + want_front = 'front' in self.caa_types + want_back = 'back' in self.caa_types + caa_has_front = caa_node.front[0].text == 'true' + caa_has_back = caa_node.back[0].text == 'true' - if self.len_caa_types == 2 and (want_front or want_back): - # The OR cases are there to still download and process the CAA - # JSON file if front or back is enabled but not in the CAA and - # another type (that's neither front nor back) is enabled. - # For example, if both front and booklet are enabled and the - # CAA only has booklet images, the front element in the XML - # from the webservice will be false (thus front_in_caa is False - # as well) but it's still necessary to download the booklet - # images by using the fact that back is enabled but there are - # no back images in the CAA. - front_in_caa = caa_has_front or not want_front - back_in_caa = caa_has_back or not want_back - caa_has_suitable_artwork = front_in_caa or back_in_caa + if self.len_caa_types == 2 and (want_front or want_back): + # The OR cases are there to still download and process the CAA + # JSON file if front or back is enabled but not in the CAA and + # another type (that's neither front nor back) is enabled. + # For example, if both front and booklet are enabled and the + # CAA only has booklet images, the front element in the XML + # from the webservice will be false (thus front_in_caa is False + # as well) but it's still necessary to download the booklet + # images by using the fact that back is enabled but there are + # no back images in the CAA. + front_in_caa = caa_has_front or not want_front + back_in_caa = caa_has_back or not want_back + caa_has_suitable_artwork = front_in_caa or back_in_caa - elif self.len_caa_types == 1 and (want_front or want_back): - front_in_caa = caa_has_front and want_front - back_in_caa = caa_has_back and want_back - caa_has_suitable_artwork = front_in_caa or back_in_caa + elif self.len_caa_types == 1 and (want_front or want_back): + front_in_caa = caa_has_front and want_front + back_in_caa = caa_has_back and want_back + caa_has_suitable_artwork = front_in_caa or back_in_caa if not caa_has_suitable_artwork: log.debug("There are no suitable images in the Cover Art Archive for %s" @@ -107,7 +109,7 @@ class CoverArtProviderCaa(CoverArtProvider): if not config.setting['ca_provider_use_caa']: log.debug("Cover Art Archive disabled by user") return False - if not self.len_caa_types: + if self.restrict_types and not self.len_caa_types: log.debug("User disabled all Cover Art Archive types") return False return self._has_suitable_artwork @@ -157,9 +159,12 @@ class CoverArtProviderCaa(CoverArtProvider): image["types"] = [u"unknown"] else: image["types"] = map(unicode.lower, image["types"]) - # only keep enabled caa types - types = set(image["types"]).intersection( - set(self.caa_types)) + if self.restrict_types: + # only keep enabled caa types + types = set(image["types"]).intersection( + set(self.caa_types)) + else: + types = True if types: if thumbsize is None or is_pdf: url = image["image"] diff --git a/picard/ui/options/cover.py b/picard/ui/options/cover.py index 5b0a58fc6..04d8b41aa 100644 --- a/picard/ui/options/cover.py +++ b/picard/ui/options/cover.py @@ -99,6 +99,8 @@ class CAATypesSelectorDialog(QtGui.QDialog): for item, typ in self._items.iteritems(): if item.isChecked(): types.append(typ['name']) + if not types: + return [u'front'] return types @staticmethod @@ -131,6 +133,7 @@ class CoverOptionsPage(OptionsPage): config.BoolOption("setting", "caa_image_type_as_filename", False), config.IntOption("setting", "caa_image_size", 1), config.ListOption("setting", "caa_image_types", [u"front"]), + config.BoolOption("setting", "caa_restrict_image_types", True), ] def __init__(self, parent=None): @@ -138,6 +141,7 @@ class CoverOptionsPage(OptionsPage): self.ui = Ui_CoverOptionsPage() self.ui.setupUi(self) self.ui.save_images_to_files.clicked.connect(self.update_filename) + self.ui.restrict_images_types.clicked.connect(self.update_caa_types) def load(self): self.ui.save_images_to_tags.setChecked(config.setting["save_images_to_tags"]) @@ -159,6 +163,10 @@ class CoverOptionsPage(OptionsPage): self.connect(self.ui.caprovider_caa, QtCore.SIGNAL("toggled(bool)"), self.ui.gb_caa.setEnabled) self.ui.select_caa_types.clicked.connect(self.select_caa_types) + self.ui.restrict_images_types.setChecked( + config.setting["caa_restrict_image_types"]) + self.update_caa_types() + self.update_filename() def save(self): config.setting["save_images_to_tags"] = self.ui.save_images_to_tags.isChecked() @@ -181,12 +189,18 @@ class CoverOptionsPage(OptionsPage): self.ui.cb_type_as_filename.isChecked() config.setting["save_images_overwrite"] = self.ui.save_images_overwrite.isChecked() + config.setting["caa_restrict_image_types"] = \ + self.ui.restrict_images_types.isChecked() def update_filename(self): enabled = self.ui.save_images_to_files.isChecked() self.ui.cover_image_filename.setEnabled(enabled) self.ui.save_images_overwrite.setEnabled(enabled) + def update_caa_types(self): + enabled = self.ui.restrict_images_types.isChecked() + self.ui.select_caa_types.setEnabled(enabled) + def select_caa_types(self): (types, ok) = CAATypesSelectorDialog.run( self, config.setting["caa_image_types"]) diff --git a/picard/ui/ui_options_cover.py b/picard/ui/ui_options_cover.py index f7e06cedd..3e8bb04cb 100644 --- a/picard/ui/ui_options_cover.py +++ b/picard/ui/ui_options_cover.py @@ -88,13 +88,13 @@ class Ui_CoverOptionsPage(object): self.cb_image_size.addItem(_fromUtf8("")) self.horizontalLayout.addWidget(self.cb_image_size) self.verticalLayout_3.addLayout(self.horizontalLayout) - self.horizontalLayout2 = QtGui.QHBoxLayout() - self.horizontalLayout2.setObjectName(_fromUtf8("horizontalLayout2")) - self.label1 = QtGui.QLabel(self.gb_caa) - self.label1.setObjectName(_fromUtf8("label1")) - self.horizontalLayout2.addWidget(self.label1) + self.select_caa_types_group = QtGui.QHBoxLayout() + self.select_caa_types_group.setObjectName(_fromUtf8("select_caa_types_group")) + self.restrict_images_types = QtGui.QCheckBox(self.gb_caa) + self.restrict_images_types.setObjectName(_fromUtf8("restrict_images_types")) + self.select_caa_types_group.addWidget(self.restrict_images_types) spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.horizontalLayout2.addItem(spacerItem1) + self.select_caa_types_group.addItem(spacerItem1) self.select_caa_types = QtGui.QPushButton(self.gb_caa) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(100) @@ -102,8 +102,8 @@ class Ui_CoverOptionsPage(object): sizePolicy.setHeightForWidth(self.select_caa_types.sizePolicy().hasHeightForWidth()) self.select_caa_types.setSizePolicy(sizePolicy) self.select_caa_types.setObjectName(_fromUtf8("select_caa_types")) - self.horizontalLayout2.addWidget(self.select_caa_types) - self.verticalLayout_3.addLayout(self.horizontalLayout2) + self.select_caa_types_group.addWidget(self.select_caa_types) + self.verticalLayout_3.addLayout(self.select_caa_types_group) self.cb_approved_only = QtGui.QCheckBox(self.gb_caa) self.cb_approved_only.setObjectName(_fromUtf8("cb_approved_only")) self.verticalLayout_3.addWidget(self.cb_approved_only) @@ -154,8 +154,8 @@ class Ui_CoverOptionsPage(object): self.cb_image_size.setItemText(0, _("250 px")) self.cb_image_size.setItemText(1, _("500 px")) self.cb_image_size.setItemText(2, _("Full size")) - self.label1.setText(_("Types of cover art to download:")) - self.select_caa_types.setText(_("Select...")) + self.restrict_images_types.setText(_("Download only cover art images matching selected types")) + self.select_caa_types.setText(_("Select types...")) self.cb_approved_only.setText(_("Download only approved images")) self.cb_type_as_filename.setText(_("Use the first image type as the filename. This will not change the filename of front images.")) self.caprovider_caa_release_group.setText(_("Use the image of the release group if no front image is associated with the release")) diff --git a/ui/options_cover.ui b/ui/options_cover.ui index 317d1ccb0..2f930ec4b 100644 --- a/ui/options_cover.ui +++ b/ui/options_cover.ui @@ -153,11 +153,11 @@ - + - + - Types of cover art to download: + Download only cover art images matching selected types @@ -177,7 +177,7 @@ - Select... + Select types...