Eine Folge ist weder ein Film noch eine Serie

Die App meldete auf der Startseite „Dieser Titel ist auf dem Server nicht
mehr vorhanden" — über eine Folge, die sie selbst gerade anzeigte.

Gemessen im Quelltext: `item(id:)` probiert `/movies/{id}`, dann
`/series/{id}`, und wirft sonst `.notFound`. In „Weiterschauen" steht
eine Folge mit ihrer eigenen Kennung, und einen Endpunkt für eine
einzelne Folge gab es gar nicht. Jetzt gibt es `GET /api/v1/episodes/{id}`
— mit `SeriesId`, denn ohne die Serie fehlen der Folge Titel und Bild.
Im Simulator nachgestellt und nachgeprüft: die Seite steht.

**Zuletzt hinzugefügt.** Die App zeigte „Filme" und „Serien" — den Anfang
der Mediathek in der Reihenfolge der Datenbank, also immer denselben.
Jetzt je Mediathek eine Reihe „Neu in …", sortiert nach Zugang. Die
Kennungen beginnen nun mit `latest`, und daran hängen zwei Einstellungen,
die an einem Flaro-Server deshalb nichts taten: „Gesehenes in Neuzugängen
ausblenden" und „Aufmacher nur aus Neuzugängen".

**Geplante Titel.** `MediaItem` kennt jetzt `availableFrom`. Aufmacher und
Detailseite zeigen statt des Knopfes „Bald ist es soweit" mit dem Termin.
Die Kachel spielte trotzdem los — im Simulator kam der Spieler bis „Wird
vorbereitet …" —, also zählt ein geplanter Titel jetzt wie eine Sammlung:
nichts zu starten, der Tipp führt auf die Seite.

**Und das Bild im Aufmacher.** Bei einer angefangenen Folge stand dort ihr
Standbild statt des Bildes der Serie; wer der Serie eines ausgesucht
hatte, fand ein anderes vor. Die Kachel behält das Standbild — sie zeigt,
wo man steht —, der Aufmacher bekommt `SeriesBackdropImage`.

**Die Punkte im Karussell waren 26 × 3 Pixel.** Von drei Klicks auf
denselben Punkt traf nur der auf der Mittellinie; fünf Pixel daneben
geschah nichts. Der Knopf ist jetzt 27 Pixel hoch, sichtbar bleiben 3.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-06 16:06:58 +02:00
co-authored by Claude Opus 5
parent f10fb4c1bc
commit 10a5070e58
17 changed files with 389 additions and 71 deletions
@@ -179,6 +179,44 @@ public class PlaybackTests
});
}
/// <summary>Eine Folge muss sich für sich abrufen lassen.</summary>
///
/// <remarks>
/// <b>Die Apps reichen eine blanke Kennung durch.</b> Sie haben sie aus
/// „Weiterschauen" und wissen nicht, was dahintersteckt — also fragen sie
/// der Reihe nach. Fand sich weder Film noch Serie, meldeten sie „Dieser
/// Titel ist auf dem Server nicht mehr vorhanden", über eine Folge, die
/// sie selbst gerade anzeigten.
/// </remarks>
[Test]
public async Task Eine_Folge_laesst_sich_einzeln_abrufen()
{
Datei("Dark (2017)/Season 01/Dark - S01E01 - Geheimnisse.mkv");
using var server = new FlaroServer();
var client = await Eingelesen(server, "Shows");
var serien = await client.GetFromJsonAsync<Page<SeriesResponse>>("/api/v1/series");
var serie = serien!.Items.Single();
var ausDerListe = (await client.GetFromJsonAsync<Page<EpisodeResponse>>(
$"/api/v1/series/{serie.Id}/episodes"))!.Items.Single();
var einzeln = await client.GetFromJsonAsync<EpisodeResponse>(
$"/api/v1/episodes/{ausDerListe.Id}");
Assert.Multiple(() =>
{
Assert.That(einzeln!.Id, Is.EqualTo(ausDerListe.Id));
Assert.That(einzeln.Season, Is.EqualTo(ausDerListe.Season));
Assert.That(einzeln.Episode, Is.EqualTo(ausDerListe.Episode));
Assert.That(einzeln.SeriesId, Is.EqualTo(serie.Id),
"ohne die Serie fehlen der Folge Titel und Bild");
Assert.That(einzeln.Files, Has.Count.EqualTo(ausDerListe.Files.Count));
});
var unbekannt = await client.GetAsync($"/api/v1/episodes/{Guid.NewGuid()}");
Assert.That(unbekannt.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
}
[Test]
public async Task Durchgeschautes_verlaesst_Weiterschauen()
{