39 lines
1.2 KiB
TypeScript
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));
|
|
}
|