From 6e74d9b9404336d687efb2e8891fc70e6dea027e Mon Sep 17 00:00:00 2001 From: JSC Date: Thu, 28 Aug 2025 22:50:57 +0200 Subject: [PATCH] feat: Add load_playlist method to PlayerService and update task handlers for playlist management --- app/services/player.py | 20 ++++++++++++++++++++ app/services/task_handlers.py | 23 ++++++++++++++--------- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/app/services/player.py b/app/services/player.py index 348e9df..3d826e5 100644 --- a/app/services/player.py +++ b/app/services/player.py @@ -429,6 +429,26 @@ class PlayerService: await self._broadcast_state() + async def load_playlist(self, playlist_id: int) -> None: + """Load a specific playlist by ID.""" + session = self.db_session_factory() + try: + playlist_repo = PlaylistRepository(session) + playlist = await playlist_repo.get_by_id(playlist_id) + if playlist and playlist.id: + sounds = await playlist_repo.get_playlist_sounds(playlist.id) + await self._handle_playlist_reload(playlist, sounds) + logger.info( + "Loaded playlist: %s (%s sounds)", + playlist.name, + len(sounds), + ) + else: + logger.warning("Playlist not found: %s", playlist_id) + finally: + await session.close() + await self._broadcast_state() + async def _handle_playlist_reload( self, current_playlist: Playlist, diff --git a/app/services/task_handlers.py b/app/services/task_handlers.py index 7599945..6aa3bad 100644 --- a/app/services/task_handlers.py +++ b/app/services/task_handlers.py @@ -1,6 +1,5 @@ """Task execution handlers for different task types.""" -import uuid from typing import Any, Dict, Optional from sqlmodel.ext.asyncio.session import AsyncSession @@ -66,8 +65,12 @@ class TaskHandlerRegistry: if user_id: # Recharge specific user - user_uuid = uuid.UUID(user_id) if isinstance(user_id, str) else user_id - stats = await self.credit_service.recharge_user_credits(user_uuid) + try: + user_id_int = int(user_id) + except (ValueError, TypeError) as e: + raise TaskExecutionError(f"Invalid user_id format: {user_id}") from e + + stats = await self.credit_service.recharge_user_credits(user_id_int) logger.info(f"Recharged credits for user {user_id}: {stats}") else: # Recharge all users (system task) @@ -83,12 +86,13 @@ class TaskHandlerRegistry: raise TaskExecutionError("sound_id parameter is required for PLAY_SOUND tasks") try: - sound_uuid = uuid.UUID(sound_id) if isinstance(sound_id, str) else sound_id + # Handle both integer and string sound IDs + sound_id_int = int(sound_id) except (ValueError, TypeError) as e: raise TaskExecutionError(f"Invalid sound_id format: {sound_id}") from e # Get the sound from database - sound = await self.sound_repository.get_by_id(sound_uuid) + sound = await self.sound_repository.get_by_id(sound_id_int) if not sound: raise TaskExecutionError(f"Sound not found: {sound_id}") @@ -111,17 +115,18 @@ class TaskHandlerRegistry: raise TaskExecutionError("playlist_id parameter is required for PLAY_PLAYLIST tasks") try: - playlist_uuid = uuid.UUID(playlist_id) if isinstance(playlist_id, str) else playlist_id + # Handle both integer and string playlist IDs + playlist_id_int = int(playlist_id) except (ValueError, TypeError) as e: raise TaskExecutionError(f"Invalid playlist_id format: {playlist_id}") from e # Get the playlist from database - playlist = await self.playlist_repository.get_by_id(playlist_uuid) + playlist = await self.playlist_repository.get_by_id(playlist_id_int) if not playlist: raise TaskExecutionError(f"Playlist not found: {playlist_id}") # Load playlist in player - await self.player_service.load_playlist(playlist_uuid) + await self.player_service.load_playlist(playlist_id_int) # Set play mode if specified if play_mode in ["continuous", "loop", "loop_one", "random", "single"]: @@ -132,6 +137,6 @@ class TaskHandlerRegistry: self.player_service.set_shuffle(True) # Start playing - self.player_service.play() + await self.player_service.play() logger.info(f"Started playing playlist {playlist.name} via scheduled task") \ No newline at end of file