import Link from "next/link"; import BrowseHeader from "@/components/BrowseHeader"; import { corpusConcentration } from "@/lib/concentration"; export const dynamic = "force-dynamic"; // Which episodes the palette actually comes from, across every song. // // A STATIC segment under app/browse/, like /browse/decisions -- see that file. // // This exists because the claim "drawn from a corpus of 300 episodes" was never // checked against the plans. It is answered here in two units at once, because // they answer different questions: placements say how much of the RUNTIME an // episode supplies, clips say how much of the PALETTE it does. const pc = (v: number) => `${(v * 100).toFixed(1)}%`; export default async function SourcesPage() { const c = await corpusConcentration(); return (
{c.videos.length === 0 ? (

No plans under videos/, so nothing to roll up.

) : ( <>

Placements are how much of the finished runtime an episode supplies; clips are how much of the palette. One beloved clip used ninety times and ninety clips used once are the same placement count and a very different corpus — so both are here, and neither is summed with the other.

{c.videos.map((v) => ( ))}
episode placements share clips songs date
{v.link ? ( {v.title || v.video} ) : ( {v.title || v.video} )} {v.video} {v.placements} {pc(v.placements / (c.placements.total || 1))} {v.clips} {v.songs.map((s, i) => ( {i > 0 && ", "} {s} ))} {v.date}
)}
); } function Stat({ label, value, note }: { label: string; value: string; note: string }) { return (
{label}
{value} {note}
); }