From e51acd075a260342bd4f7075ae88c83e96c5e7c0 Mon Sep 17 00:00:00 2001 From: Christoph Stahl Date: Wed, 9 Oct 2024 18:31:11 +0200 Subject: [PATCH] Getting closer --- syng/client.py | 13 +++++++------ syng/player_libmpv.py | 29 ++++++++++++++++------------- syng/sources/source.py | 10 +++++----- syng/sources/youtube.py | 2 +- 4 files changed, 29 insertions(+), 25 deletions(-) diff --git a/syng/client.py b/syng/client.py index 7610cd9..4281665 100644 --- a/syng/client.py +++ b/syng/client.py @@ -164,8 +164,9 @@ class Client: :rtype: None """ logger.info("Skipping current") - if self.state.current_source is not None: - await self.state.current_source.skip_current(Entry(**data)) + self.player.skip_current() + # if self.state.current_source is not None: + # await self.state.current_source.skip_current(Entry(**data)) async def handle_state(self, data: dict[str, Any]) -> None: """ @@ -247,7 +248,7 @@ class Client: :type entry: :py:class:`Entry` :rtype: None """ - self.player.queue_next(entry) + await self.player.queue_next(entry) async def handle_play(self, data: dict[str, Any]) -> None: """ @@ -302,7 +303,7 @@ class Client: :type data: dict[str, Any] :rtype: None """ - logger.info(f"Searching for: {data['query']}") + print(f"Searching for: {data['query']}") query = data["query"] sid = data["sid"] results_list = await asyncio.gather( @@ -421,7 +422,7 @@ class Client: """ engineio.async_client.async_signal_handler() if self.state.current_source is not None: - if self.state.current_source.player is not None: + if self.state.current_source.player is not None: # TODO old player self.state.current_source.player.kill() async def start_client(self, config: dict[str, Any]) -> None: @@ -469,7 +470,7 @@ class Client: pass finally: if self.state.current_source is not None: - if self.state.current_source.player is not None: + if self.state.current_source.player is not None: # TODO old player self.state.current_source.player.kill() diff --git a/syng/player_libmpv.py b/syng/player_libmpv.py index b86a2f8..6b3d033 100644 --- a/syng/player_libmpv.py +++ b/syng/player_libmpv.py @@ -1,3 +1,4 @@ +import asyncio import sys import tempfile from typing import Iterable, Optional @@ -35,10 +36,6 @@ class Player: if self.audio: self.mpv.audio_add(self.audio) - def eof_handler(self, *args): - if self.mpv.filename not in ["background.png", "background20perc.png"]: - self.callback() - def __init__(self): self.mpv = mpv.MPV(ytdl=True, input_default_bindings=True, input_vo_keyboard=True, osc=True) self.mpv.keep_open = "yes" @@ -52,18 +49,17 @@ class Player: self.mpv.play( f"{__dirname__}/static/background.png", ) - self.callback = lambda: None self.mpv.register_event_callback(self.event_handler) - self.mpv.observe_property("eof-reached", self.eof_handler) self.mpv.observe_property("osd-width", self.osd_size_handler) self.mpv.observe_property("osd-height", self.osd_size_handler) - def play_entry(self, entry: Entry, video: str, audio: Optional[str] = None): - self.queue_next(entry) - self.play(video, audio) + # def play_entry(self, entry: Entry, video: str, audio: Optional[str] = None): + # self.queue_next(entry) + # self.play(video, audio) - def queue_next(self, entry: Entry): + async def queue_next(self, entry: Entry): + loop = asyncio.get_running_loop() self.play_image(f"{__dirname__}/static/background20perc.png", 3) frame = sys._getframe() @@ -81,7 +77,7 @@ class Player: self.mpv.sub_pos = 50 self.mpv.sub_add(f"python://{stream_name}") - self.mpv.wait_for_property("eof-reached") + await loop.run_in_executor(None, self.mpv.wait_for_property, "eof-reached") def play_image(self, image: str, duration: int): self.mpv.image_display_duration = duration @@ -89,9 +85,16 @@ class Player: self.mpv.play(image) self.mpv.pause = False - def play(self, video: str, audio: Optional[str] = None): + async def play(self, video: str, audio: Optional[str] = None): + loop = asyncio.get_running_loop() self.audio = audio self.mpv.pause = True self.mpv.play(video) self.mpv.pause = False - self.mpv.wait_for_property("eof-reached") + await loop.run_in_executor(None, self.mpv.wait_for_property, "eof-reached") + + def skip_current(self): + self.mpv.playlist_append( + f"{__dirname__}/static/background.png", + ) + self.mpv.playlist_next() diff --git a/syng/sources/source.py b/syng/sources/source.py index b65e15e..878367f 100644 --- a/syng/sources/source.py +++ b/syng/sources/source.py @@ -127,7 +127,7 @@ class Source(ABC): """ self.downloaded_files: defaultdict[str, DLFilesEntry] = defaultdict(DLFilesEntry) self._masterlock: asyncio.Lock = asyncio.Lock() - self.player: Optional[asyncio.subprocess.Process] = None + # self.player: Optional[asyncio.subprocess.Process] = None self._index: list[str] = config["index"] if "index" in config else [] self.extra_mpv_arguments: list[str] = [] self._skip_next = False @@ -309,11 +309,11 @@ class Source(ABC): # self.downloaded_files[entry.ident].audio, # *extra_options, # ) - player.play( + await player.play( self.downloaded_files[entry.ident].video, self.downloaded_files[entry.ident].audio ) # await self.player.wait() - self.player = None + # self.player = None if self._skip_next: self._skip_next = False entry.skip = True @@ -338,8 +338,8 @@ class Source(ABC): buffer_task.cancel() self.downloaded_files[entry.ident].ready.set() - if self.player is not None: - self.player.kill() + # if self.player is not None: + # self.player.kill() async def ensure_playable(self, entry: Entry) -> None: """ diff --git a/syng/sources/youtube.py b/syng/sources/youtube.py index 3df32e0..9a72a0c 100644 --- a/syng/sources/youtube.py +++ b/syng/sources/youtube.py @@ -263,7 +263,7 @@ class YoutubeSource(Source): # mpv_options, # ) # await self.player.wait() - player.play(entry.ident) + await player.play(entry.ident) else: await super().play(entry, player, mpv_options)