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]);
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[])) => {
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
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const map = (newSegments: StateSegment[]) => newSegments.map(({ start, end, initial: _ignored, ...rest }) => ({
...rest,
start: clampValue(start) ?? 0,
end: clampValue(end),
})).filter((segment) => segment.end == null || segment.end > segment.start);
const map = (newSegments: StateSegment[]) => newSegments.flatMap(({ start, end, initial: _ignored, ...rest }) => {
const startClamped = clampValue(start) ?? 0;
const endClamped = clampValue(end);
// 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') {
setCutSegments((existing) => map(newSegmentsOrFn(existing)));
@ -103,7 +116,7 @@ function useSegments({ filePath, workingRef, setWorking, setProgress, videoStrea
}
setCutSegments(map(newSegmentsOrFn));
}, [clampValue, setCutSegments]);
}, [fileDuration, setCutSegments]);
const clearSegments = useCallback(() => {
clearSegColorCounter();
@ -117,20 +130,15 @@ function useSegments({ filePath, workingRef, setWorking, setProgress, videoStrea
// todo combine with safeSetCutSegments?
const loadCutSegments = useCallback((edl: SegmentBase[], append: boolean, getCurrentSegIndex?: (newEdl: SegmentBase[]) => number) => {
const validEdl = edl.filter((row) => (
row.start >= 0
&& (row.end == null || row.start < row.end)
));
if (validEdl.length === 0) throw new Error(i18n.t('No valid segments found'));
if (edl.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();
safeSetCutSegments((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 (getCurrentSegIndex) setCurrentSegIndex(getCurrentSegIndex(newSegments));
return newSegments;

Loading…
Cancel
Save