Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
<!-- 0.25.0 -->

# Changes

## Features

- Webserver settings are now saved and the webserver may be automatically started on app launch.

<!-- 0.24.0 -->

# Changes
Expand Down
16 changes: 15 additions & 1 deletion src/usdb_syncer/gui/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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:
Expand Down
9 changes: 8 additions & 1 deletion src/usdb_syncer/gui/forms/WebserverDialog.ui
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>348</width>
<height>350</height>
<height>368</height>
</rect>
</property>
<property name="windowTitle">
Expand Down Expand Up @@ -76,6 +76,13 @@
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="checkBox_auto_start">
<property name="text">
<string>Start webserver on app launch</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
Expand Down
67 changes: 56 additions & 11 deletions src/usdb_syncer/gui/webserver_dialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)

Expand All @@ -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))
45 changes: 45 additions & 0 deletions src/usdb_syncer/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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)