diff --git a/src/lib/components/Utils/Spinner.svelte b/src/lib/components/Utils/Spinner.svelte new file mode 100644 index 0000000..6b78121 --- /dev/null +++ b/src/lib/components/Utils/Spinner.svelte @@ -0,0 +1,26 @@ + diff --git a/src/lib/components/VideoPlayer/VideoElement.svelte b/src/lib/components/VideoPlayer/VideoElement.svelte index e16e623..328a040 100644 --- a/src/lib/components/VideoPlayer/VideoElement.svelte +++ b/src/lib/components/VideoPlayer/VideoElement.svelte @@ -14,13 +14,19 @@ export let muted = false; export let volume = 1; export let videoDidLoad = false; + export let buffering = false; export let video: HTMLVideoElement; + // let hls: Hls | undefined; + $: playbackInfo && loadPlaybackInfo(playbackInfo); function loadPlaybackInfo(playbackInfo: PlaybackInfo) { videoDidLoad = false; + // video.src = ''; + // video.srcObject = null; + // hls?.destroy(); const { playbackUrl, directPlay, backdrop, startTime } = playbackInfo; @@ -30,6 +36,7 @@ if (!directPlay) { if (Hls.isSupported()) { + console.log('HLS is supported, loading HLS.js'); const hls = new Hls(); hls.loadSource(playbackUrl); @@ -94,6 +101,8 @@ videoDidLoad = true; console.log('Video loaded'); }} + on:waiting={() => (buffering = true)} + on:playing={() => (buffering = false)} on:dblclick on:click={togglePlay} autoplay diff --git a/src/lib/components/VideoPlayer/VideoPlayer.svelte b/src/lib/components/VideoPlayer/VideoPlayer.svelte index 926751d..006f4d1 100644 --- a/src/lib/components/VideoPlayer/VideoPlayer.svelte +++ b/src/lib/components/VideoPlayer/VideoPlayer.svelte @@ -8,9 +8,10 @@ import type { Selectable } from '../../selectable'; import { modalStack } from '../Modal/modal.store'; import SelectSubtitlesModal from './SelectSubtitlesModal.svelte'; - import { ChatBubble, TextAlignLeft } from 'radix-icons-svelte'; + import { ChatBubble, TextAlignLeft, Update } from 'radix-icons-svelte'; import IconButton from './IconButton.svelte'; import SelectAudioModal from './SelectAudioModal.svelte'; + import Spinner from '../Utils/Spinner.svelte'; export let playbackInfo: PlaybackInfo | undefined; export let subtitleInfo: SubtitleInfo | undefined; @@ -26,6 +27,7 @@ export let muted = false; export let volume = 1; export let videoDidLoad = false; + let buffering = false; export let video: HTMLVideoElement; @@ -76,6 +78,27 @@ else console.error('No playback info when selecting audio stream'); } + function handleShortcuts(e: KeyboardEvent) { + if (e.key === ' ' || e.key === 'k') { + e.preventDefault(); + if (paused) video.play(); + else video.pause(); + } else if (e.key === 'm') { + e.preventDefault(); + video.muted = !video.muted; + } else if (e.key === 'f') { + e.preventDefault(); + if (document.fullscreenElement) document.exitFullscreen(); + else video.requestFullscreen(); + } else if (e.key === 'ArrowUp') { + e.preventDefault(); + video.volume = Math.min(video.volume + 0.1, 1); + } else if (e.key === 'ArrowDown') { + e.preventDefault(); + video.volume = Math.max(video.volume - 0.1, 0); + } + } + onDestroy(() => { clearTimeout(showInterfaceTimeout); clearTimeout(hideInterfaceTimeout); @@ -105,6 +128,7 @@ bind:volume bind:videoDidLoad bind:video + bind:buffering /> Title + {#if buffering || !videoDidLoad} +
+ +
+ {/if} + +