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
/>