import { useEffect, useState } from "react"; import api from "../lib/api"; import { toast } from "sonner"; import { Trash2, Star, Film, Settings as SettingsIcon, Download, RefreshCcw, FolderSearch, Wrench } from "lucide-react"; import { useNavigate, Link } from "react-router-dom"; export default function Admin() { const nav = useNavigate(); const [movies, setMovies] = useState([]); const [shows, setShows] = useState([]); const [transcoding, setTranscoding] = useState({}); const load = async () => { const [{ data: m }, { data: s }] = await Promise.all([ api.get("/movies"), api.get("/shows").catch(() => ({ data: [] })), ]); setMovies(m); setShows(s); }; useEffect(() => { load(); }, []); // Poll for transcoding status useEffect(() => { const inProgress = movies.some((m) => m.hls_status === "running" || m.hls_status === "pending"); if (!inProgress) return; const t = setInterval(load, 3000); return () => clearInterval(t); }, [movies]); const remove = async (id) => { if (!window.confirm("Remove this movie permanently?")) return; await api.delete(`/movies/${id}`); toast.success("Removed"); load(); }; const toggleFeatured = async (m) => { await api.patch(`/movies/${m.id}`, { featured: !m.featured }); load(); }; const startTranscode = async (m, quality = "quick") => { setTranscoding({ ...transcoding, [m.id]: true }); try { await api.post(`/movies/${m.id}/transcode`, { quality }); toast.success(`${quality === "abr" ? "ABR" : "Quick"} transcode started`); load(); } catch (err) { toast.error(err.response?.data?.detail || "Could not start transcode"); } finally { setTranscoding({ ...transcoding, [m.id]: false }); } }; const hlsLabel = (m) => { if (m.hls_status === "done") { return m.hls_path === "master.m3u8" ? "ABR" : "Quick"; } return null; }; const hlsStatusBadge = (m) => { if (!m.hls_status) return null; const colors = { pending: "text-[#fcd34d]", running: "text-[#fcd34d]", done: "text-[#86efac]", failed: "text-[#fca5a5]", }; const variant = m.hls_status === "done" ? hlsLabel(m) : ""; return HLS {m.hls_status}{variant ? ` · ${variant}` : ""}; }; return (
Library management

Admin

Manage your library, requests, integrations.

Upload Movie Radarr Import Library Scan Library Cleanup Queue Users Review Requests
Title Year Rating Source HLS Actions
{movies.map((m) => (
{m.title}
{m.year} {m.rating} {m.storage_type} {hlsStatusBadge(m)}
{(m.storage_type === "local" || m.storage_type === "radarr" || m.storage_type === "scan") && m.hls_status !== "running" && m.hls_status !== "pending" && (
)}
))}
{shows.length > 0 && (

Series

Title Year Episodes Actions
{shows.map((s) => (
{s.title}
{s.year} {s.season_count}s · {s.episode_count}e
))}
)}
); }