"""Dashboard router — media counts, per-library breakdown, now-playing.""" from __future__ import annotations from typing import Any from fastapi import APIRouter, Depends from dependencies import get_jellyfin_client, get_user_id from clients.jellyfin import JellyfinClient router = APIRouter(prefix="/api/dashboard", tags=["dashboard"]) @router.get("/counts") def get_counts( client: JellyfinClient = Depends(get_jellyfin_client), user_id: str = Depends(get_user_id), ) -> dict[str, int]: """Return total movie/series/episode counts.""" return client.media_counts(user_id) @router.get("/libraries") def get_library_counts( client: JellyfinClient = Depends(get_jellyfin_client), user_id: str = Depends(get_user_id), ) -> list[dict[str, Any]]: """Return per-library item counts broken down by type.""" libraries = client.libraries(user_id) return client.library_item_counts(user_id, libraries) @router.get("/now-playing") def get_now_playing( client: JellyfinClient = Depends(get_jellyfin_client), ) -> list[dict[str, Any]]: """Return currently active playback sessions with transcode info.""" sessions = client.active_sessions() results = [] for session in sessions: item = session.get("NowPlayingItem") or {} play_state = session.get("PlayState") or {} transcoding = session.get("TranscodingInfo") or {} series = item.get("SeriesName") or "" title = f"{series} - {item.get('Name', '')}" if series else item.get("Name", "Unknown") is_transcoding = bool(transcoding) transcode_type = [] if is_transcoding: if transcoding.get("IsVideoDirect") is False: transcode_type.append("video") if transcoding.get("IsAudioDirect") is False: transcode_type.append("audio") if not transcode_type: transcode_type.append("active") results.append({ "user": session.get("UserName") or "Unknown", "title": title, "type": item.get("Type", ""), "state": "paused" if play_state.get("IsPaused") else "playing", "transcoding": "yes" if is_transcoding else "no", "transcoding_type": ", ".join(transcode_type), "device": session.get("DeviceName") or session.get("Client") or "", "session_id": session.get("Id") or "", }) return results