From 79f72d0531d00c1e9fc06fba5869866bfb06662d Mon Sep 17 00:00:00 2001 From: "Radu C. Martin" Date: Mon, 14 Apr 2025 13:13:09 +0200 Subject: [PATCH] fix: make async threading work --- .python-version | 2 +- music_player.py | 19 ++++++++++++++++++- pyproject.toml | 2 +- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/.python-version b/.python-version index 2c07333..24ee5b1 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.11 +3.13 diff --git a/music_player.py b/music_player.py index eed20d4..cf8ab30 100644 --- a/music_player.py +++ b/music_player.py @@ -23,6 +23,7 @@ class PlaybackState(str, Enum): class PlayerState(BaseModel): playback_state: PlaybackState = PlaybackState.Stopped track: Track | None = None + position: int | None = None volume: float @@ -58,7 +59,7 @@ class MusicPlayer: # Threading self.lock = threading.Lock() self._running = True - self._thread = threading.Thread(target=self._loop, daemon=True) + self._thread = threading.Thread(target=self._run_async_loop, daemon=True) self._thread.start() # Queue @@ -66,6 +67,9 @@ class MusicPlayer: self._queue_lock: asyncio.Lock = asyncio.Lock() self._queue_event: asyncio.Event = asyncio.Event() + def _run_async_loop(self): + asyncio.run(self._loop()) + async def _loop(self): while self._running: for event in pygame.event.get(): @@ -73,8 +77,20 @@ class MusicPlayer: await self._handle_track_finished() await self._play_next_track() + await self._update_position() time.sleep(0.1) + async def _update_position(self): + new_pos = pygame.mixer.music.get_pos() // 1000 + # Changes only of fulls seconds + if new_pos != self._state.position: + if new_pos == -1: + self._state.position = None + else: + self._state.position = new_pos + + self._state_event.set() + async def _set_playback_state(self, value: PlaybackState): async with self._state_lock: self._state.playback_state = value @@ -83,6 +99,7 @@ class MusicPlayer: async def _set_track(self, track: Track | None): async with self._state_lock: self._state.track = track + self._state.position = 0 self._state_event.set() async def _handle_track_finished(self) -> None: diff --git a/pyproject.toml b/pyproject.toml index e4c94b3..40670a5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ name = "py-dj" version = "0.1.0" description = "Add your description here" readme = "README.md" -requires-python = ">=3.11" +requires-python = ">=3.13" dependencies = [ "fastapi[standard]>=0.115.12", "pydantic>=2.11.3",