feat: Enhance WebSocket sound playback with credit validation and refactor related methods
Some checks failed
Backend CI / lint (push) Has been cancelled
Backend CI / test (push) Has been cancelled

This commit is contained in:
JSC
2025-08-19 22:28:54 +02:00
parent a82acfae50
commit b808cfaddf
3 changed files with 100 additions and 135 deletions

View File

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