feat: Beispielbibliothek mit lokal erzeugten Postern

Flimmer ist eine posterlastige Anwendung — ohne Bilder sieht die
Beispielbibliothek aus wie ein Fehler statt wie eine Bibliothek. Echte
TMDB-Poster lassen sich nicht mitliefern, also entstehen abstrakte Poster im
Flimmer-Look direkt im Bild-Cache.

Der Katalog ist bewusst erfunden: das Seed-Skript soll ohne TMDB-Schlüssel
laufen und keine fremden Metadaten ins Repository ziehen. Die Sichtungen sind
über die letzten Monate verteilt, damit Kalender und Statistik später etwas
zu zeigen haben.
This commit is contained in:
Florian Wilde
2026-09-01 19:24:52 +02:00
parent f9ce2f7021
commit 6f5bdcc20c
3 changed files with 1105 additions and 12 deletions
+444
View File
@@ -0,0 +1,444 @@
/**
* Beispielkatalog für die Entwicklung.
*
* Bewusst **erfundene** Titel statt echter TMDB-Daten: das Seed-Skript soll
* ohne TMDB-Schlüssel laufen, keine fremden Metadaten ins Repository ziehen
* und trotzdem eine Bibliothek zeigen, die sich wie eine echte anfühlt —
* laufende Serien, abgeschlossene, ein Universum, unterschiedliche Dienste.
*
* Die Poster erzeugt `prisma/demo/posters.ts` lokal aus diesen Angaben.
*/
export type DemoSeason = {
seasonNumber: number;
name: string;
airDate: string;
/** Episodentitel; die Nummern ergeben sich aus der Reihenfolge. */
episodes: string[];
runtime: number;
};
export type DemoSeries = {
key: string;
type: "SERIES";
title: string;
originalTitle?: string;
tagline?: string;
overview: string;
firstAirDate: string;
lastAirDate?: string;
status: string;
inProduction: boolean;
genres: string[];
runtime: number;
voteAverage: number;
providers: { name: string; kind: "FLATRATE" | "FREE" | "RENT" | "BUY" | "ADS" }[];
seasons: DemoSeason[];
};
export type DemoMovie = {
key: string;
type: "MOVIE";
title: string;
originalTitle?: string;
tagline?: string;
overview: string;
releaseDate: string;
runtime: number;
genres: string[];
voteAverage: number;
collection?: string;
providers: { name: string; kind: "FLATRATE" | "FREE" | "RENT" | "BUY" | "ADS" }[];
};
export type DemoTitle = DemoSeries | DemoMovie;
/** Erzeugt Episodentitel im Muster „Kapitel 1 … n" für längere Staffeln. */
function chapters(prefix: string, count: number): string[] {
return Array.from({ length: count }, (_, index) => `${prefix} ${index + 1}`);
}
export const DEMO_SERIES: DemoSeries[] = [
{
key: "nordlicht",
type: "SERIES",
title: "Nordlicht",
originalTitle: "Nordlys",
tagline: "Manche Lichter wollen nicht gesehen werden.",
overview:
"Eine Meteorologin kehrt in ihr Heimatdorf am Polarkreis zurück und stößt auf ein Wetterphänomen, das es nicht geben dürfte. Je näher sie der Erklärung kommt, desto weniger will das Dorf sie hören.",
firstAirDate: "2023-03-14",
lastAirDate: "2025-05-02",
status: "Returning Series",
inProduction: true,
genres: ["Drama", "Mystery"],
runtime: 48,
voteAverage: 8.1,
providers: [
{ name: "Netflix", kind: "FLATRATE" },
{ name: "WOW", kind: "FLATRATE" },
],
seasons: [
{
seasonNumber: 1,
name: "Staffel 1",
airDate: "2023-03-14",
runtime: 48,
episodes: [
"Ankunft",
"Der Messwert",
"Polarnacht",
"Was der Schnee behält",
"Drei Grad zu warm",
"Das Gerät",
"Nordlys",
"Rückkehr des Lichts",
],
},
{
seasonNumber: 2,
name: "Staffel 2",
airDate: "2025-04-11",
runtime: 50,
episodes: [
"Der lange Winter",
"Zweiter Frühling",
"Messreihe",
"Der Bruder",
"Vermisst",
"Weißes Rauschen",
],
},
],
},
{
key: "kaffeesatz",
type: "SERIES",
title: "Kaffeesatz",
tagline: "Jeder Tisch hat eine Geschichte. Manche stimmen sogar.",
overview:
"In einem Kölner Café laufen die Leben von sechs Stammgästen zusammen. Halbstünder über Nachbarschaft, Missverständnisse und den Versuch, erwachsen zu wirken.",
firstAirDate: "2021-09-02",
lastAirDate: "2024-11-21",
status: "Ended",
inProduction: false,
genres: ["Comedy", "Drama"],
runtime: 26,
voteAverage: 7.6,
providers: [
{ name: "ARD Mediathek", kind: "FREE" },
{ name: "Joyn", kind: "ADS" },
],
seasons: [
{ seasonNumber: 1, name: "Staffel 1", airDate: "2021-09-02", runtime: 26, episodes: chapters("Runde", 10) },
{ seasonNumber: 2, name: "Staffel 2", airDate: "2022-10-06", runtime: 26, episodes: chapters("Nachschlag", 10) },
{ seasonNumber: 3, name: "Staffel 3", airDate: "2024-09-19", runtime: 27, episodes: chapters("Letzte Bestellung", 8) },
],
},
{
key: "sternenpfad-serie",
type: "SERIES",
title: "Sternenpfad: Die Grenzwacht",
tagline: "Am Rand der Karte beginnt die Verantwortung.",
overview:
"Zwischen dem dritten und dem vierten Film der Sternenpfad-Reihe: eine Grenzstation, zwei verfeindete Flotten und eine Kommandantin, die beide Seiten kennt.",
firstAirDate: "2022-11-16",
lastAirDate: "2024-01-24",
status: "Ended",
inProduction: false,
genres: ["Science Fiction", "Abenteuer", "Drama"],
runtime: 42,
voteAverage: 8.4,
providers: [{ name: "Disney Plus", kind: "FLATRATE" }],
seasons: [
{ seasonNumber: 1, name: "Staffel 1", airDate: "2022-11-16", runtime: 42, episodes: chapters("Wache", 8) },
{ seasonNumber: 2, name: "Staffel 2", airDate: "2024-01-24", runtime: 44, episodes: chapters("Ablösung", 8) },
],
},
{
key: "sternenpfad-akademie",
type: "SERIES",
title: "Sternenpfad: Akademie",
tagline: "Vor der Flotte kommt die Prüfung.",
overview:
"Jugendserie im Sternenpfad-Universum: der erste Jahrgang einer neu gegründeten Flottenakademie, kurz nach den Ereignissen des zweiten Films.",
firstAirDate: "2026-02-06",
status: "Returning Series",
inProduction: true,
genres: ["Science Fiction", "Abenteuer"],
runtime: 38,
voteAverage: 7.2,
providers: [{ name: "Disney Plus", kind: "FLATRATE" }],
seasons: [
{ seasonNumber: 1, name: "Staffel 1", airDate: "2026-02-06", runtime: 38, episodes: chapters("Semester", 10) },
],
},
{
key: "aktenlage",
type: "SERIES",
title: "Aktenlage",
tagline: "Die Wahrheit liegt im Anhang.",
overview:
"Eine Verwaltungsjuristin deckt in einem Landesministerium einen Vorgang auf, den es offiziell nie gab. Bürokratie-Thriller ohne einen einzigen Schusswechsel.",
firstAirDate: "2024-10-03",
status: "Returning Series",
inProduction: true,
genres: ["Thriller", "Drama"],
runtime: 52,
voteAverage: 8.0,
providers: [
{ name: "ZDF Mediathek", kind: "FREE" },
{ name: "Amazon Prime Video", kind: "FLATRATE" },
],
seasons: [
{ seasonNumber: 1, name: "Staffel 1", airDate: "2024-10-03", runtime: 52, episodes: chapters("Vorgang", 6) },
{ seasonNumber: 2, name: "Staffel 2", airDate: "2026-09-24", runtime: 52, episodes: chapters("Widerspruch", 6) },
],
},
{
key: "tiefenschaerfe",
type: "SERIES",
title: "Tiefenschärfe",
tagline: "Sehen ist nicht dasselbe wie erkennen.",
overview:
"Eine Tatortfotografin merkt, dass auf ihren eigenen Aufnahmen jemand steht, der dort nicht war. Sechs Teile, ein einziger Fall.",
firstAirDate: "2025-01-09",
lastAirDate: "2025-02-13",
status: "Ended",
inProduction: false,
genres: ["Krimi", "Mystery"],
runtime: 45,
voteAverage: 7.9,
providers: [{ name: "Netflix", kind: "FLATRATE" }],
seasons: [
{ seasonNumber: 1, name: "Miniserie", airDate: "2025-01-09", runtime: 45, episodes: chapters("Blende", 6) },
],
},
{
key: "gartenjahr",
type: "SERIES",
title: "Ein Gartenjahr",
tagline: "Zwölf Monate, ein Beet, kein Drehbuch.",
overview:
"Dokureihe: eine Familie legt auf einer Brache in Leipzig einen Gemeinschaftsgarten an. Jede Folge ein Monat.",
firstAirDate: "2025-03-01",
lastAirDate: "2026-02-01",
status: "Ended",
inProduction: false,
genres: ["Dokumentation"],
runtime: 30,
voteAverage: 7.4,
providers: [{ name: "ARTE", kind: "FREE" }],
seasons: [
{
seasonNumber: 1,
name: "Staffel 1",
airDate: "2025-03-01",
runtime: 30,
episodes: [
"März: Umgraben",
"April: Aussaat",
"Mai: Frost",
"Juni: Schnecken",
"Juli: Zu viel Zucchini",
"August: Dürre",
"September: Ernte",
"Oktober: Einkochen",
"November: Laub",
"Dezember: Planung",
"Januar: Katalog",
"Februar: Vorziehen",
],
},
],
},
{
key: "zwischenstopp",
type: "SERIES",
title: "Zwischenstopp",
tagline: "Zwanzig Minuten Aufenthalt.",
overview:
"Anthologieserie: jede Folge spielt vollständig auf einem anderen Bahnhof, in Echtzeit, zwischen zwei Zügen.",
firstAirDate: "2026-05-14",
status: "Returning Series",
inProduction: true,
genres: ["Drama", "Anthologie"],
runtime: 22,
voteAverage: 8.6,
providers: [{ name: "Apple TV+", kind: "FLATRATE" }],
seasons: [
{
seasonNumber: 1,
name: "Staffel 1",
airDate: "2026-05-14",
runtime: 22,
episodes: [
"Hamm (Westf)",
"Bad Bentheim",
"Offenburg",
"Bebra",
"Neustadt (Schwarzwald)",
"Probstzella",
"Zoo Berlin",
"Emmerich",
],
},
],
},
];
export const DEMO_MOVIES: DemoMovie[] = [
// --- Sternenpfad-Reihe (Grundlage für das Beispiel-Universum) -------------
{
key: "sternenpfad-1",
type: "MOVIE",
title: "Sternenpfad",
tagline: "Ein Kurs. Kein Zurück.",
overview:
"Eine Frachterpilotin nimmt einen Auftrag an, der sie über die Grenze der bekannten Karte hinausführt — und findet dort eine Flotte, die es nicht geben sollte.",
releaseDate: "2016-12-15",
runtime: 137,
genres: ["Science Fiction", "Abenteuer"],
voteAverage: 7.8,
collection: "Sternenpfad-Reihe",
providers: [{ name: "Disney Plus", kind: "FLATRATE" }],
},
{
key: "sternenpfad-2",
type: "MOVIE",
title: "Sternenpfad II: Die stille Flotte",
tagline: "Schweigen ist auch eine Antwort.",
overview:
"Zwei Jahre später: die Flotte antwortet nicht mehr. Eine Delegation soll herausfinden, warum — und findet eine Antwort, die niemand hören will.",
releaseDate: "2019-07-04",
runtime: 146,
genres: ["Science Fiction", "Abenteuer", "Drama"],
voteAverage: 8.2,
collection: "Sternenpfad-Reihe",
providers: [{ name: "Disney Plus", kind: "FLATRATE" }],
},
{
key: "sternenpfad-3",
type: "MOVIE",
title: "Sternenpfad III: Heimkehr",
tagline: "Manche Wege führen nur in eine Richtung.",
overview:
"Der Abschluss der ersten Trilogie. Die Rückkehr gelingt — aber nicht allen, und nicht dorthin, wo sie aufgebrochen sind.",
releaseDate: "2021-12-16",
runtime: 158,
genres: ["Science Fiction", "Abenteuer"],
voteAverage: 7.5,
collection: "Sternenpfad-Reihe",
providers: [{ name: "Disney Plus", kind: "FLATRATE" }],
},
{
key: "sternenpfad-4",
type: "MOVIE",
title: "Sternenpfad IV: Die Kartografin",
tagline: "Wer die Karte zeichnet, bestimmt den Rand.",
overview:
"Eine Generation später. Eine junge Kartografin zeichnet die Grenze neu — und macht damit aus einer Legende ein politisches Problem.",
releaseDate: "2024-12-19",
runtime: 149,
genres: ["Science Fiction", "Drama"],
voteAverage: 8.0,
collection: "Sternenpfad-Reihe",
providers: [{ name: "Disney Plus", kind: "FLATRATE" }],
},
{
key: "sternenpfad-null",
type: "MOVIE",
title: "Sternenpfad: Null",
tagline: "Bevor jemand hinaussah.",
overview:
"Vorgeschichte der Reihe: der Bau des ersten Fernaufklärers und die Entscheidung, die alles auslöste. Chronologisch der Anfang, im Kino der fünfte Teil.",
releaseDate: "2026-07-16",
runtime: 132,
genres: ["Science Fiction", "Drama"],
voteAverage: 7.1,
collection: "Sternenpfad-Reihe",
providers: [{ name: "Disney Plus", kind: "FLATRATE" }],
},
// --- Einzelfilme ----------------------------------------------------------
{
key: "stille-bilder",
type: "MOVIE",
title: "Die Stille zwischen den Bildern",
originalTitle: "The Silence Between Frames",
tagline: "24 Bilder pro Sekunde. Eins davon lügt.",
overview:
"Ein Filmvorführer entdeckt in einer alten Rolle Bilder, die dort nicht sein können — und niemand außer ihm sieht sie.",
releaseDate: "2024-10-17",
runtime: 118,
genres: ["Horror", "Thriller"],
voteAverage: 7.4,
collection: "Vorführer-Reihe",
providers: [
{ name: "WOW", kind: "FLATRATE" },
{ name: "Google Play Movies", kind: "RENT" },
],
},
{
key: "stille-bilder-2",
type: "MOVIE",
title: "Die Stille zwischen den Bildern II",
tagline: "Diesmal sieht es zurück.",
overview: "Fortsetzung: dieselbe Rolle, ein anderes Kino, dreißig Jahre später.",
releaseDate: "2026-02-06",
runtime: 126,
genres: ["Horror", "Thriller"],
voteAverage: 6.9,
collection: "Vorführer-Reihe",
providers: [{ name: "Google Play Movies", kind: "RENT" }],
},
{
key: "hochwasser",
type: "MOVIE",
title: "Hochwasser",
tagline: "Das Wasser fragt nicht.",
overview:
"Drei Tage in einer Kleinstadt an der Ahr. Kammerspiel über Nachbarschaft, wenn alles gleichzeitig passiert.",
releaseDate: "2023-08-24",
runtime: 104,
genres: ["Drama"],
voteAverage: 8.3,
providers: [{ name: "ARD Mediathek", kind: "FREE" }],
},
{
key: "pfand",
type: "MOVIE",
title: "Pfand",
tagline: "Fünfundzwanzig Cent Unterschied.",
overview:
"Komödie über zwei Rentner, die in Hamburg-Barmbek einen Automatenkrieg anzetteln — ohne es zu merken.",
releaseDate: "2025-06-12",
runtime: 96,
genres: ["Komödie"],
voteAverage: 7.0,
providers: [{ name: "Joyn", kind: "ADS" }],
},
{
key: "die-vermessung",
type: "MOVIE",
title: "Die Vermessung des Feierabends",
tagline: "Achtzehn Uhr. Und dann?",
overview:
"Dokumentarfilm über vier Menschen und die Frage, was von einem Tag übrig bleibt, wenn die Arbeit vorbei ist.",
releaseDate: "2022-04-07",
runtime: 88,
genres: ["Dokumentation"],
voteAverage: 7.7,
providers: [{ name: "ARTE", kind: "FREE" }],
},
];
export const DEMO_TITLES: DemoTitle[] = [...DEMO_SERIES, ...DEMO_MOVIES];
/** TMDB-IDs der Demo-Titel liegen bewusst weit oberhalb echter IDs. */
export const DEMO_TMDB_BASE = 9_100_000;
export function demoTmdbId(key: string): number {
const index = DEMO_TITLES.findIndex((title) => title.key === key);
return DEMO_TMDB_BASE + (index >= 0 ? index : 999);
}