Zwölf Sekunden für eine Hülle um nichts

Die Messung sagt es deutlich:

    20:15:53  Umpacken    — Schlüsselbildsuche 2348 ms, Vorbereitung 2394 ms.
    20:16:05  Umkodieren  — Schlüsselbildsuche 0 ms, Vorbereitung 0 ms.
    20:16:08  erstes Stück nach 2750 ms.

Fünfzehn Sekunden, und zwölf davon liegen zwischen zwei Bestellungen für
denselben Film. Der erste Strom wurde angelegt und dann nie abgeholt —
keine Medienliste, kein Stück, kein ffmpeg-Fehler. Danach gab die App auf
und bestellte neu, diesmal mit Umkodieren, und das lief nach knapp drei
Sekunden.

Dazwischen lag die Hauptliste. Es gibt sie allein wegen der
Untertitelspuren, und bei diesem Film waren die noch gar nicht aus der
Datei gezogen — sie war also leer bis auf einen Verweis auf die
Medienliste. Eine Hülle um nichts, und keine umsonst: ohne `CODECS` muss
ein Spieler sie erst aufmachen, um zu sehen, was darin liegt.

Jetzt gibt es sie nur, wenn wenigstens eine Spur abholbar ist. Sonst
bekommt die App die Medienliste unmittelbar — denselben Weg wie der
Browser, der nie gestolpert ist.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-10 20:20:16 +02:00
co-authored by Claude Opus 5
parent a6b3217d6e
commit 19ec17da19
2 changed files with 37 additions and 14 deletions
+16 -11
View File
@@ -432,11 +432,18 @@ public class StreamTests
[Test]
public async Task Die_Hauptliste_nennt_die_Bildspur()
{
Film("Hauptliste (2020)");
FilmMitUntertitel("Hauptliste (2020)");
var (client, datei) = await Eingelesen();
var strom = await Strom(client, datei.Id, Browser());
Assert.That(strom.MasterUrl, Is.Not.Null, "Eine Sitzung hat eine Hauptliste.");
(await client.GetAsync(
$"/api/v1/files/{datei.Id}/subtitles/{strom.SubtitleStreams.Single().Index}.vtt"))
.EnsureSuccessStatusCode();
// Noch einmal bestellen: die Hauptliste gibt es erst, wenn eine Spur
// abholbar ist — vorher wäre sie eine Hülle um die Medienliste.
strom = await Strom(client, datei.Id, Browser());
Assert.That(strom.MasterUrl, Is.Not.Null);
var liste = await client.GetStringAsync(strom.MasterUrl!);
@@ -465,13 +472,14 @@ public class StreamTests
var spur = strom.SubtitleStreams.Single();
// **Erst holen, dann fragen.** In der Hauptliste steht nur, was
// sofort abholbar ist; der Abruf der Spur wartet, bis sie aus der
// Datei gezogen ist. Ohne diesen Schritt hinge die Prüfung daran,
// wie schnell der Rechner gerade ist.
// sofort abholbar ist, und es gibt sie überhaupt nur dann; der Abruf
// der Spur wartet, bis sie aus der Datei gezogen ist. Ohne diesen
// Schritt hinge die Prüfung daran, wie schnell der Rechner ist.
(await client.GetAsync(
$"/api/v1/files/{datei.Id}/subtitles/{spur.Index}.vtt")).EnsureSuccessStatusCode();
var liste = await client.GetStringAsync(strom.MasterUrl!);
var zweiter = await Strom(client, datei.Id, Browser());
var liste = await client.GetStringAsync(zweiter.MasterUrl!);
Assert.Multiple(() =>
{
@@ -585,11 +593,8 @@ public class StreamTests
var strom = await Strom(client, datei.Id, new StreamRequest(
Containers: null, VideoCodecs: null, AudioCodecs: null, StartSeconds: 0));
Assert.That(strom.MasterUrl, Is.Not.Null, "Eine MKV ist für Apple nichts zum Durchreichen.");
var haupt = await client.GetAsync(strom.MasterUrl!);
Assert.That(haupt.StatusCode, Is.EqualTo(HttpStatusCode.OK),
await haupt.Content.ReadAsStringAsync());
Assert.That(strom.Method, Is.Not.EqualTo("direct"),
"Eine MKV ist für Apple nichts zum Durchreichen.");
var medien = await client.GetAsync(strom.Url);
Assert.That(medien.StatusCode, Is.EqualTo(HttpStatusCode.OK),