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.
72 lines
3.2 KiB
Python
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
|