video-viewer.svelte 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. <script lang="ts">
  2. import { fade } from 'svelte/transition';
  3. import { onMount } from 'svelte';
  4. import LoadingSpinner from '../shared-components/loading-spinner.svelte';
  5. import { api, AssetResponseDto, getFileUrl } from '@api';
  6. export let assetId: string;
  7. let asset: AssetResponseDto;
  8. let videoPlayerNode: HTMLVideoElement;
  9. let isVideoLoading = true;
  10. let videoUrl: string;
  11. onMount(async () => {
  12. const { data: assetInfo } = await api.assetApi.getAssetById(assetId);
  13. await loadVideoData(assetInfo);
  14. asset = assetInfo;
  15. });
  16. const loadVideoData = async (assetInfo: AssetResponseDto) => {
  17. isVideoLoading = true;
  18. videoUrl = getFileUrl(assetInfo.deviceAssetId, assetInfo.deviceId, false, true);
  19. return assetInfo;
  20. };
  21. const handleCanPlay = (ev: Event) => {
  22. const playerNode = ev.target as HTMLVideoElement;
  23. playerNode.muted = true;
  24. playerNode.play();
  25. playerNode.muted = false;
  26. isVideoLoading = false;
  27. };
  28. </script>
  29. <div
  30. transition:fade={{ duration: 150 }}
  31. class="flex place-items-center place-content-center h-full select-none"
  32. >
  33. {#if asset}
  34. <video
  35. controls
  36. class="h-full object-contain"
  37. on:canplay={handleCanPlay}
  38. bind:this={videoPlayerNode}
  39. >
  40. <source src={videoUrl} type="video/mp4" />
  41. <track kind="captions" />
  42. </video>
  43. {#if isVideoLoading}
  44. <div class="absolute flex place-items-center place-content-center">
  45. <LoadingSpinner />
  46. </div>
  47. {/if}
  48. {/if}
  49. </div>