feat: Enhance WebSocket sound playback with credit validation and refactor related methods
This commit is contained in:
@@ -5,6 +5,8 @@ import logging
|
||||
import socketio
|
||||
|
||||
from app.core.config import settings
|
||||
from app.core.database import get_session_factory
|
||||
from app.services.vlc_player import get_vlc_player_service
|
||||
from app.utils.auth import JWTUtils
|
||||
from app.utils.cookies import extract_access_token_from_cookies
|
||||
|
||||
@@ -102,44 +104,43 @@ class SocketManager:
|
||||
@self.sio.event
|
||||
async def play_sound(sid: str, data: dict) -> None:
|
||||
"""Handle play sound event from client."""
|
||||
user_id = self.socket_users.get(sid)
|
||||
await self._handle_play_sound(sid, data)
|
||||
|
||||
if not user_id:
|
||||
logger.warning("Play sound request from unknown client %s", sid)
|
||||
return
|
||||
async def _handle_play_sound(self, sid: str, data: dict) -> None:
|
||||
"""Handle play sound request from WebSocket client."""
|
||||
user_id = self.socket_users.get(sid)
|
||||
|
||||
sound_id = data.get("sound_id")
|
||||
if not sound_id:
|
||||
logger.warning(
|
||||
"Play sound request missing sound_id from user %s",
|
||||
user_id,
|
||||
)
|
||||
return
|
||||
if not user_id:
|
||||
logger.warning("Play sound request from unknown client %s", sid)
|
||||
return
|
||||
|
||||
try:
|
||||
# Import here to avoid circular imports
|
||||
from app.services.vlc_player import get_vlc_player_service
|
||||
from app.core.database import get_session_factory
|
||||
sound_id = data.get("sound_id")
|
||||
if not sound_id:
|
||||
logger.warning(
|
||||
"Play sound request missing sound_id from user %s",
|
||||
user_id,
|
||||
)
|
||||
return
|
||||
|
||||
# Get VLC player service with database factory
|
||||
vlc_player = get_vlc_player_service(get_session_factory())
|
||||
try:
|
||||
# Get VLC player service with database factory
|
||||
vlc_player = get_vlc_player_service(get_session_factory())
|
||||
|
||||
# Call the service method
|
||||
await vlc_player.play_sound_with_credits(int(sound_id), int(user_id))
|
||||
logger.info("User %s played sound %s via WebSocket", user_id, sound_id)
|
||||
except Exception as e:
|
||||
logger.exception(
|
||||
"Error playing sound %s for user %s: %s",
|
||||
sound_id,
|
||||
user_id,
|
||||
e,
|
||||
)
|
||||
# Emit error back to user
|
||||
await self.sio.emit(
|
||||
"sound_play_error",
|
||||
{"sound_id": sound_id, "error": str(e)},
|
||||
room=sid,
|
||||
)
|
||||
# Call the service method
|
||||
await vlc_player.play_sound_with_credits(int(sound_id), int(user_id))
|
||||
logger.info("User %s played sound %s via WebSocket", user_id, sound_id)
|
||||
except Exception as e:
|
||||
logger.exception(
|
||||
"Error playing sound %s for user %s",
|
||||
sound_id,
|
||||
user_id,
|
||||
)
|
||||
# Emit error back to user
|
||||
await self.sio.emit(
|
||||
"sound_play_error",
|
||||
{"sound_id": sound_id, "error": str(e)},
|
||||
room=sid,
|
||||
)
|
||||
|
||||
async def send_to_user(self, user_id: str, event: str, data: dict) -> bool:
|
||||
"""Send a message to a specific user's room."""
|
||||
|
||||
@@ -6,6 +6,7 @@ from collections.abc import Callable
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
from fastapi import HTTPException, status
|
||||
from sqlmodel.ext.asyncio.session import AsyncSession
|
||||
|
||||
from app.core.logging import get_logger
|
||||
@@ -14,6 +15,7 @@ from app.models.sound import Sound
|
||||
from app.models.sound_played import SoundPlayed
|
||||
from app.repositories.sound import SoundRepository
|
||||
from app.repositories.user import UserRepository
|
||||
from app.services.credit import CreditService, InsufficientCreditsError
|
||||
from app.services.socket import socket_manager
|
||||
from app.utils.audio import get_sound_file_path
|
||||
|
||||
@@ -309,7 +311,9 @@ class VLCPlayerService:
|
||||
await session.close()
|
||||
|
||||
async def play_sound_with_credits(
|
||||
self, sound_id: int, user_id: int
|
||||
self,
|
||||
sound_id: int,
|
||||
user_id: int,
|
||||
) -> dict[str, str | int | bool]:
|
||||
"""Play sound with VLC with credit validation and deduction.
|
||||
|
||||
@@ -326,11 +330,8 @@ class VLCPlayerService:
|
||||
Raises:
|
||||
HTTPException: For various error conditions (sound not found,
|
||||
insufficient credits, VLC failure)
|
||||
|
||||
"""
|
||||
from fastapi import HTTPException, status
|
||||
|
||||
from app.services.credit import CreditService, InsufficientCreditsError
|
||||
|
||||
if not self.db_session_factory:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||
|
||||
Reference in New Issue
Block a user