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;