feat(sound_played): add sound play tracking and user statistics endpoints; enhance VLC service to record play events

This commit is contained in:
JSC
2025-07-03 21:50:17 +02:00
parent 97b998fd9e
commit c3b8205f83
4 changed files with 353 additions and 4 deletions

View File

@@ -2,8 +2,9 @@
from flask import Blueprint, jsonify, request
from app.models.sound import Sound, SoundType
from app.models.sound_played import SoundPlayed
from app.services.vlc_service import vlc_service
from app.services.decorators import require_auth
from app.services.decorators import require_auth, get_current_user
bp = Blueprint("soundboard", __name__, url_prefix="/api/soundboard")
@@ -42,7 +43,20 @@ def get_sounds():
def play_sound(sound_id: int):
"""Play a specific sound."""
try:
success = vlc_service.play_sound(sound_id)
# Get current user for tracking
user = get_current_user()
user_id = int(user["id"]) if user else None
# Get client information
ip_address = request.remote_addr
user_agent = request.headers.get("User-Agent")
success = vlc_service.play_sound(
sound_id=sound_id,
user_id=user_id,
ip_address=ip_address,
user_agent=user_agent,
)
if success:
return jsonify({"message": "Sound playing", "sound_id": sound_id})
@@ -119,3 +133,86 @@ def get_status():
)
except Exception as e:
return jsonify({"error": str(e)}), 500
@bp.route("/history", methods=["GET"])
@require_auth
def get_play_history():
"""Get recent play history."""
try:
page = int(request.args.get("page", 1))
per_page = min(int(request.args.get("per_page", 50)), 100)
offset = (page - 1) * per_page
recent_plays = SoundPlayed.get_recent_plays(limit=per_page, offset=offset)
return jsonify({
"plays": [play.to_dict() for play in recent_plays],
"page": page,
"per_page": per_page,
})
except Exception as e:
return jsonify({"error": str(e)}), 500
@bp.route("/my-history", methods=["GET"])
@require_auth
def get_my_play_history():
"""Get current user's play history."""
try:
user = get_current_user()
if not user:
return jsonify({"error": "User not found"}), 404
user_id = int(user["id"])
page = int(request.args.get("page", 1))
per_page = min(int(request.args.get("per_page", 50)), 100)
offset = (page - 1) * per_page
user_plays = SoundPlayed.get_user_plays(user_id=user_id, limit=per_page, offset=offset)
return jsonify({
"plays": [play.to_dict() for play in user_plays],
"page": page,
"per_page": per_page,
"user_id": user_id,
})
except Exception as e:
return jsonify({"error": str(e)}), 500
@bp.route("/my-stats", methods=["GET"])
@require_auth
def get_my_stats():
"""Get current user's play statistics."""
try:
user = get_current_user()
if not user:
return jsonify({"error": "User not found"}), 404
user_id = int(user["id"])
stats = SoundPlayed.get_user_stats(user_id)
return jsonify(stats)
except Exception as e:
return jsonify({"error": str(e)}), 500
@bp.route("/popular", methods=["GET"])
@require_auth
def get_popular_sounds():
"""Get most popular sounds."""
try:
limit = min(int(request.args.get("limit", 10)), 50)
days = request.args.get("days")
days = int(days) if days and days.isdigit() else None
popular_sounds = SoundPlayed.get_popular_sounds(limit=limit, days=days)
return jsonify({
"popular_sounds": popular_sounds,
"limit": limit,
"days": days,
})
except Exception as e:
return jsonify({"error": str(e)}), 500