diff --git a/picard/acoustid/__init__.py b/picard/acoustid/__init__.py
index e820bccaa..8de8a00ad 100644
--- a/picard/acoustid/__init__.py
+++ b/picard/acoustid/__init__.py
@@ -7,6 +7,7 @@
# Copyright (C) 2018 Vishal Choudhary
# Copyright (C) 2018-2021 Laurent Monin
# Copyright (C) 2018-2022 Philipp Wolfer
+# Copyright (C) 2023 Bob Swift
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -73,7 +74,6 @@ class AcoustIDClient(QtCore.QObject):
super().__init__()
self._queue = deque()
self._running = 0
- self._max_processes = 2
self._acoustid_api = acoustid_api
def init(self):
@@ -82,6 +82,10 @@ class AcoustIDClient(QtCore.QObject):
def done(self):
pass
+ def get_max_processes(self):
+ config = get_config()
+ return config.setting['fpcalc_threads'] or 2
+
def _on_lookup_finished(self, task, document, http, error):
doc = {}
if error:
@@ -286,7 +290,7 @@ class AcoustIDClient(QtCore.QObject):
return
self._queue.append(task)
self._fpcalc = get_fpcalc()
- if self._running < self._max_processes:
+ if self._running < self.get_max_processes():
self._run_next_task()
def fingerprint(self, file, next_func):
diff --git a/picard/ui/options/fingerprinting.py b/picard/ui/options/fingerprinting.py
index 28a5ef404..6bae8524e 100644
--- a/picard/ui/options/fingerprinting.py
+++ b/picard/ui/options/fingerprinting.py
@@ -7,6 +7,7 @@
# Copyright (C) 2013, 2018, 2020-2021 Laurent Monin
# Copyright (C) 2015, 2020-2022 Philipp Wolfer
# Copyright (C) 2016-2017 Sambhav Kothari
+# Copyright (C) 2023 Bob Swift
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -34,6 +35,7 @@ from PyQt5 import (
from picard.acoustid import find_fpcalc
from picard.config import (
BoolOption,
+ IntOption,
TextOption,
get_config,
)
@@ -69,6 +71,7 @@ class FingerprintingOptionsPage(OptionsPage):
TextOption("setting", "fingerprinting_system", "acoustid"),
TextOption("setting", "acoustid_fpcalc", ""),
TextOption("setting", "acoustid_apikey", ""),
+ IntOption("setting", "fpcalc_threads", 2),
]
def __init__(self, parent=None):
@@ -95,6 +98,7 @@ class FingerprintingOptionsPage(OptionsPage):
self.ui.acoustid_apikey.setText(config.setting["acoustid_apikey"])
self.ui.ignore_existing_acoustid_fingerprints.setChecked(config.setting["ignore_existing_acoustid_fingerprints"])
self.ui.save_acoustid_fingerprints.setChecked(config.setting["save_acoustid_fingerprints"])
+ self.ui.fpcalc_threads.setValue(config.setting["fpcalc_threads"])
self.update_groupboxes()
def save(self):
@@ -107,6 +111,7 @@ class FingerprintingOptionsPage(OptionsPage):
config.setting["acoustid_apikey"] = self.ui.acoustid_apikey.text()
config.setting["ignore_existing_acoustid_fingerprints"] = self.ui.ignore_existing_acoustid_fingerprints.isChecked()
config.setting["save_acoustid_fingerprints"] = self.ui.save_acoustid_fingerprints.isChecked()
+ config.setting["fpcalc_threads"] = self.ui.fpcalc_threads.value()
def update_groupboxes(self):
if self.ui.use_acoustid.isChecked():
diff --git a/picard/ui/ui_options_fingerprinting.py b/picard/ui/ui_options_fingerprinting.py
index 793ce04d2..596490363 100644
--- a/picard/ui/ui_options_fingerprinting.py
+++ b/picard/ui/ui_options_fingerprinting.py
@@ -35,6 +35,25 @@ class Ui_FingerprintingOptionsPage(object):
self.save_acoustid_fingerprints = QtWidgets.QCheckBox(self.acoustid_settings)
self.save_acoustid_fingerprints.setObjectName("save_acoustid_fingerprints")
self.verticalLayout_2.addWidget(self.save_acoustid_fingerprints)
+ self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
+ self.horizontalLayout_3.setContentsMargins(-1, 0, -1, -1)
+ self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+ self.label_3 = QtWidgets.QLabel(self.acoustid_settings)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.label_3.sizePolicy().hasHeightForWidth())
+ self.label_3.setSizePolicy(sizePolicy)
+ self.label_3.setObjectName("label_3")
+ self.horizontalLayout_3.addWidget(self.label_3)
+ spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+ self.horizontalLayout_3.addItem(spacerItem)
+ self.fpcalc_threads = QtWidgets.QSpinBox(self.acoustid_settings)
+ self.fpcalc_threads.setMinimum(1)
+ self.fpcalc_threads.setMaximum(9)
+ self.fpcalc_threads.setObjectName("fpcalc_threads")
+ self.horizontalLayout_3.addWidget(self.fpcalc_threads)
+ self.verticalLayout_2.addLayout(self.horizontalLayout_3)
self.label = QtWidgets.QLabel(self.acoustid_settings)
self.label.setObjectName("label")
self.verticalLayout_2.addWidget(self.label)
@@ -67,8 +86,8 @@ class Ui_FingerprintingOptionsPage(object):
self.horizontalLayout.addWidget(self.acoustid_apikey_get)
self.verticalLayout_2.addLayout(self.horizontalLayout)
self.verticalLayout.addWidget(self.acoustid_settings)
- spacerItem = QtWidgets.QSpacerItem(181, 21, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
- self.verticalLayout.addItem(spacerItem)
+ spacerItem1 = QtWidgets.QSpacerItem(181, 21, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+ self.verticalLayout.addItem(spacerItem1)
self.retranslateUi(FingerprintingOptionsPage)
QtCore.QMetaObject.connectSlotsByName(FingerprintingOptionsPage)
@@ -81,6 +100,7 @@ class Ui_FingerprintingOptionsPage(object):
self.acoustid_settings.setTitle(_("AcoustID Settings"))
self.ignore_existing_acoustid_fingerprints.setText(_("Ignore existing AcoustID fingerprints"))
self.save_acoustid_fingerprints.setText(_("Save AcoustID fingerprints to file tags"))
+ self.label_3.setText(_("Maximum threads to use for calculator:"))
self.label.setText(_("Fingerprint calculator:"))
self.acoustid_fpcalc_browse.setText(_("Browse..."))
self.acoustid_fpcalc_download.setText(_("Download..."))
diff --git a/ui/options_fingerprinting.ui b/ui/options_fingerprinting.ui
index 174753af4..21742fbb8 100644
--- a/ui/options_fingerprinting.ui
+++ b/ui/options_fingerprinting.ui
@@ -57,6 +57,49 @@
+ -
+
+
+ 0
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ Maximum threads to use for calculator:
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+ 1
+
+
+ 9
+
+
+
+
+
-