3v324v23's picture
fix: exclude client-only files, add missing packages, fix import paths
585c2d4
/**
* Remotion Root - Entry point for Render Server
*
* Uses SSRComposition from the copied player folder.
*/
import React from "react";
import { Composition } from "remotion";
import { SSRComposition } from "../src/player/ssr-composition";
// Default design types
interface IDesign {
id?: string;
size?: { width: number; height: number };
fps?: number;
trackItemIds?: string[];
trackItemsMap?: Record<string, unknown>;
tracks?: unknown[];
transitionIds?: string[];
transitionsMap?: Record<string, unknown>;
duration?: number;
background?: string | { value: string };
}
interface ITrackItem {
display?: { from: number; to: number };
}
// Default empty design
const defaultDesign: IDesign = {
id: "default",
size: { width: 1920, height: 1080 },
fps: 30,
trackItemIds: [],
trackItemsMap: {},
tracks: [],
transitionIds: [],
transitionsMap: {},
duration: 5000,
};
// Calculate actual duration from track items
const calculateDesignDuration = (design: IDesign): number => {
const trackItems = Object.values(design.trackItemsMap || {}) as ITrackItem[];
if (trackItems.length === 0) {
return design.duration || 5000;
}
const maxEndTime = Math.max(
...trackItems.map(item => item.display?.to || 0)
);
return maxEndTime || design.duration || 5000;
};
export const RemotionRoot: React.FC = () => {
return (
<>
<Composition
id="VEditor"
// eslint-disable-next-line @typescript-eslint/no-explicit-any
component={SSRComposition as React.ComponentType<any>}
durationInFrames={150}
fps={30}
width={1920}
height={1080}
defaultProps={{
design: defaultDesign,
}}
calculateMetadata={async ({ props }) => {
const design = (props as { design: IDesign }).design;
const fps = design.fps || 30;
const durationMs = calculateDesignDuration(design);
const durationInFrames = Math.max(1, Math.ceil((durationMs / 1000) * fps));
console.log('[Remotion] Metadata:', {
durationMs,
durationInFrames,
fps,
width: design.size?.width || 1920,
height: design.size?.height || 1080,
});
return {
durationInFrames,
fps,
width: design.size?.width || 1920,
height: design.size?.height || 1080,
};
}}
/>
</>
);
};