From 88c7cab74050c1a5c2325d7c796bf235a044565f Mon Sep 17 00:00:00 2001 From: RumovZ Date: Wed, 29 Jul 2026 17:37:20 +0200 Subject: [PATCH 1/2] Save and restore webserver settings --- src/usdb_syncer/gui/webserver_dialog.py | 16 ++++++++++- src/usdb_syncer/settings.py | 36 +++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/usdb_syncer/gui/webserver_dialog.py b/src/usdb_syncer/gui/webserver_dialog.py index 8283f124..1d1e6d1a 100644 --- a/src/usdb_syncer/gui/webserver_dialog.py +++ b/src/usdb_syncer/gui/webserver_dialog.py @@ -2,7 +2,7 @@ from PySide6 import QtGui, QtWidgets -from usdb_syncer import errors +from usdb_syncer import errors, settings from usdb_syncer.gui import gui_utils, notification from usdb_syncer.gui.forms.WebserverDialog import Ui_Dialog from usdb_syncer.webserver import webserver @@ -17,6 +17,7 @@ def __init__(self, parent: QtWidgets.QWidget) -> None: self.setupUi(self) self._update_ui() self.edit_title.setPlaceholderText(webserver.DEFAULT_TITLE) + self._load_settings() self.button_start.clicked.connect(self._start) self.button_stop.clicked.connect(self._stop) @@ -40,6 +41,7 @@ def _update_ui(self) -> None: self.label_qrcode.setPixmap(pixmap) def _start(self) -> None: + self._save_settings() try: webserver.start( title=self.edit_title.text(), @@ -56,3 +58,15 @@ def _stop(self) -> None: webserver.stop() notification.success("Webserver stopped.") self._update_ui() + + def _load_settings(self) -> None: + self.edit_title.setText(settings.get_webserver_title()) + self.box_port.setValue(settings.get_webserver_port()) + self.checkBox_only_local_songs.setChecked(settings.get_webserver_local_songs_only()) + self.checkBox_allow_downloads.setChecked(settings.get_webserver_allow_downloads()) + + def _save_settings(self) -> None: + settings.set_webserver_title(self.edit_title.text()) + settings.set_webserver_port(self.box_port.value()) + settings.set_webserver_local_songs_only(self.checkBox_only_local_songs.isChecked()) + settings.set_webserver_allow_downloads(self.checkBox_allow_downloads.isChecked()) diff --git a/src/usdb_syncer/settings.py b/src/usdb_syncer/settings.py index 0c9916ff..e4ade214 100644 --- a/src/usdb_syncer/settings.py +++ b/src/usdb_syncer/settings.py @@ -222,6 +222,10 @@ class SettingKey(Enum): CUSTOM_META_DATA_COLUMNS = "custom_meta_data/columns" SAVED_SEARCHES = "saved_searches" DEFAULT_SAVED_SEARCH = "default_saved_search" + WEBSERVER_TITLE = "webserver/title" + WEBSERVER_PORT = "webserver/port" + WEBSERVER_LOCAL_SONGS_ONLY = "webserver/local_songs_only" + WEBSERVER_ALLOW_DOWNLOADS = "webserver/allow_downloads" class Encoding(Enum): @@ -1336,3 +1340,35 @@ def get_default_saved_search() -> str: def set_default_saved_search(name: str, temp: bool = False) -> None: _Settings.set(SettingKey.DEFAULT_SAVED_SEARCH, name, temp) + + +def get_webserver_title() -> str: + return _Settings.get(SettingKey.WEBSERVER_TITLE, "") + + +def set_webserver_title(title: str, temp: bool = False) -> None: + _Settings.set(SettingKey.WEBSERVER_TITLE, title, temp) + + +def get_webserver_port() -> int: + return _Settings.get(SettingKey.WEBSERVER_PORT, 0) + + +def set_webserver_port(port: int, temp: bool = False) -> None: + _Settings.set(SettingKey.WEBSERVER_PORT, port, temp) + + +def get_webserver_local_songs_only() -> bool: + return _Settings.get(SettingKey.WEBSERVER_LOCAL_SONGS_ONLY, True) + + +def set_webserver_local_songs_only(yes: bool, temp: bool = False) -> None: + _Settings.set(SettingKey.WEBSERVER_LOCAL_SONGS_ONLY, yes, temp) + + +def get_webserver_allow_downloads() -> bool: + return _Settings.get(SettingKey.WEBSERVER_ALLOW_DOWNLOADS, False) + + +def set_webserver_allow_downloads(yes: bool, temp: bool = False) -> None: + _Settings.set(SettingKey.WEBSERVER_ALLOW_DOWNLOADS, yes, temp) From 486e01b0225b560ebb9cbd1320388401cd6c6ea0 Mon Sep 17 00:00:00 2001 From: RumovZ Date: Wed, 29 Jul 2026 18:04:46 +0200 Subject: [PATCH 2/2] Add option to auto start webserver on launch --- CHANGELOG.md | 8 +++ src/usdb_syncer/gui/__init__.py | 16 ++++- src/usdb_syncer/gui/forms/WebserverDialog.ui | 9 ++- src/usdb_syncer/gui/webserver_dialog.py | 61 +++++++++++++++----- src/usdb_syncer/settings.py | 29 ++++++---- 5 files changed, 96 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d5b372a..c68faf9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ + + +# Changes + +## Features + +- Webserver settings are now saved and the webserver may be automatically started on app launch. + # Changes diff --git a/src/usdb_syncer/gui/__init__.py b/src/usdb_syncer/gui/__init__.py index 29ab9018..41dfdf4d 100644 --- a/src/usdb_syncer/gui/__init__.py +++ b/src/usdb_syncer/gui/__init__.py @@ -33,7 +33,14 @@ ) from usdb_syncer import sync_meta as sync_meta from usdb_syncer import usdb_song as usdb_song -from usdb_syncer.gui import events, hooks, notification, progress, theme +from usdb_syncer.gui import ( + events, + hooks, + notification, + progress, + theme, + webserver_dialog, +) from usdb_syncer.gui.fonts import get_version_font from usdb_syncer.webserver import webserver @@ -239,6 +246,13 @@ def _run_main() -> None: sys.exit(1) _maybe_copy_licenses() hooks.MainWindowDidLoad.call(mw) + if settings.get_webserver_auto_start(): + webserver_dialog.try_to_start_webserver( + port=settings.get_webserver_port(), + title=settings.get_webserver_title(), + show_nonlocal_songs=settings.get_webserver_show_nonlocal_songs(), + allow_downloading=settings.get_webserver_allow_downloading(), + ) def _run_preview(txt: Path) -> bool: diff --git a/src/usdb_syncer/gui/forms/WebserverDialog.ui b/src/usdb_syncer/gui/forms/WebserverDialog.ui index 2e7df7c4..590ba418 100644 --- a/src/usdb_syncer/gui/forms/WebserverDialog.ui +++ b/src/usdb_syncer/gui/forms/WebserverDialog.ui @@ -7,7 +7,7 @@ 0 0 348 - 350 + 368 @@ -76,6 +76,13 @@ + + + + Start webserver on app launch + + + diff --git a/src/usdb_syncer/gui/webserver_dialog.py b/src/usdb_syncer/gui/webserver_dialog.py index 1d1e6d1a..9d29d0e5 100644 --- a/src/usdb_syncer/gui/webserver_dialog.py +++ b/src/usdb_syncer/gui/webserver_dialog.py @@ -41,17 +41,12 @@ def _update_ui(self) -> None: self.label_qrcode.setPixmap(pixmap) def _start(self) -> None: - self._save_settings() - try: - webserver.start( - title=self.edit_title.text(), - port=self.box_port.value(), - show_nonlocal_songs=not self.checkBox_only_local_songs.isChecked(), - allow_downloading=self.checkBox_allow_downloads.isChecked(), - ) - notification.success("Webserver started successfully.") - except errors.WebserverError as e: - QtWidgets.QMessageBox.warning(None, "Failed to start webserver", str(e)) + try_to_start_webserver( + title=self.edit_title.text(), + port=self.box_port.value(), + show_nonlocal_songs=not self.checkBox_only_local_songs.isChecked(), + allow_downloading=self.checkBox_allow_downloads.isChecked(), + ) self._update_ui() def _stop(self) -> None: @@ -62,11 +57,47 @@ def _stop(self) -> None: def _load_settings(self) -> None: self.edit_title.setText(settings.get_webserver_title()) self.box_port.setValue(settings.get_webserver_port()) - self.checkBox_only_local_songs.setChecked(settings.get_webserver_local_songs_only()) - self.checkBox_allow_downloads.setChecked(settings.get_webserver_allow_downloads()) + self.checkBox_only_local_songs.setChecked( + not settings.get_webserver_show_nonlocal_songs() + ) + self.checkBox_allow_downloads.setChecked( + settings.get_webserver_allow_downloading() + ) + self.checkBox_auto_start.setChecked(settings.get_webserver_auto_start()) def _save_settings(self) -> None: settings.set_webserver_title(self.edit_title.text()) settings.set_webserver_port(self.box_port.value()) - settings.set_webserver_local_songs_only(self.checkBox_only_local_songs.isChecked()) - settings.set_webserver_allow_downloads(self.checkBox_allow_downloads.isChecked()) + settings.set_webserver_show_nonlocal_songs( + not self.checkBox_only_local_songs.isChecked() + ) + settings.set_webserver_allow_downloading( + self.checkBox_allow_downloads.isChecked() + ) + settings.set_webserver_auto_start(self.checkBox_auto_start.isChecked()) + + def accept(self) -> None: + self._save_settings() + super().accept() + + def reject(self) -> None: + self._save_settings() + super().reject() + + +def try_to_start_webserver( + port: int | None = None, + title: str | None = None, + show_nonlocal_songs: bool = False, + allow_downloading: bool = False, +) -> None: + try: + webserver.start( + port=port, + title=title, + show_nonlocal_songs=show_nonlocal_songs, + allow_downloading=allow_downloading, + ) + notification.success("Webserver started successfully.") + except errors.WebserverError as e: + QtWidgets.QMessageBox.warning(None, "Failed to start webserver", str(e)) diff --git a/src/usdb_syncer/settings.py b/src/usdb_syncer/settings.py index e4ade214..c4750f02 100644 --- a/src/usdb_syncer/settings.py +++ b/src/usdb_syncer/settings.py @@ -224,8 +224,9 @@ class SettingKey(Enum): DEFAULT_SAVED_SEARCH = "default_saved_search" WEBSERVER_TITLE = "webserver/title" WEBSERVER_PORT = "webserver/port" - WEBSERVER_LOCAL_SONGS_ONLY = "webserver/local_songs_only" - WEBSERVER_ALLOW_DOWNLOADS = "webserver/allow_downloads" + WEBSERVER_SHOW_NONLOCAL_SONGS = "webserver/show_nonlocal_songs" + WEBSERVER_ALLOW_DOWNLOADING = "webserver/allow_downloading" + WEBSERVER_AUTO_START = "webserver/auto_start" class Encoding(Enum): @@ -1358,17 +1359,25 @@ def set_webserver_port(port: int, temp: bool = False) -> None: _Settings.set(SettingKey.WEBSERVER_PORT, port, temp) -def get_webserver_local_songs_only() -> bool: - return _Settings.get(SettingKey.WEBSERVER_LOCAL_SONGS_ONLY, True) +def get_webserver_show_nonlocal_songs() -> bool: + return _Settings.get(SettingKey.WEBSERVER_SHOW_NONLOCAL_SONGS, True) -def set_webserver_local_songs_only(yes: bool, temp: bool = False) -> None: - _Settings.set(SettingKey.WEBSERVER_LOCAL_SONGS_ONLY, yes, temp) +def set_webserver_show_nonlocal_songs(yes: bool, temp: bool = False) -> None: + _Settings.set(SettingKey.WEBSERVER_SHOW_NONLOCAL_SONGS, yes, temp) -def get_webserver_allow_downloads() -> bool: - return _Settings.get(SettingKey.WEBSERVER_ALLOW_DOWNLOADS, False) +def get_webserver_allow_downloading() -> bool: + return _Settings.get(SettingKey.WEBSERVER_ALLOW_DOWNLOADING, False) -def set_webserver_allow_downloads(yes: bool, temp: bool = False) -> None: - _Settings.set(SettingKey.WEBSERVER_ALLOW_DOWNLOADS, yes, temp) +def set_webserver_allow_downloading(yes: bool, temp: bool = False) -> None: + _Settings.set(SettingKey.WEBSERVER_ALLOW_DOWNLOADING, yes, temp) + + +def get_webserver_auto_start() -> bool: + return _Settings.get(SettingKey.WEBSERVER_AUTO_START, False) + + +def set_webserver_auto_start(yes: bool, temp: bool = False) -> None: + _Settings.set(SettingKey.WEBSERVER_AUTO_START, yes, temp)