diff --git a/picard/ui/mainwindow.py b/picard/ui/mainwindow.py index 9b352a539..6911324cd 100644 --- a/picard/ui/mainwindow.py +++ b/picard/ui/mainwindow.py @@ -591,7 +591,20 @@ class MainWindow(QtGui.QMainWindow): self.tagger.remove(self.panel.selected_objects()) def analyze(self): - self.tagger.analyze(self.panel.selected_objects()) + if not self.config.setting['enable_fingerprinting']: + if self.show_analyze_settings_info(): + self.show_options("fingerprinting") + if not self.config.setting['enable_fingerprinting']: + return + return self.tagger.analyze(self.panel.selected_objects()) + + def show_analyze_settings_info(self): + ret = QtGui.QMessageBox.question(self, + _(u"Configuration Required"), + _(u"Audio fingerprinting is not yet configured. Would you like to configure it now?"), + QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, + QtGui.QMessageBox.Yes) + return ret == QtGui.QMessageBox.Yes def edit_tags(self, objs=None): if not objs: @@ -617,10 +630,7 @@ class MainWindow(QtGui.QMainWindow): if obj is None: continue if obj.can_analyze(): - if self.tagger.use_acoustid: - can_analyze = True - elif picard.musicdns.ofa: - can_analyze = True + can_analyze = True if obj.can_save(): can_save = True if obj.can_remove(): diff --git a/picard/ui/options/fingerprinting.py b/picard/ui/options/fingerprinting.py index d02a83bbd..9b8ad3ce8 100644 --- a/picard/ui/options/fingerprinting.py +++ b/picard/ui/options/fingerprinting.py @@ -17,7 +17,8 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -import os +import os, sys +import picard.musicdns from PyQt4 import QtCore, QtGui from picard.util import webbrowser2 from picard.config import BoolOption, TextOption @@ -29,12 +30,13 @@ class FingerprintingOptionsPage(OptionsPage): NAME = "fingerprinting" TITLE = N_("Fingerprinting") - PARENT = "advanced" - SORT_ORDER = 35 + PARENT = None + SORT_ORDER = 45 ACTIVE = True options = [ - TextOption("setting", "fingerprinting_system", "musicdns"), + BoolOption("setting", "enable_fingerprinting", False), + TextOption("setting", "fingerprinting_system", "acoustid"), TextOption("setting", "acoustid_fpcalc", ""), TextOption("setting", "acoustid_apikey", ""), ] @@ -43,6 +45,7 @@ class FingerprintingOptionsPage(OptionsPage): super(FingerprintingOptionsPage, self).__init__(parent) self.ui = Ui_FingerprintingOptionsPage() self.ui.setupUi(self) + self.connect(self.ui.enable_fingerprinting, QtCore.SIGNAL("clicked()"), self.update_groupboxes) self.connect(self.ui.use_musicdns, QtCore.SIGNAL("clicked()"), self.update_groupboxes) self.connect(self.ui.use_acoustid, QtCore.SIGNAL("clicked()"), self.update_groupboxes) self.ui.acoustid_fpcalc_browse.clicked.connect(self.acoustid_fpcalc_browse) @@ -50,6 +53,9 @@ class FingerprintingOptionsPage(OptionsPage): self.ui.acoustid_apikey_get.clicked.connect(self.acoustid_apikey_get) def load(self): + self.ui.enable_fingerprinting.setChecked(self.config.setting["enable_fingerprinting"]) + if picard.musicdns.ofa is None: + self.ui.use_musicdns.setEnabled(False) if self.config.setting["fingerprinting_system"] == "acoustid": self.ui.use_acoustid.setChecked(True) else: @@ -59,6 +65,7 @@ class FingerprintingOptionsPage(OptionsPage): self.update_groupboxes() def save(self): + self.config.setting["enable_fingerprinting"] = self.ui.enable_fingerprinting.isChecked() if self.ui.use_acoustid.isChecked(): self.config.setting["fingerprinting_system"] = "acoustid" else: @@ -67,8 +74,12 @@ class FingerprintingOptionsPage(OptionsPage): self.config.setting["acoustid_apikey"] = unicode(self.ui.acoustid_apikey.text()) def update_groupboxes(self): - if self.ui.use_acoustid.isChecked(): + if self.ui.enable_fingerprinting.isChecked() and self.ui.use_acoustid.isChecked(): self.ui.acoustid_settings.setEnabled(True) + if self.ui.acoustid_fpcalc.text().isEmpty(): + fpcalc_path = self.find_executable("fpcalc") + if fpcalc_path: + self.ui.acoustid_fpcalc.setText(fpcalc_path) else: self.ui.acoustid_settings.setEnabled(False) @@ -84,5 +95,16 @@ class FingerprintingOptionsPage(OptionsPage): def acoustid_apikey_get(self): webbrowser2.open("http://acoustid.org/api-key") + def find_executable(self, name): + if sys.platform == 'win32': + executables = [name + '.exe'] + else: + executables = [name] + for path in os.environ.get('PATH', '').split(os.pathsep): + for executable in executables: + f = os.path.join(path, executable) + if os.path.isfile(f): + return f + register_options_page(FingerprintingOptionsPage) diff --git a/picard/ui/ui_options_fingerprinting.py b/picard/ui/ui_options_fingerprinting.py index e538b53e8..53549be8d 100644 --- a/picard/ui/ui_options_fingerprinting.py +++ b/picard/ui/ui_options_fingerprinting.py @@ -2,59 +2,65 @@ # Form implementation generated from reading ui file 'ui/options_fingerprinting.ui' # -# Created: Fri Oct 21 20:12:56 2011 -# by: PyQt4 UI code generator 4.7.4 +# Created: Sun Dec 4 00:12:39 2011 +# by: PyQt4 UI code generator 4.8.3 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui +try: + _fromUtf8 = QtCore.QString.fromUtf8 +except AttributeError: + _fromUtf8 = lambda s: s + class Ui_FingerprintingOptionsPage(object): def setupUi(self, FingerprintingOptionsPage): - FingerprintingOptionsPage.setObjectName("FingerprintingOptionsPage") - FingerprintingOptionsPage.resize(371, 305) + FingerprintingOptionsPage.setObjectName(_fromUtf8("FingerprintingOptionsPage")) + FingerprintingOptionsPage.resize(371, 408) self.verticalLayout = QtGui.QVBoxLayout(FingerprintingOptionsPage) - self.verticalLayout.setObjectName("verticalLayout") - self.groupBox = QtGui.QGroupBox(FingerprintingOptionsPage) - self.groupBox.setObjectName("groupBox") - self.gridLayout = QtGui.QGridLayout(self.groupBox) - self.gridLayout.setObjectName("gridLayout") - self.use_musicdns = QtGui.QRadioButton(self.groupBox) - self.use_musicdns.setObjectName("use_musicdns") - self.gridLayout.addWidget(self.use_musicdns, 0, 0, 1, 1) - self.use_acoustid = QtGui.QRadioButton(self.groupBox) - self.use_acoustid.setObjectName("use_acoustid") - self.gridLayout.addWidget(self.use_acoustid, 1, 0, 1, 1) - self.verticalLayout.addWidget(self.groupBox) + self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) + self.enable_fingerprinting = QtGui.QGroupBox(FingerprintingOptionsPage) + self.enable_fingerprinting.setCheckable(True) + self.enable_fingerprinting.setObjectName(_fromUtf8("enable_fingerprinting")) + self.verticalLayout_3 = QtGui.QVBoxLayout(self.enable_fingerprinting) + self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) + self.use_acoustid = QtGui.QRadioButton(self.enable_fingerprinting) + self.use_acoustid.setObjectName(_fromUtf8("use_acoustid")) + self.verticalLayout_3.addWidget(self.use_acoustid) + self.use_musicdns = QtGui.QRadioButton(self.enable_fingerprinting) + self.use_musicdns.setObjectName(_fromUtf8("use_musicdns")) + self.verticalLayout_3.addWidget(self.use_musicdns) + self.verticalLayout.addWidget(self.enable_fingerprinting) self.acoustid_settings = QtGui.QGroupBox(FingerprintingOptionsPage) - self.acoustid_settings.setObjectName("acoustid_settings") + self.acoustid_settings.setObjectName(_fromUtf8("acoustid_settings")) self.verticalLayout_2 = QtGui.QVBoxLayout(self.acoustid_settings) - self.verticalLayout_2.setObjectName("verticalLayout_2") + self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.label = QtGui.QLabel(self.acoustid_settings) - self.label.setObjectName("label") + self.label.setObjectName(_fromUtf8("label")) self.verticalLayout_2.addWidget(self.label) self.horizontalLayout_2 = QtGui.QHBoxLayout() - self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) self.acoustid_fpcalc = QtGui.QLineEdit(self.acoustid_settings) - self.acoustid_fpcalc.setObjectName("acoustid_fpcalc") + self.acoustid_fpcalc.setObjectName(_fromUtf8("acoustid_fpcalc")) self.horizontalLayout_2.addWidget(self.acoustid_fpcalc) self.acoustid_fpcalc_browse = QtGui.QPushButton(self.acoustid_settings) - self.acoustid_fpcalc_browse.setObjectName("acoustid_fpcalc_browse") + self.acoustid_fpcalc_browse.setObjectName(_fromUtf8("acoustid_fpcalc_browse")) self.horizontalLayout_2.addWidget(self.acoustid_fpcalc_browse) self.acoustid_fpcalc_download = QtGui.QPushButton(self.acoustid_settings) - self.acoustid_fpcalc_download.setObjectName("acoustid_fpcalc_download") + self.acoustid_fpcalc_download.setObjectName(_fromUtf8("acoustid_fpcalc_download")) self.horizontalLayout_2.addWidget(self.acoustid_fpcalc_download) self.verticalLayout_2.addLayout(self.horizontalLayout_2) self.label_2 = QtGui.QLabel(self.acoustid_settings) - self.label_2.setObjectName("label_2") + self.label_2.setObjectName(_fromUtf8("label_2")) self.verticalLayout_2.addWidget(self.label_2) self.horizontalLayout = QtGui.QHBoxLayout() - self.horizontalLayout.setObjectName("horizontalLayout") + self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.acoustid_apikey = QtGui.QLineEdit(self.acoustid_settings) - self.acoustid_apikey.setObjectName("acoustid_apikey") + self.acoustid_apikey.setObjectName(_fromUtf8("acoustid_apikey")) self.horizontalLayout.addWidget(self.acoustid_apikey) self.acoustid_apikey_get = QtGui.QPushButton(self.acoustid_settings) - self.acoustid_apikey_get.setObjectName("acoustid_apikey_get") + self.acoustid_apikey_get.setObjectName(_fromUtf8("acoustid_apikey_get")) self.horizontalLayout.addWidget(self.acoustid_apikey_get) self.verticalLayout_2.addLayout(self.horizontalLayout) self.verticalLayout.addWidget(self.acoustid_settings) @@ -65,10 +71,10 @@ class Ui_FingerprintingOptionsPage(object): QtCore.QMetaObject.connectSlotsByName(FingerprintingOptionsPage) def retranslateUi(self, FingerprintingOptionsPage): - self.groupBox.setTitle(_("Fingerprinting Systems")) - self.use_musicdns.setText(_("Use AmpliFIND (formerly MusicDNS)")) + self.enable_fingerprinting.setTitle(_("Audio Fingerprinting")) self.use_acoustid.setText(_("Use AcoustID")) - self.acoustid_settings.setTitle(_("AcoustID\'s Settings")) + self.use_musicdns.setText(_("Use AmpliFIND (formerly MusicDNS)")) + self.acoustid_settings.setTitle(_("AcoustID Settings")) self.label.setText(_("Fingerprint calculator:")) self.acoustid_fpcalc_browse.setText(_("Browse...")) self.acoustid_fpcalc_download.setText(_("Download...")) diff --git a/picard/ui/ui_options_interface.py b/picard/ui/ui_options_interface.py index c0e99bbde..76c208ac2 100644 --- a/picard/ui/ui_options_interface.py +++ b/picard/ui/ui_options_interface.py @@ -2,8 +2,8 @@ # Form implementation generated from reading ui file 'ui/options_interface.ui' # -# Created: Wed Oct 5 17:51:02 2011 -# by: PyQt4 UI code generator 4.8.5 +# Created: Sun Dec 4 00:06:45 2011 +# by: PyQt4 UI code generator 4.8.3 # # WARNING! All changes made in this file will be lost! diff --git a/picard/ui/ui_options_metadata.py b/picard/ui/ui_options_metadata.py index 1912d716b..c95697860 100644 --- a/picard/ui/ui_options_metadata.py +++ b/picard/ui/ui_options_metadata.py @@ -2,8 +2,8 @@ # Form implementation generated from reading ui file 'ui/options_metadata.ui' # -# Created: Mon Oct 17 14:24:15 2011 -# by: PyQt4 UI code generator 4.8.5 +# Created: Sun Dec 4 00:06:45 2011 +# by: PyQt4 UI code generator 4.8.3 # # WARNING! All changes made in this file will be lost! @@ -28,7 +28,6 @@ class Ui_MetadataOptionsPage(object): self.rename_files.setSizePolicy(sizePolicy) self.rename_files.setMinimumSize(QtCore.QSize(397, 135)) font = QtGui.QFont() - font.setKerning(False) self.rename_files.setFont(font) self.rename_files.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.rename_files.setObjectName(_fromUtf8("rename_files")) diff --git a/picard/ui/ui_options_plugins.py b/picard/ui/ui_options_plugins.py index 2aa01e2ac..aed25fd74 100644 --- a/picard/ui/ui_options_plugins.py +++ b/picard/ui/ui_options_plugins.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'ui/options_plugins.ui' # -# Created: Thu Sep 15 13:39:10 2011 +# Created: Sun Dec 4 00:06:45 2011 # by: PyQt4 UI code generator 4.8.3 # # WARNING! All changes made in this file will be lost! @@ -136,3 +136,4 @@ class Ui_PluginsOptionsPage(object): self.folder_open.setText(_("Open plugin folder")) self.plugin_download.setText(_("Download plugins")) self.groupBox.setTitle(_("Details")) + diff --git a/ui/options_fingerprinting.ui b/ui/options_fingerprinting.ui index d73202e2a..15a2665e0 100644 --- a/ui/options_fingerprinting.ui +++ b/ui/options_fingerprinting.ui @@ -7,37 +7,40 @@ 0 0 371 - 305 + 408 - + - Fingerprinting Systems + Audio Fingerprinting - - - - - Use AmpliFIND (formerly MusicDNS) - - - - + + true + + + Use AcoustID + + + + Use AmpliFIND (formerly MusicDNS) + + + - AcoustID's Settings + AcoustID Settings