Storage was already per-server (movies/shows UNIQUE(server_source, server_id), episodes via per-server show_id, prune_missing scoped) — but reads returned every server's rows, so a Jellyfin scan would show up alongside Plex. Mirror the music standard: scope reads to the active video server (resolve_video_server). query_library, calendar_upcoming, dashboard_stats and library_id_for_tmdb take a server_source; the dashboard/library/calendar endpoints pass it. server_source=None keeps "all servers" (enrichment processes every server; tests unchanged). No schema change, no data migration — existing Plex data is untouched and simply hidden while Jellyfin is the active server. Regression tests: same title on both servers stays two rows; scoped reads only return the active server's data; deep-scan prune never touches the other server.
28 lines
975 B
Python
28 lines
975 B
Python
"""Video dashboard endpoint — live counts from video.db.
|
|
|
|
GET /api/video/dashboard -> {library:{...}, downloads:{...}, watchlist, wishlist}
|
|
With an empty database every value is a real 0.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from flask import jsonify
|
|
|
|
from utils.logging_config import get_logger
|
|
|
|
logger = get_logger("video_api.dashboard")
|
|
|
|
|
|
def register_routes(bp):
|
|
@bp.route("/dashboard", methods=["GET"])
|
|
def video_dashboard():
|
|
from . import get_video_db
|
|
from core.video.sources import resolve_video_server
|
|
try:
|
|
server = resolve_video_server() # the VIDEO server, not music's active
|
|
stats = get_video_db().dashboard_stats(server_source=server)
|
|
stats["server"] = server
|
|
return jsonify(stats)
|
|
except Exception:
|
|
logger.exception("Failed to build video dashboard stats")
|
|
return jsonify({"error": "Failed to load video dashboard stats"}), 500
|