Die Untertitel holen, bevor jemand sie einschaltet
Zwei Minuten „wird geholt", und noch immer kein Text. Die Ablage von vorhin
war richtig und reichte nicht: beim ersten Mal musste immer noch jemand
warten, und zwar der, der gerade einen Film anschaut.
Das Lesen selbst lässt sich nicht beschleunigen. Untertitelpakete liegen
über die ganze Datei verteilt; sie zu finden heisst, alles zu lesen. Bei
vierzig Gigabyte auf einem NAS sind das Minuten, und daran ändert kein
Schalter etwas. Also nicht schneller lesen, sondern früher.
Der Vorrat arbeitet die Mediathek jetzt von sich aus durch: beim Start des
Servers und nach jedem Scan, die zuletzt hinzugekommenen zuerst. Eine Datei
nach der anderen, mit zwei Sekunden Pause dazwischen — das Lesen ist von
der Platte begrenzt, und eine laufende Wiedergabe liest von derselben
Platte und ist wichtiger. Wer einen Film startet, drängelt sich vor: seine
Datei ist als Nächstes dran statt als Dreissigste.
Einmal je Datei, nie wieder: der Name der Ablage trägt den
Änderungszeitpunkt. Eine ersetzte Datei bekommt dadurch von selbst einen
neuen Namen, eine unveränderte wird nie zweimal gelesen.
Gemessen am Prüfserver mit leerer Ablage:
Start, ohne jeden Abruf -> „1 Datei(en) werden im Hintergrund
gelesen", danach „2 von 2 Spur(en)"
Klick auf „Deutsch" -> 153 ms bis zum Text, 10 Einblendungen,
die erste bei 0 bis 3 s
Landet jemand trotzdem im Wartefall, gibt der Spieler nicht mehr nach zwei
Minuten auf, sondern fragt zehn Minuten lang nach — und sagt dazu, dass es
einmalig ist.
Die Auswahl der Textspuren stand zweimal im Quelltext und steht jetzt
einmal: im Vorrat. Zwei Listen, von denen eine das Menü füllt und die
andere bestimmt, was geholt wird, laufen sonst irgendwann auseinander.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
c2fd2a86fd
commit
1531163bc1
@@ -793,9 +793,12 @@ export function spieler(anfrage: Spieleranfrage): void {
|
||||
.find(t => t.dataset.spur === String(spur));
|
||||
if (!element) return;
|
||||
|
||||
// Rund zwei Minuten lang nachfragen. Wer länger braucht, hat ein
|
||||
// Problem, das kein Warten löst — und bekommt es dann auch gesagt.
|
||||
for (let versuch = 0; versuch < 40; versuch++) {
|
||||
// **Lange nachfragen, und zwar absichtlich.** Der Server holt die Spur
|
||||
// normalerweise schon im Hintergrund, bevor jemand sie einschaltet;
|
||||
// landet man trotzdem hier, läuft gerade das Lesen einer grossen Datei,
|
||||
// und das dauert Minuten. Aufzugeben hiesse, kurz vor dem Ziel
|
||||
// abzubrechen — zehn Minuten sind der Preis dafür, dass es dann klappt.
|
||||
for (let versuch = 0; versuch < 200; versuch++) {
|
||||
if (geschlossen || untertitel !== spur) return;
|
||||
|
||||
const stand = await untertitelHolen(anfrage.dateiId, spur, vorlauf);
|
||||
@@ -816,12 +819,12 @@ export function spieler(anfrage: Spieleranfrage): void {
|
||||
}
|
||||
|
||||
if (versuch === 0) {
|
||||
hinweisZeigen('Die Untertitel werden aus der Datei geholt — das dauert beim ersten Mal.');
|
||||
hinweisZeigen('Diese Untertitel werden einmalig aus der Datei geholt. Bei einem grossen Film dauert das ein paar Minuten — danach sind sie sofort da.');
|
||||
}
|
||||
await new Promise(r => setTimeout(r, 3000));
|
||||
}
|
||||
|
||||
hinweisZeigen('Die Untertitel brauchen zu lange. Versuche es später noch einmal.', 'fehler');
|
||||
hinweisZeigen('Die Untertitel brauchen ungewöhnlich lange. Schau später noch einmal — im Hintergrund wird weitergelesen.', 'fehler');
|
||||
}
|
||||
|
||||
/* ---------- Fehler ---------- */
|
||||
|
||||
Reference in New Issue
Block a user