feat: Refactor TaskHandlerRegistry to include db_session_factory and enhance sound playback handling for user tasks

This commit is contained in:
JSC
2025-08-28 23:36:30 +02:00
parent 6e74d9b940
commit 96801dc4d6
2 changed files with 28 additions and 10 deletions

View File

@@ -332,7 +332,7 @@ class SchedulerService:
# Execute the task # Execute the task
try: try:
handler_registry = TaskHandlerRegistry( 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) await handler_registry.execute_task(task)

View File

@@ -1,6 +1,7 @@
"""Task execution handlers for different task types.""" """Task execution handlers for different task types."""
from typing import Any, Dict, Optional from typing import Any, Dict, Optional
from collections.abc import Callable
from sqlmodel.ext.asyncio.session import AsyncSession from sqlmodel.ext.asyncio.session import AsyncSession
@@ -26,11 +27,13 @@ class TaskHandlerRegistry:
def __init__( def __init__(
self, self,
db_session: AsyncSession, db_session: AsyncSession,
db_session_factory: Callable[[], AsyncSession],
credit_service: CreditService, credit_service: CreditService,
player_service: PlayerService, player_service: PlayerService,
) -> None: ) -> None:
"""Initialize the task handler registry.""" """Initialize the task handler registry."""
self.db_session = db_session self.db_session = db_session
self.db_session_factory = db_session_factory
self.credit_service = credit_service self.credit_service = credit_service
self.player_service = player_service self.player_service = player_service
self.sound_repository = SoundRepository(db_session) self.sound_repository = SoundRepository(db_session)
@@ -91,18 +94,33 @@ class TaskHandlerRegistry:
except (ValueError, TypeError) as e: except (ValueError, TypeError) as e:
raise TaskExecutionError(f"Invalid sound_id format: {sound_id}") from e raise TaskExecutionError(f"Invalid sound_id format: {sound_id}") from e
# Get the sound from database # 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
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) sound = await self.sound_repository.get_by_id(sound_id_int)
if not sound: if not sound:
raise TaskExecutionError(f"Sound not found: {sound_id}") raise TaskExecutionError(f"Sound not found: {sound_id}")
# Play the sound through VLC
from app.services.vlc_player import VLCPlayerService from app.services.vlc_player import VLCPlayerService
vlc_service = VLCPlayerService(lambda: self.db_session) vlc_service = VLCPlayerService(self.db_session_factory)
await vlc_service.play_sound(sound) success = await vlc_service.play_sound(sound)
logger.info(f"Played sound {sound.filename} via scheduled task") 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: async def _handle_play_playlist(self, task: ScheduledTask) -> None:
"""Handle play playlist task.""" """Handle play playlist task."""