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}
-
- -
+ {#if playerTimelineTooltipVisible} -
+
{videoLength(playerTimelineTimeHover)}
{/if} @@ -1087,28 +1103,21 @@ {#if Capacitor.getPlatform() !== 'android'} -
-
+ playerElement.volume = playerVolume; + }} + bind:value={playerVolume} + type="range" + step="0.1" + max="1" + /> + {/key} + {/if} @@ -1358,6 +1367,10 @@ padding: 10px; } + #player-controls span { + clip-path: none; + } + #player-center { position: absolute; width: 100%; @@ -1412,6 +1425,17 @@ user-select: none; } + .buffered-bar { + position: absolute; + height: 1rem; + background: var(--secondary); + top: 50%; + left: 0; + transform: translateY(-50%); + z-index: 0; + pointer-events: none; + } + menu.mobile { transform: scale(1) translateY(-40%) translateX(0); width: 300px; diff --git a/materialious/src/lib/components/settings/Settings.svelte b/materialious/src/lib/components/settings/Settings.svelte index 38d4ec73..9993f2b4 100644 --- a/materialious/src/lib/components/settings/Settings.svelte +++ b/materialious/src/lib/components/settings/Settings.svelte @@ -172,11 +172,15 @@