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; 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)); }