From 96801dc4d6f6dca14746723d361708f8fa483f10 Mon Sep 17 00:00:00 2001 From: JSC Date: Thu, 28 Aug 2025 23:36:30 +0200 Subject: [PATCH] feat: Refactor TaskHandlerRegistry to include db_session_factory and enhance sound playback handling for user tasks --- app/services/scheduler.py | 2 +- app/services/task_handlers.py | 36 ++++++++++++++++++++++++++--------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/app/services/scheduler.py b/app/services/scheduler.py index 570f482..8feb226 100644 --- a/app/services/scheduler.py +++ b/app/services/scheduler.py @@ -332,7 +332,7 @@ class SchedulerService: # Execute the task try: handler_registry = TaskHandlerRegistry( - session, self.credit_service, self.player_service + session, self.db_session_factory, self.credit_service, self.player_service ) await handler_registry.execute_task(task) diff --git a/app/services/task_handlers.py b/app/services/task_handlers.py index 6aa3bad..017fac1 100644 --- a/app/services/task_handlers.py +++ b/app/services/task_handlers.py @@ -1,6 +1,7 @@ """Task execution handlers for different task types.""" from typing import Any, Dict, Optional +from collections.abc import Callable from sqlmodel.ext.asyncio.session import AsyncSession @@ -26,11 +27,13 @@ class TaskHandlerRegistry: def __init__( self, db_session: AsyncSession, + db_session_factory: Callable[[], AsyncSession], credit_service: CreditService, player_service: PlayerService, ) -> None: """Initialize the task handler registry.""" self.db_session = db_session + self.db_session_factory = db_session_factory self.credit_service = credit_service self.player_service = player_service self.sound_repository = SoundRepository(db_session) @@ -91,18 +94,33 @@ class TaskHandlerRegistry: 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_id_int) - if not sound: - raise TaskExecutionError(f"Sound not found: {sound_id}") + # Check if this is a user task (has user_id) + if task.user_id: + # User task: use credit-aware playback + from app.services.vlc_player import VLCPlayerService - # Play the sound through VLC - from app.services.vlc_player import VLCPlayerService + vlc_service = VLCPlayerService(self.db_session_factory) + try: + result = await vlc_service.play_sound_with_credits(sound_id_int, task.user_id) + logger.info(f"Played sound {result.get('sound_name', sound_id)} via scheduled task for user {task.user_id} (credits deducted: {result.get('credits_deducted', 0)})") + except Exception as e: + # Convert HTTP exceptions or credit errors to task execution errors + raise TaskExecutionError(f"Failed to play sound with credits: {str(e)}") from e + else: + # System task: play without credit deduction + sound = await self.sound_repository.get_by_id(sound_id_int) + if not sound: + raise TaskExecutionError(f"Sound not found: {sound_id}") - vlc_service = VLCPlayerService(lambda: self.db_session) - await vlc_service.play_sound(sound) + from app.services.vlc_player import VLCPlayerService - logger.info(f"Played sound {sound.filename} via scheduled task") + vlc_service = VLCPlayerService(self.db_session_factory) + success = await vlc_service.play_sound(sound) + + if not success: + raise TaskExecutionError(f"Failed to play sound {sound.filename}") + + logger.info(f"Played sound {sound.filename} via scheduled system task") async def _handle_play_playlist(self, task: ScheduledTask) -> None: """Handle play playlist task."""