don't stop invalid length segments

instead make them into markers (start at 0 and remove end point)

closes #2339
pull/2499/head
Mikael Finstad 4 months ago
parent 250622f955
commit 2506221ed7
No known key found for this signature in database
GPG Key ID: 25AB36E3E81CBC26

@ -81,21 +81,34 @@ function useSegments({ filePath, workingRef, setWorking, setProgress, videoStrea
segColorCounterRef.current = 0; segColorCounterRef.current = 0;
}, [segColorCounterRef]); }, [segColorCounterRef]);
const clampValue = useCallback((val: number | undefined) => {
if (val == null || Number.isNaN(val)) return undefined;
const clamped = Math.max(val, 0);
if (fileDuration == null) return clamped;
return Math.min(clamped, fileDuration);
}, [fileDuration]);
const safeSetCutSegments = useCallback((newSegmentsOrFn: StateSegment[] | ((a: StateSegment[]) => StateSegment[])) => { const safeSetCutSegments = useCallback((newSegmentsOrFn: StateSegment[] | ((a: StateSegment[]) => StateSegment[])) => {
function clampValue(val: number | undefined) {
if (val == null || Number.isNaN(val)) return undefined;
const clamped = Math.max(val, 0);
if (fileDuration == null) return clamped;
return Math.min(clamped, fileDuration);
}
// delete "initial" after modifying segments // delete "initial" after modifying segments
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
const map = (newSegments: StateSegment[]) => newSegments.map(({ start, end, initial: _ignored, ...rest }) => ({ const map = (newSegments: StateSegment[]) => newSegments.flatMap(({ start, end, initial: _ignored, ...rest }) => {
...rest, const startClamped = clampValue(start) ?? 0;
start: clampValue(start) ?? 0, const endClamped = clampValue(end);
end: clampValue(end),
})).filter((segment) => segment.end == null || segment.end > segment.start); // convert 0 length segments into a markers
if (endClamped == null || endClamped <= startClamped) {
return [{
...rest,
start: startClamped,
}];
}
return [{
...rest,
start: startClamped,
end: endClamped,
}];
});
if (typeof newSegmentsOrFn === 'function') { if (typeof newSegmentsOrFn === 'function') {
setCutSegments((existing) => map(newSegmentsOrFn(existing))); setCutSegments((existing) => map(newSegmentsOrFn(existing)));
@ -103,7 +116,7 @@ function useSegments({ filePath, workingRef, setWorking, setProgress, videoStrea
} }
setCutSegments(map(newSegmentsOrFn)); setCutSegments(map(newSegmentsOrFn));
}, [clampValue, setCutSegments]); }, [fileDuration, setCutSegments]);
const clearSegments = useCallback(() => { const clearSegments = useCallback(() => {
clearSegColorCounter(); clearSegColorCounter();
@ -117,20 +130,15 @@ function useSegments({ filePath, workingRef, setWorking, setProgress, videoStrea
// todo combine with safeSetCutSegments? // todo combine with safeSetCutSegments?
const loadCutSegments = useCallback((edl: SegmentBase[], append: boolean, getCurrentSegIndex?: (newEdl: SegmentBase[]) => number) => { const loadCutSegments = useCallback((edl: SegmentBase[], append: boolean, getCurrentSegIndex?: (newEdl: SegmentBase[]) => number) => {
const validEdl = edl.filter((row) => ( if (edl.length === 0) throw new Error(i18n.t('No valid segments found'));
row.start >= 0
&& (row.end == null || row.start < row.end)
));
if (validEdl.length === 0) throw new Error(i18n.t('No valid segments found'));
if (validEdl.length > maxSegmentsAllowed) throw new Error(i18n.t('Tried to create too many segments (max {{maxSegmentsAllowed}}.)', { maxSegmentsAllowed })); if (edl.length > maxSegmentsAllowed) throw new Error(i18n.t('Tried to create too many segments (max {{maxSegmentsAllowed}}.)', { maxSegmentsAllowed }));
if (!append) clearSegColorCounter(); if (!append) clearSegColorCounter();
safeSetCutSegments((existingSegments) => { safeSetCutSegments((existingSegments) => {
const needToAppend = append && !isInitialSegment(existingSegments); const needToAppend = append && !isInitialSegment(existingSegments);
let newSegments = validEdl.map((segment, i) => createIndexedSegment({ segment, incrementCount: needToAppend || i > 0 })); let newSegments = edl.map((segment, i) => createIndexedSegment({ segment, incrementCount: needToAppend || i > 0 }));
if (needToAppend) newSegments = [...existingSegments, ...newSegments]; if (needToAppend) newSegments = [...existingSegments, ...newSegments];
if (getCurrentSegIndex) setCurrentSegIndex(getCurrentSegIndex(newSegments)); if (getCurrentSegIndex) setCurrentSegIndex(getCurrentSegIndex(newSegments));
return newSegments; return newSegments;

Loading…
Cancel
Save