feat: Refactor TaskHandlerRegistry to include db_session_factory and enhance sound playback handling for user tasks
This commit is contained in:
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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."""
|
||||||
|
|||||||
Reference in New Issue
Block a user