Build OverSnitch dashboard
Full implementation on top of the Next.js scaffold: - Leaderboard with per-user request count, storage, avg GB/req, and optional Tautulli watch stats (plays, watch hours), each with dense per-metric rank (#N/total) - SWR cache on /api/stats (5-min stale, force-refresh via button); client-side localStorage seed so the UI is instant on return visits - Alerting system: content-centric alerts (unfulfilled downloads, partial TV downloads, stale pending requests) and user-behavior alerts (ghost requester, low watch rate, declined streak) - Partial TV detection: flags ended series with <90% of episodes on disk - Alert persistence in data/alerts.json with open/closed state, auto-resolve when condition clears, manual close with per-category cooldown, and per-alert notes - Alert detail page rendered as a server component for instant load - Dark UI with Tailwind v4, severity-colored left borders, summary cards with icons, sortable leaderboard table Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
19
src/lib/radarr.ts
Normal file
19
src/lib/radarr.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
import { RadarrMovie, MediaEntry } from "@/lib/types";
|
||||
|
||||
export async function buildRadarrMap(): Promise<Map<number, MediaEntry>> {
|
||||
const res = await fetch(`${process.env.RADARR_URL}/api/v3/movie`, {
|
||||
headers: { "X-Api-Key": process.env.RADARR_API! },
|
||||
});
|
||||
|
||||
if (!res.ok) {
|
||||
throw new Error(`Radarr API error: ${res.status} ${res.statusText}`);
|
||||
}
|
||||
|
||||
const movies: RadarrMovie[] = await res.json();
|
||||
return new Map(
|
||||
movies.map((m) => [
|
||||
m.tmdbId,
|
||||
{ title: m.title, sizeOnDisk: m.sizeOnDisk, available: m.isAvailable },
|
||||
])
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user