Eine Sekunde heisst nicht „Weiterschauen"
Die Schwelle aus den Einstellungen wirkt serverseitig, also sofort überall: `/home/continue` liest die gespeicherte Spalte. Eine Stelle blieb trotzdem widersprüchlich — die **Beschriftung**. Web und Apps entschieden „Weiterschauen" gegen „Abspielen" selbst, allein daran, ob eine Stelle über null steht. Nach einer Sekunde stand der Titel damit nicht mehr in der Reihe, hiess aber weiter „Weiterschauen", trug einen Fortschrittsbalken unter der Kachel und bot „Aus Weiterschauen entfernen" an. Der Server hatte diese Frage längst beantwortet. `ItemStateResponse` bringt sie jetzt mit; `MediaItem.isResumable` und `.resumeProgress` sind die einzigen Stellen, die sie noch stellen. Im Simulator nachgeprüft: nach einer Sekunde heisst der Knopf „Abspielen", „Von vorn" fehlt, und der Balken unter der Kachel ist weg. Kennt ein Server das Feld nicht — Jellyfin, oder ein älterer Flaro —, gilt wie früher die blosse Stelle. **Und das Profilbild steht in den Apps.** `FlaroAccount` führt es mit, `/auth/me` bringt es bei jedem Start frisch, und der Buchstabenkreis tritt zurück, sobald eines da ist. Jellyfin bleibt beim Buchstaben — dort gibt es kein Profilbild, und das ist keine Lücke, sondern der Stand der Dinge. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
579a49b73b
commit
e30158b84c
@@ -34,6 +34,13 @@ export type Stand = {
|
||||
watched: boolean; playCount: number;
|
||||
favourite: boolean; rating: number | null; dismissed: boolean;
|
||||
lastPlayedAt: string | null;
|
||||
/** Ob der Titel in „Fortsetzen" steht — die Entscheidung des Servers.
|
||||
*
|
||||
* **Nicht `positionSeconds > 0`.** Seit es eine einstellbare Untergrenze
|
||||
* gibt, sind das zwei verschiedene Fragen: eine Sekunde wird gemerkt, zählt
|
||||
* aber nicht als angefangen. Wer hier selbst rechnet, beschriftet den Knopf
|
||||
* anders, als die Startseite entscheidet. */
|
||||
inProgress?: boolean;
|
||||
};
|
||||
export type Mitwirkender = {
|
||||
id: string; name: string;
|
||||
|
||||
+6
-1
@@ -25,6 +25,8 @@ export type Heroeintrag = {
|
||||
laenge: number | null;
|
||||
/** Wo man stehengeblieben ist. */
|
||||
stelle: number;
|
||||
/** Ob der Server den Titel als angefangen führt — die Schwelle ist einstellbar. */
|
||||
angefangen: boolean;
|
||||
/** Wem der Fortschritt gehört: bei einer Folge der Folge, nicht der Serie. */
|
||||
standId: string;
|
||||
};
|
||||
@@ -227,7 +229,7 @@ export function hero(
|
||||
}
|
||||
|
||||
const beschriftung = e.dateiId === null ? 'Ansehen'
|
||||
: e.stelle > 0 ? `Fortsetzen ab ${dauer(e.stelle)}`
|
||||
: e.angefangen ? `Fortsetzen ab ${dauer(e.stelle)}`
|
||||
: 'Abspielen';
|
||||
spielen.textContent = beschriftung;
|
||||
spielen.prepend(spielIcon);
|
||||
@@ -332,6 +334,7 @@ export function alsHero(eintrag: Film | Serie, art: 'filme' | 'serien'): Heroein
|
||||
dateiId: datei?.id ?? null,
|
||||
laenge: datei?.durationSeconds ?? null,
|
||||
stelle: eintrag.state?.positionSeconds ?? 0,
|
||||
angefangen: eintrag.state?.inProgress ?? (eintrag.state?.positionSeconds ?? 0) > 0,
|
||||
standId: eintrag.id,
|
||||
};
|
||||
}
|
||||
@@ -366,6 +369,8 @@ export function angefangenAlsHero(eintrag: Angefangen): Heroeintrag {
|
||||
dateiId: eintrag.fileId ?? null,
|
||||
laenge: eintrag.durationSeconds ?? eintrag.state.runtimeSeconds,
|
||||
stelle: eintrag.state.positionSeconds,
|
||||
// Was in „Weiterschauen" steht, ist per Definition angefangen.
|
||||
angefangen: eintrag.state.inProgress ?? eintrag.state.positionSeconds > 0,
|
||||
standId: eintrag.id,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -268,12 +268,16 @@ export function detailseite(art: Art, id: string, zurueck: () => void): HTMLElem
|
||||
|
||||
if (datei && !nochNicht) {
|
||||
const stelle = stand?.positionSeconds ?? 0;
|
||||
const los = knopf(stelle > 0 ? `Fortsetzen ab ${dauer(stelle)}` : 'Abspielen', 'btn btn-primary');
|
||||
// **Der Server entscheidet, was „angefangen" heisst**, nicht diese
|
||||
// Zeile: die Schwelle steht in den Einstellungen. Ältere Server kennen
|
||||
// das Feld nicht — dann gilt wie früher die blosse Stelle.
|
||||
const angefangen = stand?.inProgress ?? stelle > 0;
|
||||
const los = knopf(angefangen ? `Fortsetzen ab ${dauer(stelle)}` : 'Abspielen', 'btn btn-primary');
|
||||
los.prepend(icon('abspielen'));
|
||||
los.onclick = () => starten(datei, eintrag.id, titelzeile(eintrag), stelle);
|
||||
los.onclick = () => starten(datei, eintrag.id, titelzeile(eintrag), angefangen ? stelle : 0);
|
||||
reihe.appendChild(los);
|
||||
|
||||
if (stelle > 0) {
|
||||
if (angefangen) {
|
||||
const vonVorn = knopf('Von vorn', 'btn');
|
||||
vonVorn.onclick = () => starten(datei, eintrag.id, titelzeile(eintrag), 0);
|
||||
reihe.appendChild(vonVorn);
|
||||
|
||||
Reference in New Issue
Block a user