From 5cfecd7786eb178e78d267dab305c1649309bbc2 Mon Sep 17 00:00:00 2001 From: isUnknown Date: Fri, 20 Mar 2026 14:55:39 +0100 Subject: [PATCH] =?UTF-8?q?fix(expertise):=20vid=C3=A9o=20bloqu=C3=A9e=20q?= =?UTF-8?q?uand=20fwdTarget=20=3D=20duration=20(3+=20items)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug : quand la vidéo forward atteint la fin (duration), timeupdate ne fire pas toujours avec currentTime >= duration exactement. Le handler ne se déclenche jamais, fwdTarget n'est pas nettoyé, currentFwdTime garde l'ancienne valeur → la reprise en reverse part du mauvais point. Corrections : - Écoute l'événement ended sur les deux vidéos pour garantir le snap de currentFwdTime aux bornes (0 ou duration) - Tolérance de 50ms dans les comparaisons timeupdate (>= target - 0.05) pour capter la cible avant la fin naturelle de la vidéo - Suppression du reassign de currentTime dans les handlers timeupdate (inutile et pouvait causer un seek superflu) Co-Authored-By: Claude Opus 4.6 --- src/views/Expertise.svelte | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/views/Expertise.svelte b/src/views/Expertise.svelte index 19b286d..229ef79 100644 --- a/src/views/Expertise.svelte +++ b/src/views/Expertise.svelte @@ -189,27 +189,39 @@ const onFwdUpdate = () => { if (!videoFwd || videoFwd.paused || fwdTarget === null) return - if (videoFwd.currentTime >= fwdTarget) { - currentFwdTime = fwdTarget // snap exactement à la cible - videoFwd.currentTime = fwdTarget + if (videoFwd.currentTime >= fwdTarget - 0.05) { + currentFwdTime = fwdTarget videoFwd.pause() fwdTarget = null } } videoFwd?.addEventListener('timeupdate', onFwdUpdate) + // Quand la vidéo forward atteint la fin naturellement, timeupdate + // peut ne pas fire avec currentTime >= duration. ended le garantit. + const onFwdEnded = () => { + currentFwdTime = videoDuration + fwdTarget = null + } + videoFwd?.addEventListener('ended', onFwdEnded) + const onRevUpdate = () => { if (!videoRev || videoRev.paused || revTarget === null) return - if (videoRev.currentTime >= revTarget) { + if (videoRev.currentTime >= revTarget - 0.05) { const fwdPos = videoDuration - revTarget - currentFwdTime = Math.max(fwdPos, 0) // snap exactement - videoRev.currentTime = revTarget + currentFwdTime = Math.max(fwdPos, 0) videoRev.pause() revTarget = null } } videoRev?.addEventListener('timeupdate', onRevUpdate) + const onRevEnded = () => { + currentFwdTime = 0 + revTarget = null + } + videoRev?.addEventListener('ended', onRevEnded) + const onResize = () => { if (isActive) computeOffset() } window.addEventListener('resize', onResize) window.addEventListener('orientationchange', onResize) @@ -218,7 +230,9 @@ return () => { sectionEl?.removeEventListener('wheel', nav.onWheel) videoFwd?.removeEventListener('timeupdate', onFwdUpdate) + videoFwd?.removeEventListener('ended', onFwdEnded) videoRev?.removeEventListener('timeupdate', onRevUpdate) + videoRev?.removeEventListener('ended', onRevEnded) window.removeEventListener('resize', onResize) window.removeEventListener('orientationchange', onResize) window.removeEventListener('keydown', nav.onKeyDown)