Vier Stellen, an denen eine Angabe unterwegs verlorenging
**Der Aufmacher wusste nur die Serie.** `Heroeintrag.titel` ist bei einer angefangenen Folge der Name der Serie — richtig, denn der Aufmacher zeigt die Serie. Wer von dort startete, las über dem Spieler „Biohackers" und nicht, welche Folge läuft. Staffel, Nummer und Folgentitel reisen jetzt mit. Dasselbe im Aufmacher selbst: „Staffel 1 · Folge 2" statt „S1 · F2". **Der Abspann ist kein Angebot, sondern eine Frage.** Die Acht-Sekunden- Frist von gestern war für das Intro gedacht und traf den Abspann mit: „Nächste Folge" verschwand genau dort, wo man hinsieht. Ein Intro-Knopf geht, wenn man ihn nicht nimmt; der Abspann-Knopf bleibt, bis die Folge zu Ende ist. Web und App. **„deu" stand da, weil es in der Datei steht.** Der Server reichte einen vorhandenen Spurnamen unbesehen durch — und viele Dateien tragen als Titel schlicht das Sprachkürzel. Wiederholt er bloss die Sprache, gilt er nicht, und die Tabelle darunter macht „Deutsch" daraus. **Und zweimal „Deutsch" ist keine Wahl.** Zwei deutsche Untertitelspuren sind der Normalfall — Vollfassung und Nur-Fremdsprachiges. Gleichnamige bekommen jetzt ihren Codec dazu, und wenn der auch gleich ist, die Nummer. Das kann keine Spur für sich beantworten: ob ein Name eindeutig ist, hängt an den anderen. Deshalb steht es in `Benennung` und hat fünf Prüfungen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
d152ac3795
commit
a360bed02b
+19
-2
@@ -1,6 +1,6 @@
|
||||
import { bildAdresse, type Angefangen, type Film, type Serie } from './api';
|
||||
import { icons } from './icons';
|
||||
import { dauer, knopf } from './util';
|
||||
import { dauer, knopf, folgenname } from './util';
|
||||
|
||||
/** Was im Hero stehen kann — Film, Serie oder eine angefangene Folge. */
|
||||
export type Heroeintrag = {
|
||||
@@ -29,6 +29,15 @@ export type Heroeintrag = {
|
||||
angefangen: boolean;
|
||||
/** Wem der Fortschritt gehört: bei einer Folge der Folge, nicht der Serie. */
|
||||
standId: string;
|
||||
|
||||
/** Bei einer Folge ihre Teile — für die Zeile über dem Spieler.
|
||||
*
|
||||
* **`titel` reicht dafür nicht.** Dort steht bei einer Folge der Name der
|
||||
* *Serie*, weil der Aufmacher die Serie zeigt. Wer von hier aus startete,
|
||||
* las über dem Spieler nur „Biohackers" und nicht, welche Folge läuft. */
|
||||
staffel: number | null;
|
||||
folge: number | null;
|
||||
folgentitel: string | null;
|
||||
};
|
||||
|
||||
const WECHSEL_MS = 9000;
|
||||
@@ -461,6 +470,9 @@ export function alsHero(eintrag: Film | Serie, art: 'filme' | 'serien'): Heroein
|
||||
bewertung: eintrag.rating,
|
||||
beschreibung: eintrag.overview,
|
||||
verfuegbarAb: eintrag.publishAt,
|
||||
staffel: null,
|
||||
folge: null,
|
||||
folgentitel: null,
|
||||
dateiId: datei?.id ?? null,
|
||||
laenge: datei?.durationSeconds ?? null,
|
||||
stelle: eintrag.state?.positionSeconds ?? 0,
|
||||
@@ -492,10 +504,15 @@ export function angefangenAlsHero(eintrag: Angefangen): Heroeintrag {
|
||||
laufzeit: null,
|
||||
freigabe: null,
|
||||
bewertung: null,
|
||||
// Ausgeschrieben, nicht „S1 · F2": der Aufmacher hat den Platz dafür,
|
||||
// und zwei Buchstaben mit Zahl liest niemand gern.
|
||||
beschreibung: folge && eintrag.season !== null
|
||||
? `S${eintrag.season} · F${eintrag.episode}${eintrag.subTitle ? ` — ${eintrag.subTitle}` : ''}`
|
||||
? folgenname(null, eintrag.season, eintrag.episode, eintrag.subTitle)
|
||||
: null,
|
||||
verfuegbarAb: eintrag.publishAt ?? null,
|
||||
staffel: folge ? eintrag.season : null,
|
||||
folge: folge ? eintrag.episode : null,
|
||||
folgentitel: folge ? eintrag.subTitle : null,
|
||||
dateiId: eintrag.fileId ?? null,
|
||||
laenge: eintrag.durationSeconds ?? eintrag.state.runtimeSeconds,
|
||||
stelle: eintrag.state.positionSeconds,
|
||||
|
||||
@@ -852,15 +852,17 @@ export function spieler(anfrage: Spieleranfrage): void {
|
||||
|
||||
if (kennung !== markenstandJetzt) markenAb = performance.now();
|
||||
|
||||
// **Eine Marke dauert Minuten, ein Angebot nicht.** Die Knöpfe kommen
|
||||
// von selbst, ohne dass man den Film antippen muss — aber ein Abspann
|
||||
// läuft sechs Minuten, und so lange gehört kein Knopf über das Bild.
|
||||
// Acht Sekunden von allein, danach nur noch zusammen mit der übrigen
|
||||
// Bedienung: wer später doch überspringen will, bewegt die Maus.
|
||||
const frisch = performance.now() - markenAb < 8000;
|
||||
// **Ein Intro ist ein Angebot, ein Abspann eine Frage.**
|
||||
//
|
||||
// „Intro überspringen" kommt von selbst und geht nach acht Sekunden
|
||||
// wieder: wer es nicht genommen hat, will zusehen, und dann gehört
|
||||
// kein Knopf über das Bild. Im Abspann ist es umgekehrt. „Nächste
|
||||
// Folge" ist das, wofür man dort überhaupt hinsieht — der bleibt
|
||||
// stehen, bis die Folge zu Ende ist.
|
||||
const bleibt = abspann || performance.now() - markenAb < 8000;
|
||||
markeLaeuft = drin != null;
|
||||
markenreihe.classList.toggle(
|
||||
'hidden', !drin || (!frisch && schicht.classList.contains('pl-still')));
|
||||
'hidden', !drin || (!bleibt && schicht.classList.contains('pl-still')));
|
||||
|
||||
if (!drin || kennung === markenstandJetzt) return;
|
||||
markenstandJetzt = kennung;
|
||||
|
||||
@@ -106,6 +106,12 @@ export function startseite(
|
||||
dateiId: e.dateiId,
|
||||
titelId: e.standId,
|
||||
name: e.titel,
|
||||
// Bei einer Folge steht in `titel` der Name der Serie — der
|
||||
// Aufmacher zeigt die Serie. Die Folge selbst kommt daneben.
|
||||
serie: e.staffel != null ? e.titel : null,
|
||||
staffel: e.staffel,
|
||||
folge: e.folge,
|
||||
folgentitel: e.folgentitel,
|
||||
ab: e.stelle,
|
||||
laenge: e.laenge,
|
||||
danach: () => void aufbauen(),
|
||||
|
||||
Reference in New Issue
Block a user