From e21fc658e467680ae45b856d797509084b05957e Mon Sep 17 00:00:00 2001 From: mkelvers Date: Fri, 1 May 2026 18:38:35 +0200 Subject: [PATCH] fix(player): improve buffered progress bar calculation to accurately track the current chunk --- static/player.ts | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/static/player.ts b/static/player.ts index 1758b8a..78b97d9 100644 --- a/static/player.ts +++ b/static/player.ts @@ -363,11 +363,25 @@ const initPlayer = (): void => { if (durationDisplay) durationDisplay.textContent = formatTime(bounds.duration) if (buffered && video) { - let maxBuffered = 0 + let bufferedEnd = 0 for (let i = 0; i < video.buffered.length; i++) { - maxBuffered = Math.max(maxBuffered, video.buffered.end(i)) + if (video.buffered.start(i) <= currentTime && video.buffered.end(i) >= currentTime) { + bufferedEnd = video.buffered.end(i) + break + } } - const bufferedDisplayTime = displayTimeFromAbsolute(maxBuffered) + + // If we couldn't find a range containing current time (can happen immediately after seeking), + // fallback to the highest buffered end that is greater than current time + if (bufferedEnd === 0) { + for (let i = 0; i < video.buffered.length; i++) { + if (video.buffered.end(i) > currentTime) { + bufferedEnd = Math.max(bufferedEnd, video.buffered.end(i)) + } + } + } + + const bufferedDisplayTime = displayTimeFromAbsolute(bufferedEnd) const bufferedPct = Math.max(0, Math.min(100, (bufferedDisplayTime / bounds.duration) * 100)) buffered.style.width = `${bufferedPct}%` }