summaryrefslogtreecommitdiff
path: root/src/components/jet/Video.svelte
diff options
context:
space:
mode:
authorrxliuli <rxliuli@gmail.com>2025-11-04 05:03:50 +0800
committerrxliuli <rxliuli@gmail.com>2025-11-04 05:03:50 +0800
commitbce557cc2dc767628bed6aac87301a1be7c5431b (patch)
treeb51a051228d01fe3306cd7626d4a96768aadb944 /src/components/jet/Video.svelte
init commit
Diffstat (limited to 'src/components/jet/Video.svelte')
-rw-r--r--src/components/jet/Video.svelte66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/components/jet/Video.svelte b/src/components/jet/Video.svelte
new file mode 100644
index 0000000..8d2e4f3
--- /dev/null
+++ b/src/components/jet/Video.svelte
@@ -0,0 +1,66 @@
+<script lang="ts">
+ import type { Video } from '@jet-app/app-store/api/models';
+ import VideoPlayer from '../VideoPlayer.svelte';
+ import HlsJsDecorator from '../decorators/HlsJSDecorator.svelte';
+ import { buildPoster } from '~/utils/video-poster';
+ import { generateUuid } from '@amp/web-apps-utils/src';
+ import type { NamedProfile } from 'src/config/components/artwork';
+ import type { Profile } from '@amp/web-app-components/src/components/Artwork/types';
+ import mediaQueries from '~/utils/media-queries';
+ import { colorAsString } from '~/utils/color';
+
+ export let video: Video;
+ export let autoplay: boolean = false;
+ export let loop: boolean = false;
+ export let muted: boolean = true;
+ export let useControls: boolean = true;
+ export let profile: NamedProfile | Profile;
+ export let autoplayVisibilityThreshold: number = 0;
+ export let videoPlayerRef: InstanceType<typeof VideoPlayer> | null = null;
+ export let shouldSuperimposePosterImage: boolean = false;
+
+ $: poster =
+ video.preview && buildPoster(video.preview, profile, $mediaQueries);
+ $: backgroundColor = video.preview.backgroundColor
+ ? colorAsString(video.preview.backgroundColor)
+ : '#f1f1f1';
+
+ $: metricsTemplate = video?.templateMediaEvent ?? {};
+ const uuid = generateUuid();
+</script>
+
+<HlsJsDecorator let:HLS>
+ <VideoPlayer
+ {HLS}
+ {loop}
+ {muted}
+ {autoplay}
+ {useControls}
+ {autoplayVisibilityThreshold}
+ {metricsTemplate}
+ {shouldSuperimposePosterImage}
+ id={uuid}
+ src={video.videoUrl}
+ poster={poster ?? undefined}
+ --aspect-ratio={video.preview.width / video.preview.height}
+ bind:this={videoPlayerRef}
+ />
+
+ <div
+ class="loader"
+ slot="loading-component"
+ style:--aspect-ratio={video.preview.width / video.preview.height}
+ style:--background-image={`url(${poster})`}
+ style:--background-color={backgroundColor}
+ />
+</HlsJsDecorator>
+
+<style>
+ .loader {
+ aspect-ratio: var(--aspect-ratio);
+ width: 100%;
+ background-image: var(--background-image);
+ background-color: var(--background-color);
+ background-size: cover;
+ }
+</style>