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

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