diff --git a/recorder.py b/recorder.py index 5a4b394..8531c94 100644 --- a/recorder.py +++ b/recorder.py @@ -1057,32 +1057,45 @@ function savePlaybackPosition(audio) { function restorePlaybackPosition(audio) { const key = playbackKey(audio); - if (!key) return; + if (!key) return false; try { const saved = JSON.parse(localStorage.getItem(key) || 'null'); if (!saved || !Number.isFinite(saved.position) || saved.position <= 0) { - return; + return false; } - // Erst setzen, wenn die Metadaten/Dauer bekannt sind. + // Bei preload=none kann loadedmetadata erst beim ersten Abspielen + // eintreten. Deshalb wird diese Funktion auch von play/canplay + // aufgerufen. if (Number.isFinite(audio.duration) && audio.duration > 0) { const position = Math.min(saved.position, Math.max(0, audio.duration - 0.5)); if (position > 0) { audio.currentTime = position; + return true; } } } catch (error) { console.warn('Wiedergabeposition konnte nicht wiederhergestellt werden:', error); } + + return false; } document.querySelectorAll('.finished-row audio').forEach(audio => { let lastSaved = 0; + let positionRestored = false; - audio.addEventListener('loadedmetadata', () => { - restorePlaybackPosition(audio); - }); + const tryRestorePlaybackPosition = () => { + if (!positionRestored) { + positionRestored = restorePlaybackPosition(audio); + } + }; + + audio.addEventListener('loadedmetadata', tryRestorePlaybackPosition); + audio.addEventListener('loadeddata', tryRestorePlaybackPosition); + audio.addEventListener('canplay', tryRestorePlaybackPosition); + audio.addEventListener('play', tryRestorePlaybackPosition); audio.addEventListener('timeupdate', () => { const now = Date.now();