import React from "react";
import {Video} from "@remotion/media";
import {AbsoluteFill, staticFile} from "remotion";
import type {VQVideoEvent} from "../timeline";
const externalVideoSourcePattern = /^(https?:|data:|blob:)/;
// 用途: videoイベントのsrcをRemotionで再生できるURLへ変換する。
// 使用方法: VQTimelineVideo内でpublic配下の相対パスと外部URLを同じpropsから扱う。
// オプションや引数詳細: http/https/data/blobはそのまま返し、それ以外はstaticFileのpublic相対パスとして扱う。
const resolveVideoSource = (src: string) =>
externalVideoSourcePattern.test(src) ? src : staticFile(src);
// 用途: VQVideoEventをタイムライン上の動画レイヤーとして描画する。
// 使用方法: scheduled segmentのSequence内でvideoイベントを渡して使う。
// オプションや引数詳細: 表示尺は親Sequenceで制御し、loop/trim/音量/速度/配置はeventから反映する。
export const VQTimelineVideo: React.FC<
Readonly<{
video: VQVideoEvent;
}>
> = ({video}) => {
return (
<AbsoluteFill
style={{
opacity: video.opacity,
zIndex: video.zIndex,
pointerEvents: "none",
}}
>
<Video
muted={video.muted ?? true}
loop={video.playback === "loop"}
loopVolumeCurveBehavior={video.loopVolumeCurveBehavior}
objectFit={video.fit ?? "cover"}
playbackRate={video.playbackRate}
toneFrequency={video.toneFrequency}
trimBefore={video.trimBeforeFrames}
trimAfter={video.trimAfterFrames}
volume={() => video.volume ?? 1}
src={resolveVideoSource(video.src)}
style={{
width: "100%",
height: "100%",
objectPosition: video.objectPosition,
}}
/>
</AbsoluteFill>
);
};