soulsync/api/video/libraries.py
BoulderBadgeDad b2dbd6dec5 video: Video Source settings panel + library gating; move Detail prefs to own group
Settings → Video Source shows which server video uses (✓ Plex/Jellyfin), a
Plex/Jellyfin picker when both are connected, or a clear 'connect Plex or
Jellyfin' message when neither (Navidrome/Standalone are music-only and not
offered). The Library shows a non-breaking 'no video server' banner + disables
Scan until one is connected. Detail Pages prefs moved into their own 'Video
Preferences' group. /api/video/server GET+POST drives it.
2026-06-15 13:55:42 -07:00

72 lines
3.2 KiB
Python

"""Video library mapping endpoints.
GET /api/video/libraries -> discover the active server's Movies/TV libraries
+ the user's current selection.
POST /api/video/libraries -> save {movies, tv} (library titles) for the active
server. The scanner then reads only those.
"""
from __future__ import annotations
from flask import jsonify, request
from utils.logging_config import get_logger
logger = get_logger("video_api.libraries")
def register_routes(bp):
@bp.route("/libraries", methods=["GET"])
def video_libraries():
from . import get_video_db
try:
from core.video.sources import list_video_libraries, resolve_video_server
libs = list_video_libraries() or {"server": None, "movies": [], "tv": []}
server = libs.get("server") or resolve_video_server()
libs["selected"] = (get_video_db().get_library_selection(server)
if server else {"movies": None, "tv": None})
return jsonify(libs)
except Exception:
logger.exception("Failed to list video libraries")
return jsonify({"error": "Failed to list video libraries"}), 500
@bp.route("/server", methods=["GET"])
def video_server_status():
"""Which server the video side uses + which of Plex/Jellyfin are configured
(so the UI can show a picker, or a 'connect a server' message)."""
try:
from core.video.sources import resolve_video_server
from config.settings import config_manager
plex = bool((config_manager.get_plex_config() or {}).get("base_url"))
jelly = bool((config_manager.get_jellyfin_config() or {}).get("base_url"))
return jsonify({"server": resolve_video_server(), "plex": plex, "jellyfin": jelly})
except Exception:
logger.exception("video server status failed")
return jsonify({"server": None, "plex": False, "jellyfin": False})
@bp.route("/server", methods=["POST"])
def video_server_set():
"""Set the explicit video-side server pick (only meaningful when both Plex
and Jellyfin are configured)."""
from . import get_video_db
body = request.get_json(silent=True) or {}
choice = body.get("server")
if choice not in ("plex", "jellyfin"):
return jsonify({"error": "bad server"}), 400
get_video_db().set_setting("video_server", choice)
return jsonify({"status": "saved", "server": choice})
@bp.route("/libraries", methods=["POST"])
def save_video_libraries():
from . import get_video_db
try:
from core.video.sources import resolve_video_server
body = request.get_json(silent=True) or {}
server = resolve_video_server()
if not server:
return jsonify({"error": "no video server"}), 400
get_video_db().set_library_selection(server, body.get("movies"), body.get("tv"))
return jsonify({"status": "saved", "server": server})
except Exception:
logger.exception("Failed to save video library selection")
return jsonify({"error": "Failed to save selection"}), 500