Skipping playback now works reliably

This commit is contained in:
Christoph Stahl 2024-10-10 12:24:00 +02:00
parent 824198acf6
commit d4cf649735
3 changed files with 46 additions and 25 deletions

View file

@ -119,15 +119,21 @@ class State:
class Client:
def __init__(self, config: dict[str, Any]):
self.sio = socketio.AsyncClient(json=jsonencoder)
self.skipped = False
self.config = config
self.skipped = []
self.sources = configure_sources(config["sources"])
self.state = State()
self.currentLock = asyncio.Semaphore(0)
print("blubb")
self.player = Player()
self.player = Player(f"{config['config']['server']}/{config['config']['room']}", self.quit)
self.register_handlers()
def quit(self, event):
e = event.as_dict()
if e["event"] == b"shutdown":
quit()
# if value is None:
# return
# print(value)
def register_handlers(self) -> None:
self.sio.on("update_config", self.handle_update_config)
self.sio.on("skip-current", self.handle_skip_current)
@ -166,11 +172,12 @@ class Client:
:rtype: None
"""
logger.info("Skipping current")
self.skipped.append(data["uuid"])
entry = Entry(**data)
print("Skipping: ", entry.title)
source = self.sources[entry.source]
self.skipped = True
await source.skip_current(Entry(**data))
self.player.skip_current()
# if self.state.current_source is not None:
@ -283,20 +290,20 @@ class Client:
f"Playing: {entry.artist} - {entry.title} [{entry.album}] "
f"({entry.source}) for {entry.performer}"
)
print(entry)
print(self.skipped)
if entry.uuid not in self.skipped:
try:
# self.state.current_source = self.sources[entry.source]
if self.state.config["preview_duration"] > 0:
await self.preview(entry)
video, audio = await source.ensure_playable(entry)
if entry.uuid not in self.skipped:
self.skipped = []
await self.player.play(video, audio, source.extra_mpv_options)
# await self.sources[entry.source].play(
# entry, self.player, self.state.config["mpv_options"]
# )
except Exception: # pylint: disable=broad-except
print_exc()
self.state.current_source = None
if self.skipped:
self.skipped = False
self.skipped.remove(entry.uuid)
await self.sio.emit("get-first")
else:
await self.sio.emit("pop-then-get-next")
@ -353,14 +360,16 @@ class Client:
"""
if data["success"]:
logger.info("Registered")
qr_string = f"{self.state.config['server']}/{data['room']}"
self.player.update_qr(qr_string)
# this is borked on windows
if os.name != "nt":
print(f"Join here: {self.state.config['server']}/{data['room']}")
qr = QRCode(box_size=20, border=2)
qr.add_data(f"{self.state.config['server']}/{data['room']}")
qr.add_data(qr_string)
qr.make()
qr.print_ascii()
self.state.config["room"] = data["room"]
await self.sio.emit("sources", {"sources": list(self.sources.keys())})
if self.state.current_source is None: # A possible race condition can occur here

View file

@ -13,15 +13,15 @@ __dirname__ = os.path.dirname(__file__)
class Player:
def __init__(self) -> None:
def __init__(self, qr_string: str, quit_callback) -> None:
locale.setlocale(locale.LC_ALL, "C")
self.mpv = mpv.MPV(ytdl=True, input_default_bindings=True, input_vo_keyboard=True, osc=True)
self.mpv.title = "Syng - Player"
self.mpv.keep_open = "yes"
self.qr_overlay: Optional[mpv.ImageOverlay] = None
qr = QRCode(box_size=5, border=1)
qr.add_data("https://syng.rocks/")
qr.make()
self.qr = qr.make_image().convert("RGBA")
self.update_qr(
qr_string,
)
self.mpv.play(
f"{__dirname__}/static/background.png",
@ -33,6 +33,17 @@ class Player:
self.mpv.observe_property("osd-width", self.osd_size_handler)
self.mpv.observe_property("osd-height", self.osd_size_handler)
# self.mpv.register_event_callback(quit_callback)
# self.mpv.observe_property("exit-handler", quit_callback)
def event_printer(self, *args):
print(args)
def update_qr(self, qr_string: str) -> None:
qr = QRCode(box_size=5, border=1)
qr.add_data(qr_string)
qr.make()
self.qr = qr.make_image().convert("RGBA")
def osd_size_handler(self, attribute: str, value: int) -> None:
if self.qr_overlay:

View file

@ -16,6 +16,7 @@ class MPV:
sub_pos: int
osd_width: str
osd_height: str
title: str
def __init__(
self, ytdl: bool, input_default_bindings: bool, input_vo_keyboard: bool, osc: bool