diff --git a/materialious/src/lib/components/Player.svelte b/materialious/src/lib/components/Player.svelte index 07b2bd90..a5b8ead6 100644 --- a/materialious/src/lib/components/Player.svelte +++ b/materialious/src/lib/components/Player.svelte @@ -79,10 +79,11 @@ let player: shaka.Player; let sabrAdapter: SabrStreamingAdapter | null; let playerContainer: HTMLElement; + let bufferBar: HTMLElement | undefined = $state(); let playerCurrentPlaybackState = $state(false); let playerCurrentTime = $state(0); - let playerMaxKnownTime = $state(0); + let playerMaxKnownTime = $state(data.video.lengthSeconds); let playerIsBuffering = $state(false); let playerVolume = $state(0); let playerSettings: 'quality' | 'speed' | 'language' | 'root' = $state('root'); @@ -99,7 +100,7 @@ // eslint-disable-next-line no-undef let clickCounterTimeout: NodeJS.Timeout; - let seekDirection: 'forwards' | 'backwards' = ''; + let seekDirection: 'forwards' | 'backwards' = $state('forwards'); const STORAGE_KEY_VOLUME = 'shaka-preferred-volume'; @@ -805,6 +806,23 @@ if (playerMaxKnownTime === 0 || playerCurrentTime > playerMaxKnownTime) { playerMaxKnownTime = Number(playerElement?.currentTime); } + + const buffered = playerElement.buffered; + + if (buffered.length > 0 && bufferBar) { + const bufferedEnd = buffered.end(0); // Amount shaka has buffered + const startBuffer = Math.max(playerElement.currentTime, 0); + + // Calculate the buffered width as a percentage starting from the current time + const bufferedWidth = + ((bufferedEnd - startBuffer) / (playerMaxKnownTime - startBuffer)) * 100; + + const currentSliderPercentage = (playerCurrentTime / playerMaxKnownTime) * 100; + + const effectiveWidth = Math.max(bufferedWidth, 0); + bufferBar.style.width = effectiveWidth + '%'; + bufferBar.style.left = currentSliderPercentage + '%'; + } }); try { @@ -1051,26 +1069,24 @@ {#if !hideControls}