Fünf Aufmacher je Titel, und der Abspann zählt als Schluss

**Der Aufmacher darf wechseln.** Bisher hing hinter jedem Titel genau ein
Hintergrundbild, und das Karussell war nach einer Woche ein Standbild.
Jetzt lassen sich bis zu fünf Aufnahmen aussuchen — im Bilderdialog unter
einem vierten Reiter, gespeist aus denselben Hintergründen.

Welches gerade gilt, entscheidet der Server aus Uhrzeit und Kennung: alle
fünf Stunden ein anderes, überall dasselbe — im Web, in der App, nach
einem Neustart. Ein Zufall je Abruf hiesse, dass das Bild beim Blättern
springt; eine gespeicherte Wahl hiesse einen Schreibvorgang je Titel und
Fenster. Die Kennung geht mit in die Rechnung, damit nicht alle Titel im
selben Augenblick umschalten.

Plakat und Hintergrund bleiben unberührt. Sie stehen hinter Kacheln und
Kopfzeilen, und dort soll nichts wechseln.

**Und der Abspann zählt als Schluss.** Eine Serie hängt sechs Minuten
Abspann an eine Folge von fünfundvierzig; neunzig Prozent liegen dann
mittendrin, und die Folge gilt erst als gesehen, wenn man ihn sich ganz
ansieht. Die Schwelle herunterzudrehen hiesse, jeden anderen Titel zu
früh abzuhaken. Der erkannte Abspann ist die genauere Antwort auf
dieselbe Frage — er zieht die Schwelle nach vorn, nie nach hinten.

Dazu der Verlauf über dem Aufmacher: er war immer noch zu dunkel. Jetzt
trägt der Schattenwurf der Schrift, was vorher eine Decke über dem
ganzen Bild tat.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-12 21:44:43 +02:00
co-authored by Claude Opus 5
parent 8cf2118723
commit 1d70be0f99
20 changed files with 1956 additions and 30 deletions
+37 -4
View File
@@ -224,13 +224,23 @@ public sealed record SprachStand(string? Language, int Translated, int Total);
/// <summary>Welche Bilder gerade gesetzt sind — und welche von Hand.</summary>
public sealed record Bildstand(
string? Poster, string? Backdrop, string? Logo,
bool PosterPinned, bool BackdropPinned, bool LogoPinned);
bool PosterPinned, bool BackdropPinned, bool LogoPinned,
/// <summary>Die für den Aufmacher gewählten Bilder, höchstens fünf.</summary>
IReadOnlyList<string>? Heroes = null);
public sealed record Bildauswahl(
Bildstand Current, IReadOnlyList<Flaro.Core.Metadata.Bildkandidat> Candidates);
public sealed record BildWahlRequest(string Kind, string? Url);
/// <summary>Die Mehrfachauswahl fürs Aufmacher-Karussell.</summary>
///
/// <remarks>
/// Eine Liste und kein einzelner Wert: hier wird nicht ein Bild gesetzt,
/// sondern die ganze Auswahl ersetzt. Eine leere Liste nimmt sie zurück.
/// </remarks>
public sealed record AufmacherWahlRequest(IReadOnlyList<string> Urls);
/// <summary>Ein Titel, der noch wartet oder geplant ist.</summary>
///
/// <remarks>
@@ -455,7 +465,17 @@ public sealed record MovieResponse(
/// Kennung müsste der Client erst alle Mediatheken durchgehen, um zu
/// erfahren, wohin dieser eine Film gehört.
/// </remarks>
Guid? LibraryId = null);
Guid? LibraryId = null,
/// <summary>Das Bild, das jetzt im Aufmacher gilt.</summary>
///
/// <remarks>
/// <b>Vom Server gewählt, nicht vom Client.</b> Wer mehrere Aufnahmen
/// ausgesucht hat, bekommt alle fünf Stunden eine andere — und zwar
/// überall dieselbe: im Web, in der App, nach einem Neustart. Siehe
/// <c>Aufmacherwahl</c>. <c>null</c> heisst „keine ausgesucht"; dann
/// gilt wie bisher der Hintergrund.
/// </remarks>
string? HeroImage = null);
public sealed record CreditResponse(
Guid Id, string Name, string Role, string? Character, string? Image);
@@ -536,7 +556,17 @@ public sealed record SeriesResponse(
/// Kennung müsste der Client erst alle Mediatheken durchgehen, um zu
/// erfahren, wohin dieser eine Film gehört.
/// </remarks>
Guid? LibraryId = null);
Guid? LibraryId = null,
/// <summary>Das Bild, das jetzt im Aufmacher gilt.</summary>
///
/// <remarks>
/// <b>Vom Server gewählt, nicht vom Client.</b> Wer mehrere Aufnahmen
/// ausgesucht hat, bekommt alle fünf Stunden eine andere — und zwar
/// überall dieselbe: im Web, in der App, nach einem Neustart. Siehe
/// <c>Aufmacherwahl</c>. <c>null</c> heisst „keine ausgesucht"; dann
/// gilt wie bisher der Hintergrund.
/// </remarks>
string? HeroImage = null);
/// <summary>Ein überspringbarer Abschnitt — Vorspann oder Abspann.</summary>
///
@@ -883,7 +913,10 @@ public sealed record ContinueEntry(
/// Seite und will das Bild der Serie; dort stand bisher das Folgenbild,
/// und wer das Serienbild selbst ausgesucht hatte, fand ein anderes vor.
/// </remarks>
string? SeriesBackdropImage = null);
string? SeriesBackdropImage = null,
/// <summary>Das Bild, das jetzt im Aufmacher gilt — siehe <c>Aufmacherwahl</c>.</summary>
string? HeroImage = null);
/// <summary>Was jemand geschaut hat — nur für ihn selbst.</summary>
///