Newer
Older
remotion_docker_devcontainer / voicevox-remotion-template / src / lib / VQRemotionLib / components / VQStillBackground.tsx
import React from "react";
import {AbsoluteFill, Img, staticFile} from "remotion";
import type {VQStillEvent} from "../types";

const remoteUrlPattern = /^https?:\/\//;

const publicPathForStill = (imagePath: string) => {
  const normalizedPath = imagePath.replace(/\\/g, "/");
  const publicPathIndex = normalizedPath.lastIndexOf("/public/");

  return (
    publicPathIndex >= 0
      ? normalizedPath.slice(publicPathIndex + "/public/".length)
      : normalizedPath
  ).replace(/^\/+/, "");
};

const srcForStill = (imagePath: string) =>
  remoteUrlPattern.test(imagePath)
    ? imagePath
    : staticFile(publicPathForStill(imagePath));

export const VQStillBackground: React.FC<
  Readonly<{
    still?: VQStillEvent;
    style?: React.CSSProperties;
    imageStyle?: React.CSSProperties;
  }>
> = ({still, style, imageStyle}) => {
  if (!still) {
    return null;
  }

  return (
    <AbsoluteFill style={{overflow: "hidden", ...style}}>
      <Img
        src={srcForStill(still.imagePath)}
        style={{
          width: "100%",
          height: "100%",
          objectFit: still.fit ?? "cover",
          objectPosition: still.objectPosition ?? "center",
          opacity: still.opacity ?? 1,
          ...imageStyle,
        }}
      />
    </AbsoluteFill>
  );
};