"use client"; import { usePoll } from "@/lib/use-poll"; import { JellyfinCard } from "@/components/jellyfin-card"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { StatusBadge } from "@/components/status-badge"; interface QueueItem { title: string; status: string; size?: string; timeleft?: string; progress?: number; } interface SonarrQueueItem { title: string; status: string; sizeleft?: string; timeleft?: string; } interface RadarrQueueItem { title: string; status: string; sizeleft?: string; timeleft?: string; } interface SabQueue { slots: QueueItem[]; speed: string; paused: boolean; } interface ProwlarrIndexer { name: string; protocol: string; } interface ProwlarrStats { total: number; enabled: number; indexers: ProwlarrIndexer[]; error?: string; } interface BazarrStatus { version?: string; sonarr_signalr?: string; radarr_signalr?: string; wanted_episodes?: number; wanted_movies?: number; error?: string; } interface ABSLibrary { name: string; type: string; items: number; } interface ABSStats { libraries: ABSLibrary[]; total: number; error?: string; } interface DelugeStatus { available: boolean; total?: number; active?: number; downloading?: number; seeding?: number; error?: string; } export default function MediaPage() { const { data: sonarrRaw } = usePoll>("/api/sonarr/queue", 30000); const { data: radarrRaw } = usePoll>("/api/radarr/queue", 30000); const { data: sabRaw } = usePoll>("/api/sabnzbd/queue", 30000); const { data: prowlarr } = usePoll("/api/prowlarr/stats", 60000); const { data: bazarr } = usePoll("/api/bazarr/status", 60000); const { data: abs } = usePoll("/api/audiobookshelf/stats", 60000); const { data: deluge } = usePoll("/api/deluge/status", 30000); const sonarr = (sonarrRaw?.records ?? sonarrRaw?.items ?? []) as SonarrQueueItem[]; const radarr = (radarrRaw?.records ?? radarrRaw?.items ?? []) as RadarrQueueItem[]; const sab = sabRaw?.queue as SabQueue | undefined; return (

Media

{/* Sonarr Queue */} Sonarr Queue {!sonarr ? (

Loading...

) : sonarr.length === 0 ? (

Queue empty

) : (
{sonarr.map((item, i) => (

{item.title}

{item.timeleft && ( {item.timeleft} )}
))}
)}
{/* Radarr Queue */} Radarr Queue {!radarr ? (

Loading...

) : radarr.length === 0 ? (

Queue empty

) : (
{radarr.map((item, i) => (

{item.title}

{item.timeleft && ( {item.timeleft} )}
))}
)}
{/* SABnzbd Queue */} SABnzbd Queue {sab && ( )} {!sab ? (

Loading...

) : sab.slots.length === 0 ? (

Queue empty

) : (
{sab.slots.map((item, i) => (

{item.title}

{item.timeleft && ( {item.timeleft} )}
{item.progress != null && (
)}
))}
)}
{/* Arr Suite Services */}
{/* Prowlarr */} Prowlarr {prowlarr && !prowlarr.error && ( )} {!prowlarr ? (

Loading...

) : prowlarr.error ? (

{prowlarr.error}

) : (

{prowlarr.enabled}/{prowlarr.total} indexers enabled

{prowlarr.indexers.map((idx, i) => (
{idx.name} {idx.protocol}
))}
)}
{/* Bazarr */} Bazarr {bazarr && !bazarr.error && ( )} {!bazarr ? (

Loading...

) : bazarr.error ? (

{bazarr.error}

) : (
Wanted episodes {bazarr.wanted_episodes}
Wanted movies {bazarr.wanted_movies}
Sonarr SignalR
Radarr SignalR
)}
{/* Audiobookshelf */} Audiobookshelf {abs && !abs.error && ( )} {!abs ? (

Loading...

) : abs.error ? (

{abs.error}

) : (
{abs.libraries.map((lib, i) => (
{lib.name} {lib.items} {lib.type}
))}
)}
{/* Deluge */} Deluge {deluge && ( )} {!deluge ? (

Loading...

) : !deluge.available ? (

{deluge.error ?? "Unreachable"}

) : (
Total {deluge.total}
Downloading
Seeding
)}
); }