Skip to content

Commit 1f92818

Browse files
committed
fixes
1 parent a9f6e85 commit 1f92818

File tree

10 files changed

+57
-57
lines changed

10 files changed

+57
-57
lines changed

docs/input/remote.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ might even be more than on DJ on different computers swapping back and
77
forth!
88

99
**What's Now Playing** supports a configuration where each setup has
10-
their own app configuration running. One or more installation on
11-
DJ computers sending the track information to a central one. That
10+
their own app configuration running. One or more installations on
11+
DJ computers send the track information to a central one. That
1212
central one will then perform any additional lookups and send the
1313
output to anything configured such as Twitch.
1414

nowplaying/inputs/icecast.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@
1010
import struct
1111
import urllib.parse
1212
from collections.abc import Callable
13-
from typing import TYPE_CHECKING, Any
13+
from typing import TYPE_CHECKING
1414

1515
if TYPE_CHECKING:
1616
import nowplaying.config
17+
from PySide6.QtCore import QSettings
1718
from PySide6.QtWidgets import QWidget
1819

20+
1921
logging.config.dictConfig({
2022
'version': 1,
2123
'disable_existing_loggers': True,
@@ -222,19 +224,19 @@ def install(self) -> bool:
222224

223225
#### Settings UI methods
224226

225-
def defaults(self, qsettings: Any) -> None:
227+
def defaults(self, qsettings: "QSettings") -> None:
226228
''' (re-)set the default configuration values for this plugin '''
227229
qsettings.setValue('icecast/port', '8000')
228230

229-
def load_settingsui(self, qwidget: Any) -> None:
231+
def load_settingsui(self, qwidget: "QWidget") -> None:
230232
''' load values from config and populate page '''
231233
qwidget.port_lineedit.setText(self.config.cparser.value('icecast/port')) # type: ignore
232234

233-
def save_settingsui(self, qwidget: Any) -> None:
235+
def save_settingsui(self, qwidget: "QWidget") -> None:
234236
''' take the settings page and save it '''
235237
self.config.cparser.setValue('icecast/port', qwidget.port_lineedit.text()) # type: ignore
236238

237-
def desc_settingsui(self, qwidget: Any) -> None:
239+
def desc_settingsui(self, qwidget: "QWidget") -> None:
238240
''' provide a description for the plugins page '''
239241
qwidget.setText('Icecast is a streaming broadcast protocol.'
240242
' This setting should be used for butt, MIXXX, and many others.')

nowplaying/inputs/jriver.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
if TYPE_CHECKING:
1919
import nowplaying.config
20+
from PySide6.QtCore import QSettings
2021
from PySide6.QtWidgets import QWidget
2122

2223

@@ -361,7 +362,7 @@ async def stop(self) -> None:
361362
self._connection_failed = False
362363
self._last_error_log_time = 0 # Reset logging timer
363364

364-
def defaults(self, qsettings: "QWidget") -> None:
365+
def defaults(self, qsettings: "QSettings") -> None:
365366
qsettings.setValue('jriver/host', None)
366367
qsettings.setValue('jriver/port', '52199')
367368
qsettings.setValue('jriver/username', None)

nowplaying/inputs/mpris2.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import pathlib
1515
import sys
1616
import urllib
17-
import urllib.request
17+
import urllib.parse
1818

1919
try:
2020
from dbus_fast.aio import MessageBus

nowplaying/inputs/remote.py

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
if TYPE_CHECKING:
1616
import nowplaying.config
17-
17+
from PySide6.QtCore import QSettings
1818

1919
class Plugin(InputPlugin): # pylint: disable=too-many-instance-attributes
2020
''' handler for NowPlaying '''
@@ -24,7 +24,9 @@ def __init__(self,
2424
qsettings: QWidget | None = None):
2525
super().__init__(config=config, qsettings=qsettings)
2626
self.displayname = "Remote"
27-
self.remotedbfile: str = config.cparser.value('remote/remotedb', type=str)
27+
self.remotedbfile = pathlib.Path(
28+
QStandardPaths.standardLocations(
29+
QStandardPaths.CacheLocation)[0]).joinpath('remotedb').joinpath("remote.db")
2830
self.remotedb: nowplaying.db.MetadataDB | None = None
2931
self.mixmode = "newest"
3032
self.event_handler = None
@@ -40,21 +42,16 @@ def _reset_meta(self):
4042
''' reset the metadata '''
4143
self.metadata = {'artist': None, 'title': None, 'filename': None}
4244

43-
def defaults(self, qsettings: QWidget) -> None:
44-
dbfile: pathlib.Path = pathlib.Path(
45-
QStandardPaths.standardLocations(
46-
QStandardPaths.CacheLocation)[0]).joinpath('remotedb').joinpath("remote.db")
47-
self.config.cparser.setValue('remote/remotedb', str(dbfile))
48-
4945
async def setup_watcher(self):
5046
''' set up a custom watch on the m3u dir so meta info
5147
can update on change'''
5248

5349
if self.observer:
5450
return
5551

52+
self.remotedbfile.unlink(missing_ok=True)
5653
logging.info("Opening %s for input", self.remotedbfile)
57-
self.observer = nowplaying.db.DBWatcher(databasefile=self.remotedbfile)
54+
self.observer = nowplaying.db.DBWatcher(databasefile=str(self.remotedbfile))
5855
self.observer.start(customhandler=self._read_track)
5956

6057
def _read_track(self, event):
@@ -76,7 +73,7 @@ def _read_track(self, event):
7673
async def start(self):
7774
''' setup the watcher to run in a separate thread '''
7875
await self.setup_watcher()
79-
self.remotedb = nowplaying.db.MetadataDB(databasefile=self.remotedbfile)
76+
self.remotedb = nowplaying.db.MetadataDB(databasefile=str(self.remotedbfile))
8077

8178
async def getplayingtrack(self):
8279
''' wrapper to call getplayingtrack '''
@@ -95,20 +92,20 @@ async def stop(self):
9592
def on_m3u_dir_button(self):
9693
''' filename button clicked action'''
9794

98-
def connect_settingsui(self, qwidget, uihelp):
95+
def connect_settingsui(self, qwidget: "QWidget", uihelp):
9996
''' connect m3u button to filename picker'''
10097
self.qwidget = qwidget
10198
self.uihelp = uihelp
10299

103-
def load_settingsui(self, qwidget):
100+
def load_settingsui(self, qwidget: "QWidget"):
104101
''' draw the plugin's settings page '''
105102

106-
def verify_settingsui(self, qwidget):
103+
def verify_settingsui(self, qwidget: "QWidget"):
107104
''' no verification to do '''
108105

109-
def save_settingsui(self, qwidget):
106+
def save_settingsui(self, qwidget: "QWidget"):
110107
''' take the settings page and save it '''
111108

112-
def desc_settingsui(self, qwidget):
109+
def desc_settingsui(self, qwidget: "QWidget"):
113110
''' description '''
114111
qwidget.setText('Remote gets input from one or more other WNP setups.')

nowplaying/plugin.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
if TYPE_CHECKING:
1010
import nowplaying.config
11-
11+
from PySide6.QtCore import QSettings # pylint: disable=no-name-in-module
1212

1313
class WNPBasePlugin:
1414
''' base class of plugins '''
@@ -34,7 +34,7 @@ def __init__(self,
3434

3535
#### Settings UI methods
3636

37-
def defaults(self, qsettings: QWidget) -> None:
37+
def defaults(self, qsettings: "QSettings") -> None:
3838
''' (re-)set the default configuration values for this plugin '''
3939

4040
def connect_settingsui(self, qwidget: QWidget, uihelp: object) -> None:

nowplaying/processes/trackpoll.py

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -423,28 +423,32 @@ async def _write_to_remote(self) -> None:
423423
except Exception: # pylint: disable=broad-except
424424
logging.exception('Failed to write debug JSON: %s')
425425

426-
async with aiohttp.ClientSession() as session:
427-
async with session.post(f'http://{server}:{port}/v1/remoteinput',
428-
json=remote_data) as response:
429-
logging.debug("Sending to %s:%s", server, port)
430-
if response.status == 200:
431-
try:
432-
result = await response.json()
433-
dbid = result.get('dbid')
434-
logging.debug('Remote server accepted track update, dbid: %s', dbid)
435-
except Exception as exc: # pylint: disable=broad-except
436-
logging.warning('Failed to parse remote server response: %s', exc)
437-
elif response.status == 403:
438-
logging.error('Remote server authentication failed - check remote secret')
439-
elif response.status == 405:
440-
logging.error('Remote server method not allowed - check endpoint')
441-
else:
442-
try:
443-
error_data = await response.json()
444-
error_msg = error_data.get('error', 'Unknown error')
445-
logging.error('Remote server returned %s: %s', response.status, error_msg)
446-
except Exception: # pylint: disable=broad-except
447-
logging.error('Remote server returned %s', response.status)
426+
try:
427+
async with aiohttp.ClientSession() as session:
428+
async with session.post(f'http://{server}:{port}/v1/remoteinput',
429+
json=remote_data) as response:
430+
logging.debug("Sending to %s:%s", server, port)
431+
if response.status == 200:
432+
try:
433+
result = await response.json()
434+
dbid = result.get('dbid')
435+
logging.debug('Remote server accepted track update, dbid: %s', dbid)
436+
except Exception as exc: # pylint: disable=broad-except
437+
logging.warning('Failed to parse remote server response: %s', exc)
438+
elif response.status == 403:
439+
logging.error('Remote server authentication failed - check remote secret')
440+
elif response.status == 405:
441+
logging.error('Remote server method not allowed - check endpoint')
442+
else:
443+
try:
444+
error_data = await response.json()
445+
error_msg = error_data.get('error', 'Unknown error')
446+
logging.error('Remote server returned %s: %s', response.status, error_msg)
447+
except Exception: # pylint: disable=broad-except
448+
logging.error('Remote server returned %s', response.status)
449+
450+
except Exception as exc: # pylint: disable=broad-except
451+
logging.exception('aiohttp setup failed: %s', exc)
448452

449453
async def _half_delay_write(self):
450454
try:

nowplaying/remote_settings.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import nowplaying.config
1313

1414

15-
class BeamSettings:
15+
class RemoteSettings:
1616
"""Handles beam/remote output settings UI."""
1717

1818
def __init__(self):
@@ -77,9 +77,7 @@ def save_settings(self):
7777
self.config.cparser.setValue('remote/enabled', enabled)
7878

7979
# Save server
80-
server = self.widget.server_lineedit.text().strip()
81-
if not server:
82-
server = 'localhost'
80+
server = self.widget.server_lineedit.text().strip() or 'localhost'
8381
self.config.cparser.setValue('remote/remote_server', server)
8482

8583
# Save port
@@ -101,7 +99,6 @@ def save_settings(self):
10199
def verify(widget: 'QWidget') -> bool:
102100
"""Verify beam settings."""
103101
# Basic validation - could be extended later
104-
if widget.enable_checkbox.isChecked():
105-
if not widget.server_lineedit.text().strip():
106-
raise PluginVerifyError("Server field is required when beam output is enabled")
102+
if widget.enable_checkbox.isChecked() and not widget.server_lineedit.text().strip():
103+
raise PluginVerifyError("Server field is required when beam output is enabled")
107104
return True

nowplaying/settingsui.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def __init__(self, tray: "nowplaying.tray.Tray"):
5858
'kick': nowplaying.kick.settings.KickSettings(),
5959
'kickchat': nowplaying.kick.settings.KickChatSettings(),
6060
'requests': nowplaying.trackrequests.RequestSettings(),
61-
'remote': nowplaying.remote_settings.BeamSettings(),
61+
'remote': nowplaying.remote_settings.RemoteSettings(),
6262
}
6363

6464
self.uihelp = None

tests-qt/test_systemtray.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import pytest
99
from PySide6.QtGui import QAction, QActionGroup, QIcon # pylint: disable=import-error, no-name-in-module
1010
from PySide6.QtWidgets import QMenu, QSystemTrayIcon # pylint: disable=import-error, no-name-in-module
11-
from PySide6.QtCore import QFileSystemWatcher # pylint: disable=import-error, no-name-in-module
1211

1312
import nowplaying.systemtray # pylint: disable=import-error
1413

0 commit comments

Comments
 (0)