Getting closer

This commit is contained in:
Christoph Stahl 2024-10-09 18:31:11 +02:00
parent 15cc8f8147
commit e51acd075a
4 changed files with 29 additions and 25 deletions

View file

@ -164,8 +164,9 @@ class Client:
:rtype: None :rtype: None
""" """
logger.info("Skipping current") logger.info("Skipping current")
if self.state.current_source is not None: self.player.skip_current()
await self.state.current_source.skip_current(Entry(**data)) # 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: async def handle_state(self, data: dict[str, Any]) -> None:
""" """
@ -247,7 +248,7 @@ class Client:
:type entry: :py:class:`Entry` :type entry: :py:class:`Entry`
:rtype: None :rtype: None
""" """
self.player.queue_next(entry) await self.player.queue_next(entry)
async def handle_play(self, data: dict[str, Any]) -> None: async def handle_play(self, data: dict[str, Any]) -> None:
""" """
@ -302,7 +303,7 @@ class Client:
:type data: dict[str, Any] :type data: dict[str, Any]
:rtype: None :rtype: None
""" """
logger.info(f"Searching for: {data['query']}") print(f"Searching for: {data['query']}")
query = data["query"] query = data["query"]
sid = data["sid"] sid = data["sid"]
results_list = await asyncio.gather( results_list = await asyncio.gather(
@ -421,7 +422,7 @@ class Client:
""" """
engineio.async_client.async_signal_handler() engineio.async_client.async_signal_handler()
if self.state.current_source is not None: 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() self.state.current_source.player.kill()
async def start_client(self, config: dict[str, Any]) -> None: async def start_client(self, config: dict[str, Any]) -> None:
@ -469,7 +470,7 @@ class Client:
pass pass
finally: finally:
if self.state.current_source is not None: 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() self.state.current_source.player.kill()

View file

@ -1,3 +1,4 @@
import asyncio
import sys import sys
import tempfile import tempfile
from typing import Iterable, Optional from typing import Iterable, Optional
@ -35,10 +36,6 @@ class Player:
if self.audio: if self.audio:
self.mpv.audio_add(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): def __init__(self):
self.mpv = mpv.MPV(ytdl=True, input_default_bindings=True, input_vo_keyboard=True, osc=True) self.mpv = mpv.MPV(ytdl=True, input_default_bindings=True, input_vo_keyboard=True, osc=True)
self.mpv.keep_open = "yes" self.mpv.keep_open = "yes"
@ -52,18 +49,17 @@ class Player:
self.mpv.play( self.mpv.play(
f"{__dirname__}/static/background.png", f"{__dirname__}/static/background.png",
) )
self.callback = lambda: None
self.mpv.register_event_callback(self.event_handler) 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-width", self.osd_size_handler)
self.mpv.observe_property("osd-height", 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): # def play_entry(self, entry: Entry, video: str, audio: Optional[str] = None):
self.queue_next(entry) # self.queue_next(entry)
self.play(video, audio) # 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) self.play_image(f"{__dirname__}/static/background20perc.png", 3)
frame = sys._getframe() frame = sys._getframe()
@ -81,7 +77,7 @@ class Player:
self.mpv.sub_pos = 50 self.mpv.sub_pos = 50
self.mpv.sub_add(f"python://{stream_name}") 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): def play_image(self, image: str, duration: int):
self.mpv.image_display_duration = duration self.mpv.image_display_duration = duration
@ -89,9 +85,16 @@ class Player:
self.mpv.play(image) self.mpv.play(image)
self.mpv.pause = False 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.audio = audio
self.mpv.pause = True self.mpv.pause = True
self.mpv.play(video) self.mpv.play(video)
self.mpv.pause = False 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()

View file

@ -127,7 +127,7 @@ class Source(ABC):
""" """
self.downloaded_files: defaultdict[str, DLFilesEntry] = defaultdict(DLFilesEntry) self.downloaded_files: defaultdict[str, DLFilesEntry] = defaultdict(DLFilesEntry)
self._masterlock: asyncio.Lock = asyncio.Lock() 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._index: list[str] = config["index"] if "index" in config else []
self.extra_mpv_arguments: list[str] = [] self.extra_mpv_arguments: list[str] = []
self._skip_next = False self._skip_next = False
@ -309,11 +309,11 @@ class Source(ABC):
# self.downloaded_files[entry.ident].audio, # self.downloaded_files[entry.ident].audio,
# *extra_options, # *extra_options,
# ) # )
player.play( await player.play(
self.downloaded_files[entry.ident].video, self.downloaded_files[entry.ident].audio self.downloaded_files[entry.ident].video, self.downloaded_files[entry.ident].audio
) )
# await self.player.wait() # await self.player.wait()
self.player = None # self.player = None
if self._skip_next: if self._skip_next:
self._skip_next = False self._skip_next = False
entry.skip = True entry.skip = True
@ -338,8 +338,8 @@ class Source(ABC):
buffer_task.cancel() buffer_task.cancel()
self.downloaded_files[entry.ident].ready.set() self.downloaded_files[entry.ident].ready.set()
if self.player is not None: # if self.player is not None:
self.player.kill() # self.player.kill()
async def ensure_playable(self, entry: Entry) -> None: async def ensure_playable(self, entry: Entry) -> None:
""" """

View file

@ -263,7 +263,7 @@ class YoutubeSource(Source):
# mpv_options, # mpv_options,
# ) # )
# await self.player.wait() # await self.player.wait()
player.play(entry.ident) await player.play(entry.ident)
else: else:
await super().play(entry, player, mpv_options) await super().play(entry, player, mpv_options)