fix: make async threading work

This commit is contained in:
Radu C. Martin 2025-04-14 13:13:09 +02:00
parent 66f4e4e374
commit 79f72d0531
3 changed files with 20 additions and 3 deletions

View file

@ -1 +1 @@
3.11
3.13

View file

@ -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:

View file

@ -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",