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 (
Manage your library, requests, integrations.