ai-chatbot/lib/video-canvas/video-clip.ts

39 lines
1.2 KiB
TypeScript

export type VideoClipRange = {
start: number;
end: number;
};
export const DEFAULT_VIDEO_CLIP_RANGE: VideoClipRange = {
start: 0,
end: 1 / 3,
};
export function normalizeVideoClipRange(value: unknown): VideoClipRange {
if (!value || typeof value !== "object") return DEFAULT_VIDEO_CLIP_RANGE;
const candidate = value as Partial<VideoClipRange>;
const start = Number(candidate.start);
const end = Number(candidate.end);
if (!Number.isFinite(start) || !Number.isFinite(end)) {
return DEFAULT_VIDEO_CLIP_RANGE;
}
const normalizedStart = Math.max(0, Math.min(start, 0.94));
const normalizedEnd = Math.max(
Math.min(normalizedStart + 0.04, 1),
Math.min(end, 1),
);
return {
start: Number(normalizedStart.toFixed(9)),
end: Number(normalizedEnd.toFixed(9)),
};
}
export function snapVideoClipRatio(ratio: number, durationSeconds: number) {
const duration = Math.max(0.1, Number(durationSeconds) || 0.1);
return Math.max(0, Math.min(1, Math.round(ratio * duration) / duration));
}
export function getVideoClipDuration(range: VideoClipRange, durationSeconds: number) {
const normalized = normalizeVideoClipRange(range);
return Math.max(0.05, (normalized.end - normalized.start) * Math.max(0.1, durationSeconds));
}