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:
co-authored by
Claude Opus 5
parent
a6b3217d6e
commit
19ec17da19
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user