"""Jellyseerr request stats — powers the Requests tab on the Jellyfin page. Jellyseerr is an optional companion of the Jellyfin service. This router resolves the Jellyfin service instance (by ``jellyfin_service_id`` or the first enabled one) and delegates to the registered Jellyseerr stats provider, which shares its short-TTL cache with the ``stat`` / ``stats_overview`` widgets so the tab and the widgets don't each hit Jellyseerr. """ from __future__ import annotations import logging from fastapi import APIRouter, Depends, HTTPException from media_library_viewer_api.dependencies import get_settings_store from media_library_viewer_api.services.service_resolution import resolve_service_record from media_library_viewer_api.services.settings_store import SettingsStore from media_library_viewer_api.widgets import jellyseerr_stats # noqa: F401 — ensure provider registration from media_library_viewer_api.widgets.jellyseerr_stats import fetch_jellyseer_requests from media_library_viewer_api.widgets.stats_provider import get_stats_provider logger = logging.getLogger(__name__) router = APIRouter(prefix="/api/jellyseerr", tags=["jellyseerr"]) def _serialize(result) -> dict: return { "stats": [{"key": s.key, "label": s.label, "value": s.value} for s in result.stats], "recent": result.recent, "detail": result.detail, } @router.get("/stats") def get_jellyseerr_stats( jellyfin_service_id: str | None = None, store: SettingsStore = Depends(get_settings_store), ) -> dict: """Return Jellyseerr request counts + a recent-requests list.""" service = resolve_service_record(store, "jellyfin", jellyfin_service_id) if service is None: raise HTTPException(status_code=503, detail="No Jellyfin service is configured.") provider = get_stats_provider("jellyfin") if provider is None: # pragma: no cover - registered at import raise HTTPException(status_code=503, detail="Jellyseerr stats provider is not available.") try: result = provider.fetch_stats(service) except Exception as exc: # pragma: no cover - provider guards internally logger.exception("Jellyseerr stats endpoint failed") raise HTTPException(status_code=502, detail=f"Jellyseerr fetch failed: {exc}") from exc return _serialize(result) @router.get("/requests") def get_jellyseerr_requests( jellyfin_service_id: str | None = None, store: SettingsStore = Depends(get_settings_store), ) -> dict: """Return Jellyseerr requests for the Requests tab table (filter/sort client-side).""" service = resolve_service_record(store, "jellyfin", jellyfin_service_id) if service is None: raise HTTPException(status_code=503, detail="No Jellyfin service is configured.") try: requests = fetch_jellyseer_requests(service) except Exception as exc: # pragma: no cover - client guards internally logger.exception("Jellyseerr requests endpoint failed") raise HTTPException(status_code=502, detail=f"Jellyseerr fetch failed: {exc}") from exc return {"requests": requests}