diff --git a/picard/coverartproviders/__init__.py b/picard/coverartproviders/__init__.py index 26aa9c8c0..eeeb038ea 100644 --- a/picard/coverartproviders/__init__.py +++ b/picard/coverartproviders/__init__.py @@ -98,7 +98,9 @@ class CoverArtProvider: from picard.coverartproviders.caa import CoverArtProviderCaa from picard.coverartproviders.amazon import CoverArtProviderAmazon from picard.coverartproviders.whitelist import CoverArtProviderWhitelist +from picard.coverartproviders.caa_release_group import CoverArtProviderCaaReleaseGroup register_cover_art_provider(CoverArtProviderCaa) register_cover_art_provider(CoverArtProviderAmazon) register_cover_art_provider(CoverArtProviderWhitelist) +register_cover_art_provider(CoverArtProviderCaaReleaseGroup) diff --git a/picard/coverartproviders/caa_release_group.py b/picard/coverartproviders/caa_release_group.py new file mode 100644 index 000000000..a3e6e3bc1 --- /dev/null +++ b/picard/coverartproviders/caa_release_group.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +# +# Picard, the next-generation MusicBrainz tagger +# Copyright (C) 2014 Laurent Monin +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import traceback + +from picard import config, log +from picard.coverartproviders import CoverArtProvider +from picard.coverartimage import CoverArtImage +from picard.const import CAA_HOST, CAA_PORT + + +class CoverArtProviderCaaReleaseGroup(CoverArtProvider): + + """Use cover art from album release group""" + + NAME = "CaaReleaseGroup" + + def enabled(self): + if not config.setting['ca_provider_use_caa']: + log.debug("Cover art from Cover Art Archive disabled by user") + return False + if not config.setting['ca_provider_use_caa_release_group_fallback']: + log.debug("Release group cover art fallback disabled by user") + return False + return True + + def queue_downloads(self): + rg_id = self.metadata['musicbrainz_releasegroupid'] + url = 'http://%s:%s/release-group/%s/front.jpg' % (CAA_HOST, CAA_PORT, rg_id) + self.queue_put(CoverArtImage(url)) + return CoverArtProvider.FINISHED diff --git a/picard/ui/options/cover.py b/picard/ui/options/cover.py index f51df4640..ad7d77315 100644 --- a/picard/ui/options/cover.py +++ b/picard/ui/options/cover.py @@ -74,6 +74,8 @@ class CoverOptionsPage(OptionsPage): config.BoolOption("setting", "save_images_overwrite", False), config.BoolOption("setting", "ca_provider_use_amazon", True), config.BoolOption("setting", "ca_provider_use_caa", True), + config.BoolOption("setting", + "ca_provider_use_caa_release_group_fallback", False), config.BoolOption("setting", "ca_provider_use_whitelist", True), config.BoolOption("setting", "caa_approved_only", True), config.BoolOption("setting", "caa_image_type_as_filename", False), @@ -96,8 +98,11 @@ class CoverOptionsPage(OptionsPage): self.update_filename() self.ui.caprovider_amazon.setChecked(config.setting["ca_provider_use_amazon"]) self.ui.caprovider_caa.setChecked(config.setting["ca_provider_use_caa"]) + self.ui.caprovider_caa_release_group.setChecked( + config.setting["ca_provider_use_caa_release_group_fallback"]) self.ui.caprovider_whitelist.setChecked(config.setting["ca_provider_use_whitelist"]) self.ui.gb_caa.setEnabled(config.setting["ca_provider_use_caa"]) + self.ui.caprovider_caa_release_group.setEnabled(config.setting["ca_provider_use_caa"]) self.ui.cb_image_size.setCurrentIndex(config.setting["caa_image_size"]) widget = self.ui.caa_types_selector_1 @@ -107,6 +112,8 @@ class CoverOptionsPage(OptionsPage): self.ui.cb_type_as_filename.setChecked(config.setting["caa_image_type_as_filename"]) self.connect(self.ui.caprovider_caa, QtCore.SIGNAL("toggled(bool)"), self.ui.gb_caa.setEnabled) + self.connect(self.ui.caprovider_caa, QtCore.SIGNAL("toggled(bool)"), + self.ui.caprovider_caa_release_group.setEnabled) def save(self): config.setting["save_images_to_tags"] = self.ui.save_images_to_tags.isChecked() @@ -117,6 +124,8 @@ class CoverOptionsPage(OptionsPage): self.ui.caprovider_amazon.isChecked() config.setting["ca_provider_use_caa"] =\ self.ui.caprovider_caa.isChecked() + config.setting["ca_provider_use_caa_release_group_fallback"] =\ + self.ui.caprovider_caa_release_group.isChecked() config.setting["ca_provider_use_whitelist"] =\ self.ui.caprovider_whitelist.isChecked() config.setting["caa_image_size"] =\ diff --git a/picard/ui/ui_options_cover.py b/picard/ui/ui_options_cover.py index b82005bd0..dbcdbe9ab 100644 --- a/picard/ui/ui_options_cover.py +++ b/picard/ui/ui_options_cover.py @@ -8,7 +8,16 @@ from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: - _fromUtf8 = lambda s: s + def _fromUtf8(s): + return s + +try: + _encoding = QtGui.QApplication.UnicodeUTF8 + def _translate(context, text, disambig): + return QtGui.QApplication.translate(context, text, disambig, _encoding) +except AttributeError: + def _translate(context, text, disambig): + return QtGui.QApplication.translate(context, text, disambig) class Ui_CoverOptionsPage(object): def setupUi(self, CoverOptionsPage): @@ -51,6 +60,10 @@ class Ui_CoverOptionsPage(object): self.caprovider_caa = QtGui.QCheckBox(self.groupBox) self.caprovider_caa.setObjectName(_fromUtf8("caprovider_caa")) self.verticalLayout_2.addWidget(self.caprovider_caa) + self.caprovider_caa_release_group = QtGui.QCheckBox(self.groupBox) + self.caprovider_caa_release_group.setEnabled(False) + self.caprovider_caa_release_group.setObjectName(_fromUtf8("caprovider_caa_release_group")) + self.verticalLayout_2.addWidget(self.caprovider_caa_release_group) self.caprovider_whitelist = QtGui.QCheckBox(self.groupBox) self.caprovider_whitelist.setObjectName(_fromUtf8("caprovider_whitelist")) self.verticalLayout_2.addWidget(self.caprovider_whitelist) @@ -121,7 +134,8 @@ class Ui_CoverOptionsPage(object): CoverOptionsPage.setTabOrder(self.cover_image_filename, self.save_images_overwrite) CoverOptionsPage.setTabOrder(self.save_images_overwrite, self.caprovider_amazon) CoverOptionsPage.setTabOrder(self.caprovider_amazon, self.caprovider_caa) - CoverOptionsPage.setTabOrder(self.caprovider_caa, self.caprovider_whitelist) + CoverOptionsPage.setTabOrder(self.caprovider_caa, self.caprovider_caa_release_group) + CoverOptionsPage.setTabOrder(self.caprovider_caa_release_group, self.caprovider_whitelist) CoverOptionsPage.setTabOrder(self.caprovider_whitelist, self.cb_image_size) CoverOptionsPage.setTabOrder(self.cb_image_size, self.caa_types_selector_1) CoverOptionsPage.setTabOrder(self.caa_types_selector_1, self.cb_approved_only) @@ -137,6 +151,7 @@ class Ui_CoverOptionsPage(object): self.groupBox.setTitle(_("Coverart Providers")) self.caprovider_amazon.setText(_("Amazon")) self.caprovider_caa.setText(_("Cover Art Archive")) + self.caprovider_caa_release_group.setText(_("Fallback on Cover Art Archive release group image")) self.caprovider_whitelist.setText(_("Sites on the whitelist")) self.gb_caa.setTitle(_("Cover Art Archive")) self.label.setText(_("Only use images of the following size:")) diff --git a/ui/options_cover.ui b/ui/options_cover.ui index 5a0567326..0f25830d1 100644 --- a/ui/options_cover.ui +++ b/ui/options_cover.ui @@ -84,6 +84,16 @@ + + + + false + + + Fallback on Cover Art Archive release group image + + + @@ -236,6 +246,7 @@ save_images_overwrite caprovider_amazon caprovider_caa + caprovider_caa_release_group caprovider_whitelist cb_image_size caa_types_selector_1