From ff238e2b6240ee77bbb4fb3ba46c86b00e72cb92 Mon Sep 17 00:00:00 2001 From: Laurent Monin Date: Tue, 9 Apr 2024 17:47:00 +0200 Subject: [PATCH] Let the user configure network cache size via Network Options --- picard/const/__init__.py | 3 +- picard/ui/options/network.py | 26 +++++++++ picard/ui/ui_options_network.py | 71 ++++++++++++++++-------- picard/webservice/__init__.py | 4 +- ui/options_network.ui | 95 +++++++++++++++++++++++---------- 5 files changed, 146 insertions(+), 53 deletions(-) diff --git a/picard/const/__init__.py b/picard/const/__init__.py index 911c674dd..d5a30175d 100644 --- a/picard/const/__init__.py +++ b/picard/const/__init__.py @@ -49,7 +49,8 @@ USER_DIR = appdirs.config_folder() USER_PLUGIN_DIR = appdirs.plugin_folder() # Network Cache default settings -CACHE_SIZE_IN_BYTES = 100*1000*1000 +CACHE_SIZE_DISPLAY_UNIT = 1000*1000 +CACHE_SIZE_IN_BYTES = 100*CACHE_SIZE_DISPLAY_UNIT # AcoustID client API key ACOUSTID_KEY = 'v8pQ6oyB' diff --git a/picard/ui/options/network.py b/picard/ui/options/network.py index 339852d10..2a8e0829e 100644 --- a/picard/ui/options/network.py +++ b/picard/ui/options/network.py @@ -28,6 +28,10 @@ from picard.config import ( TextOption, get_config, ) +from picard.const import ( + CACHE_SIZE_DISPLAY_UNIT, + CACHE_SIZE_IN_BYTES, +) from picard.ui.options import ( OptionsPage, @@ -56,6 +60,7 @@ class NetworkOptionsPage(OptionsPage): IntOption('setting', 'browser_integration_port', 8000), BoolOption('setting', 'browser_integration_localhost_only', True), IntOption('setting', 'network_transfer_timeout_seconds', 30), + IntOption('setting', 'network_cache_size_bytes', CACHE_SIZE_IN_BYTES), ] def __init__(self, parent=None): @@ -79,6 +84,7 @@ class NetworkOptionsPage(OptionsPage): self.ui.browser_integration_port.setValue(config.setting['browser_integration_port']) self.ui.browser_integration_localhost_only.setChecked( config.setting['browser_integration_localhost_only']) + self.cachesize2display(config) def save(self): config = get_config() @@ -100,6 +106,26 @@ class NetworkOptionsPage(OptionsPage): config.setting['browser_integration_localhost_only'] = \ self.ui.browser_integration_localhost_only.isChecked() self.tagger.update_browser_integration() + self.display2cachesize(config) + + def display2cachesize(self, config): + try: + cache_size = int(self.ui.network_cache_size.text()) + except ValueError: + return + if cache_size > 0: + config.setting['network_cache_size_bytes'] = int(cache_size * CACHE_SIZE_DISPLAY_UNIT) + + def cachesize2display(self, config): + try: + cache_size = int(config.setting['network_cache_size_bytes']) + except ValueError: + cache_size = -1 + + value = int(cache_size / CACHE_SIZE_DISPLAY_UNIT) + if cache_size <= 0: + value = CACHE_SIZE_IN_BYTES + self.ui.network_cache_size.setText(str(value)) register_options_page(NetworkOptionsPage) diff --git a/picard/ui/ui_options_network.py b/picard/ui/ui_options_network.py index afbdd51b2..9927a2586 100644 --- a/picard/ui/ui_options_network.py +++ b/picard/ui/ui_options_network.py @@ -1,6 +1,6 @@ # Form implementation generated from reading ui file 'ui/options_network.ui' # -# Created by: PyQt6 UI code generator 6.3.1 +# Created by: PyQt6 UI code generator 6.5.3 # # WARNING: Any manual changes made to this file will be lost when pyuic6 is # run again. Do not edit this file unless you know what you are doing. @@ -12,12 +12,12 @@ from PyQt6 import QtCore, QtGui, QtWidgets class Ui_NetworkOptionsPage(object): def setupUi(self, NetworkOptionsPage): NetworkOptionsPage.setObjectName("NetworkOptionsPage") - NetworkOptionsPage.resize(316, 371) + NetworkOptionsPage.resize(316, 491) self.vboxlayout = QtWidgets.QVBoxLayout(NetworkOptionsPage) self.vboxlayout.setContentsMargins(9, 9, 9, 9) self.vboxlayout.setSpacing(6) self.vboxlayout.setObjectName("vboxlayout") - self.web_proxy = QtWidgets.QGroupBox(NetworkOptionsPage) + self.web_proxy = QtWidgets.QGroupBox(parent=NetworkOptionsPage) self.web_proxy.setCheckable(True) self.web_proxy.setObjectName("web_proxy") self.gridlayout = QtWidgets.QGridLayout(self.web_proxy) @@ -26,48 +26,52 @@ class Ui_NetworkOptionsPage(object): self.gridlayout.setObjectName("gridlayout") self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.proxy_type_http = QtWidgets.QRadioButton(self.web_proxy) + self.proxy_type_http = QtWidgets.QRadioButton(parent=self.web_proxy) self.proxy_type_http.setChecked(True) self.proxy_type_http.setObjectName("proxy_type_http") self.horizontalLayout_2.addWidget(self.proxy_type_http) - self.proxy_type_socks = QtWidgets.QRadioButton(self.web_proxy) + self.proxy_type_socks = QtWidgets.QRadioButton(parent=self.web_proxy) self.proxy_type_socks.setObjectName("proxy_type_socks") self.horizontalLayout_2.addWidget(self.proxy_type_socks) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) self.horizontalLayout_2.addItem(spacerItem) self.gridlayout.addLayout(self.horizontalLayout_2, 0, 0, 1, 1) - self.server_host = QtWidgets.QLineEdit(self.web_proxy) + self.server_host = QtWidgets.QLineEdit(parent=self.web_proxy) self.server_host.setObjectName("server_host") self.gridlayout.addWidget(self.server_host, 5, 0, 1, 1) - self.username = QtWidgets.QLineEdit(self.web_proxy) + self.username = QtWidgets.QLineEdit(parent=self.web_proxy) self.username.setObjectName("username") self.gridlayout.addWidget(self.username, 7, 0, 1, 2) - self.password = QtWidgets.QLineEdit(self.web_proxy) + self.password = QtWidgets.QLineEdit(parent=self.web_proxy) self.password.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password) self.password.setObjectName("password") self.gridlayout.addWidget(self.password, 9, 0, 1, 2) - self.server_port = QtWidgets.QSpinBox(self.web_proxy) + self.server_port = QtWidgets.QSpinBox(parent=self.web_proxy) self.server_port.setMinimum(1) self.server_port.setMaximum(65535) self.server_port.setProperty("value", 80) self.server_port.setObjectName("server_port") self.gridlayout.addWidget(self.server_port, 5, 1, 1, 1) - self.label_6 = QtWidgets.QLabel(self.web_proxy) + self.label_6 = QtWidgets.QLabel(parent=self.web_proxy) self.label_6.setObjectName("label_6") self.gridlayout.addWidget(self.label_6, 6, 0, 1, 2) - self.label_7 = QtWidgets.QLabel(self.web_proxy) + self.label_7 = QtWidgets.QLabel(parent=self.web_proxy) self.label_7.setObjectName("label_7") self.gridlayout.addWidget(self.label_7, 4, 1, 1, 1) - self.label_5 = QtWidgets.QLabel(self.web_proxy) + self.label_5 = QtWidgets.QLabel(parent=self.web_proxy) self.label_5.setObjectName("label_5") self.gridlayout.addWidget(self.label_5, 8, 0, 1, 2) - self.label = QtWidgets.QLabel(self.web_proxy) + self.label = QtWidgets.QLabel(parent=self.web_proxy) self.label.setObjectName("label") self.gridlayout.addWidget(self.label, 4, 0, 1, 1) self.vboxlayout.addWidget(self.web_proxy) + self.networkopts = QtWidgets.QGroupBox(parent=NetworkOptionsPage) + self.networkopts.setObjectName("networkopts") + self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.networkopts) + self.verticalLayout_5.setObjectName("verticalLayout_5") self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") - self.label_3 = QtWidgets.QLabel(NetworkOptionsPage) + self.label_3 = QtWidgets.QLabel(parent=self.networkopts) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -75,13 +79,34 @@ class Ui_NetworkOptionsPage(object): self.label_3.setSizePolicy(sizePolicy) self.label_3.setObjectName("label_3") self.horizontalLayout_3.addWidget(self.label_3) - self.transfer_timeout = QtWidgets.QSpinBox(NetworkOptionsPage) + self.transfer_timeout = QtWidgets.QSpinBox(parent=self.networkopts) self.transfer_timeout.setMaximum(900) self.transfer_timeout.setProperty("value", 30) self.transfer_timeout.setObjectName("transfer_timeout") self.horizontalLayout_3.addWidget(self.transfer_timeout) - self.vboxlayout.addLayout(self.horizontalLayout_3) - self.browser_integration = QtWidgets.QGroupBox(NetworkOptionsPage) + self.verticalLayout_5.addLayout(self.horizontalLayout_3) + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.label_cache_size = QtWidgets.QLabel(parent=self.networkopts) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_cache_size.sizePolicy().hasHeightForWidth()) + self.label_cache_size.setSizePolicy(sizePolicy) + self.label_cache_size.setObjectName("label_cache_size") + self.horizontalLayout.addWidget(self.label_cache_size, 0, QtCore.Qt.AlignmentFlag.AlignLeft|QtCore.Qt.AlignmentFlag.AlignVCenter) + self.network_cache_size = QtWidgets.QLineEdit(parent=self.networkopts) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.network_cache_size.sizePolicy().hasHeightForWidth()) + self.network_cache_size.setSizePolicy(sizePolicy) + self.network_cache_size.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight|QtCore.Qt.AlignmentFlag.AlignTrailing|QtCore.Qt.AlignmentFlag.AlignVCenter) + self.network_cache_size.setObjectName("network_cache_size") + self.horizontalLayout.addWidget(self.network_cache_size) + self.verticalLayout_5.addLayout(self.horizontalLayout) + self.vboxlayout.addWidget(self.networkopts, 0, QtCore.Qt.AlignmentFlag.AlignVCenter) + self.browser_integration = QtWidgets.QGroupBox(parent=NetworkOptionsPage) self.browser_integration.setCheckable(True) self.browser_integration.setChecked(True) self.browser_integration.setObjectName("browser_integration") @@ -89,7 +114,7 @@ class Ui_NetworkOptionsPage(object): self.verticalLayout_2.setObjectName("verticalLayout_2") self.horizontalLayout_4 = QtWidgets.QHBoxLayout() self.horizontalLayout_4.setObjectName("horizontalLayout_4") - self.label_2 = QtWidgets.QLabel(self.browser_integration) + self.label_2 = QtWidgets.QLabel(parent=self.browser_integration) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -97,14 +122,14 @@ class Ui_NetworkOptionsPage(object): self.label_2.setSizePolicy(sizePolicy) self.label_2.setObjectName("label_2") self.horizontalLayout_4.addWidget(self.label_2) - self.browser_integration_port = QtWidgets.QSpinBox(self.browser_integration) + self.browser_integration_port = QtWidgets.QSpinBox(parent=self.browser_integration) self.browser_integration_port.setMinimum(1) self.browser_integration_port.setMaximum(65535) self.browser_integration_port.setProperty("value", 8000) self.browser_integration_port.setObjectName("browser_integration_port") self.horizontalLayout_4.addWidget(self.browser_integration_port) self.verticalLayout_2.addLayout(self.horizontalLayout_4) - self.browser_integration_localhost_only = QtWidgets.QCheckBox(self.browser_integration) + self.browser_integration_localhost_only = QtWidgets.QCheckBox(parent=self.browser_integration) self.browser_integration_localhost_only.setChecked(False) self.browser_integration_localhost_only.setObjectName("browser_integration_localhost_only") self.verticalLayout_2.addWidget(self.browser_integration_localhost_only) @@ -123,8 +148,8 @@ class Ui_NetworkOptionsPage(object): NetworkOptionsPage.setTabOrder(self.server_host, self.server_port) NetworkOptionsPage.setTabOrder(self.server_port, self.username) NetworkOptionsPage.setTabOrder(self.username, self.password) - NetworkOptionsPage.setTabOrder(self.password, self.transfer_timeout) - NetworkOptionsPage.setTabOrder(self.transfer_timeout, self.browser_integration) + NetworkOptionsPage.setTabOrder(self.password, self.network_cache_size) + NetworkOptionsPage.setTabOrder(self.network_cache_size, self.browser_integration) NetworkOptionsPage.setTabOrder(self.browser_integration, self.browser_integration_port) NetworkOptionsPage.setTabOrder(self.browser_integration_port, self.browser_integration_localhost_only) @@ -137,7 +162,9 @@ class Ui_NetworkOptionsPage(object): self.label_7.setText(_("Port:")) self.label_5.setText(_("Password:")) self.label.setText(_("Server address:")) + self.networkopts.setTitle(_("Network options")) self.label_3.setText(_("Request timeout in seconds:")) + self.label_cache_size.setText(_("Cache size (MB):")) self.browser_integration.setTitle(_("Browser Integration")) self.label_2.setText(_("Default listening port:")) self.browser_integration_localhost_only.setText(_("Listen only on localhost")) diff --git a/picard/webservice/__init__.py b/picard/webservice/__init__.py index e50ad01c5..8c2b08ecf 100644 --- a/picard/webservice/__init__.py +++ b/picard/webservice/__init__.py @@ -335,9 +335,9 @@ class WebService(QtCore.QObject): self.manager = QtNetwork.QNetworkAccessManager() self.manager.sslErrors.connect(self.ssl_errors) self.oauth_manager = OAuthManager(self) - self.set_cache() - self.setup_proxy() config = get_config() + self.set_cache(cache_size_in_bytes=config.setting['network_cache_size_bytes']) + self.setup_proxy() self.set_transfer_timeout(config.setting['network_transfer_timeout_seconds']) self.manager.finished.connect(self._process_reply) self._request_methods = { diff --git a/ui/options_network.ui b/ui/options_network.ui index 77b09f30c..9e06dc67f 100644 --- a/ui/options_network.ui +++ b/ui/options_network.ui @@ -7,7 +7,7 @@ 0 0 316 - 371 + 491 @@ -150,32 +150,71 @@ - - - - - - - 0 - 0 - - - - Request timeout in seconds: - - - - - - - 900 - - - 30 - - - - + + + + Network options + + + + + + + + + 0 + 0 + + + + Request timeout in seconds: + + + + + + + 900 + + + 30 + + + + + + + + + + + + 0 + 0 + + + + Cache size (MB): + + + + + + + + 0 + 0 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + @@ -255,7 +294,7 @@ server_port username password - transfer_timeout + network_cache_size browser_integration browser_integration_port browser_integration_localhost_only