Ein Client darf einen Stand fortschreiben, nicht zerstören
Ein Film stand bei 46 Minuten; nach einem Neuladen bot die Detailseite nur
noch „Abspielen" an. Gemessen am laufenden Server, was eine einzige Meldung
„Stelle 500 s, Laufzeit 60 s" anrichtet:
Stelle 500 s -> 60 s
Laufzeit 600 s -> 60 s
gesehen nein -> ja
Weiterschauen ja -> nein
Der Server beschnitt die Stelle auf die gemeldete Laufzeit, ersetzte die
richtige Laufzeit durch sie und setzte das Häkchen. Ein Film war damit weg.
Und 60 ist keine erfundene Zahl. Wer einen gerechneten Strom abspielt, misst
an einer Playlist, die noch wächst, und sieht anfangs nur einen Stummel.
Genau den meldete die App als Laufzeit — und sie meldet beim Öffnen
ausserdem die Zeit null, bevor sie überhaupt gesprungen ist.
Drei Stellen, dieselbe Regel:
- Server: die gemessene Laufzeit schlägt die gemeldete. Die Datei zuerst,
nicht der gemerkte Wert — stünde dort schon ein Stummel, bliebe er sonst
für immer stehen. So heilt sich ein verdorbener Eintrag von selbst.
- Server: eine gemeldete Null löscht keine gemerkte Stelle. Wer wirklich
von vorn anfängt, verliert nichts: zehn Sekunden später meldet derselbe
Spieler die 10, und die zählt. Zurückspulen bleibt unberührt.
- App: dieselbe Rangfolge bei der Laufzeit, und beim Öffnen wird die
Stelle gemeldet, an der der Spieler einsteigen will, statt der Null.
Im Webspieler kam eine eigene Null dazu: bei Direktwiedergabe gibt der
Server `startSeconds: 0` zurück und der Browser springt selbst, sobald die
Metadaten da sind. Kommen sie nie, weil er mit der Datei nicht zurechtkommt,
blieb `filmzeit()` auf null — und der Rückfall aufs Umkodieren, der
ausdrücklich „an der Stelle weiter, an der es hing" meint, fing von vorn an.
Der ausstehende Sprung zählt jetzt mit.
Fünf neue Prüfungen halten die gemessenen Zahlen fest, damit die Regel nicht
wieder umkippt.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
51d1db4641
commit
339a6c07d0
+15
-1
@@ -218,7 +218,21 @@ export function spieler(anfrage: Spieleranfrage): void {
|
||||
* weiss selten, welche. */
|
||||
let umkodierenErzwingen = false;
|
||||
|
||||
const filmzeit = (): number => vorlauf + (Number.isFinite(video.currentTime) ? video.currentTime : 0);
|
||||
/** Wo im Film der Spieler steht.
|
||||
*
|
||||
* **Der noch ausstehende Sprung zählt mit.** Bei Direktwiedergabe gibt der
|
||||
* Server `startSeconds: 0` zurück und der Browser springt selbst, sobald
|
||||
* die Metadaten da sind. Bis dahin steht `currentTime` auf null — und
|
||||
* kommen die Metadaten nie, weil der Browser mit der Datei nicht
|
||||
* zurechtkommt, bleibt es dabei.
|
||||
*
|
||||
* Genau dann greift der Rückfall aufs Umkodieren, und der bekam bisher
|
||||
* diese Null übergeben: „an der Stelle weiter, an der es hing" fing in
|
||||
* Wahrheit von vorn an. Gemeldet wurde die Null auch, und sie hat auf dem
|
||||
* Server eine gemerkte Stelle gelöscht. */
|
||||
const filmzeit = (): number => zuSpringen > 0
|
||||
? zuSpringen
|
||||
: vorlauf + (Number.isFinite(video.currentTime) ? video.currentTime : 0);
|
||||
|
||||
/* ---------- Aufbau ---------- */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user