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 8283f124..9d29d0e5 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,19 +41,63 @@ def _update_ui(self) -> None:
self.label_qrcode.setPixmap(pixmap)
def _start(self) -> None:
- 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:
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(
+ 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_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 0c9916ff..c4750f02 100644
--- a/src/usdb_syncer/settings.py
+++ b/src/usdb_syncer/settings.py
@@ -222,6 +222,11 @@ 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_SHOW_NONLOCAL_SONGS = "webserver/show_nonlocal_songs"
+ WEBSERVER_ALLOW_DOWNLOADING = "webserver/allow_downloading"
+ WEBSERVER_AUTO_START = "webserver/auto_start"
class Encoding(Enum):
@@ -1336,3 +1341,43 @@ 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_show_nonlocal_songs() -> bool:
+ return _Settings.get(SettingKey.WEBSERVER_SHOW_NONLOCAL_SONGS, True)
+
+
+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_downloading() -> bool:
+ return _Settings.get(SettingKey.WEBSERVER_ALLOW_DOWNLOADING, False)
+
+
+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)