From 87b9fae94bfefd93429ddeb4f1b2689a36b6f61a Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Mon, 14 Sep 2026 19:02:01 +0200 Subject: [PATCH] Die Fortschrittsmeldungen waren stumm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sie hingen an einem verschluckten catch. Beim Suchen nach dem verlorenen Fortschritt war deshalb nirgends zu sehen, ob sie überhaupt ankommen — ohne await zu senden ist richtig, ohne Hinsehen nicht. Jetzt steht in der Konsole, was angenommen und was abgelehnt wurde. Dazu ein Hinweis auf die Regel des Servers, die den eigentlichen Fall erklärt: Jellyfin merkt sich eine Fortsetzposition nur zwischen fünf und neunzig Prozent der Laufzeit. Eine halbe Minute von einem Film liegt darunter, und der Server verwirft sie bewusst — "kurz reingeschaut" ist kein Weiterschauen. Wer das nicht weiß, sucht den Fehler bei sich. Co-Authored-By: Claude Opus 5 --- web/frontend/index.html | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/web/frontend/index.html b/web/frontend/index.html index 21b0f97..3002ea9 100644 --- a/web/frontend/index.html +++ b/web/frontend/index.html @@ -1768,6 +1768,19 @@ function openPlayer(item) { document.body.style.overflow = ''; // Die Startseite kennt den neuen Fortschritt noch nicht. if (current === 'home') renderHome(); + + // Jellyfin merkt sich eine Fortsetzposition nur zwischen fünf und + // neunzig Prozent der Laufzeit (MinResumePct/MaxResumePct). Wer früher + // abbricht, findet den Titel nicht unter „Weiterschauen" — das ist keine + // Panne, sondern die Regel des Servers. Gesagt wird es trotzdem, sonst + // sucht man den Fehler bei sich. + const anteil = lauf.sitzung?.stelle && v.duration + ? lauf.sitzung.stelle / v.duration : 0; + if (anteil > 0 && anteil < 0.05) { + console.info(`[Flixy] Bei ${(anteil * 100).toFixed(1)} % beendet — ` + + 'Jellyfin merkt sich das erst ab 5 %. Einstellbar im Dashboard unter ' + + 'Wiedergabe → Fortsetzen.'); + } } /* **Zurück aus dem Hintergrund.** @@ -2052,21 +2065,27 @@ function wireProgress(video, session) { session.stelle = 0; const send = (path, stelle = session.stelle, extra = {}) => { - // Absichtlich ohne await: eine verlorene Meldung kostet ein paar Sekunden - // Fortschritt. Dafür mitten im Film einen Fehler zu zeigen wäre die - // schlechtere Hälfte des Tauschs. + const ticks = Math.round(stelle * 10_000_000); + // Ohne await, aber **nicht** ohne Hinsehen: mitten im Film einen Fehler + // anzuzeigen wäre die schlechtere Hälfte des Tauschs — ihn gar nicht + // erst zu bemerken aber auch. Ein verschlucktes `catch` hat genau das + // getan, und deshalb war beim Suchen nach dem verlorenen Fortschritt + // nirgends zu sehen, ob die Meldungen überhaupt ankamen. api(path, { method: 'POST', body: JSON.stringify({ ItemId: session.itemID, PlaySessionId: session.id, MediaSourceId: session.sourceID, - PositionTicks: Math.round(stelle * 10_000_000), - // Jellyfin ordnet die Meldung sonst keiner Art von Wiedergabe zu und - // verwirft sie stillschweigend. + PositionTicks: ticks, + // Ohne die ordnet Jellyfin die Meldung keiner Art von Wiedergabe zu. PlayMethod: 'Transcode', CanSeek: true, ...extra, }), - }).catch(() => {}); + }).then(() => { + console.debug(`[Flixy] ${path} → ${(stelle / 60).toFixed(1)} min angenommen`); + }).catch((e) => { + console.warn(`[Flixy] ${path} abgelehnt: ${e.message}`); + }); }; session.melden = send;