@ -187,10 +187,6 @@ const App = memo(() => {
ffmpegSetCustomFfPath ( customFfPath ) ;
} , [ customFfPath ] ) ;
const {
concatFiles , html5ifyDummy , cutMultiple , autoConcatCutSegments , html5ify , fixInvalidDuration ,
} = useFfmpegOperations ( { filePath , enableTransferTimestamps } ) ;
const outSegTemplateOrDefault = outSegTemplate || defaultOutSegTemplate ;
useEffect ( ( ) => {
@ -348,8 +344,8 @@ const App = memo(() => {
} , [ isFileOpened ] ) ;
const {
cutSegments , cutSegmentsHistory , createSegmentsFromKeyframes , shuffleSegments , detectBlackScenes , detectSilentScenes , detectSceneChanges , removeCutSegment , invertAllSegments , fillSegmentsGaps , combineOverlappingSegments , shiftAllSegmentTimes , alignSegmentTimesToKeyframes , onViewSegmentTags , updateSegOrder , updateSegOrders , reorderSegsByStartTime , addSegment , setCutStart , setCutEnd , onLabelSegment , splitCurrentSegment , createNumSegments , createFixedDurationSegments , createRandomSegments , apparentCutSegments , haveInvalidSegs , currentSegIndexSafe , currentCutSeg , currentApparentCutSeg , inverseCutSegments , clearSegments , loadCutSegments , isSegmentSelected , setCutTime , getSegApparentEnd, setCurrentSegIndex, onLabelSelectedSegments , deselectAllSegments , selectAllSegments , selectOnlyCurrentSegment , toggleCurrentSegmentSelected , removeSelectedSegments , setDeselectedSegmentIds , onSelectSegmentsByLabel , toggleSegmentSelected , selectOnlySegment , getApparentCutSegmentById , selectedSegments , selectedSegmentsOrInverse , nonFilteredSegmentsOrInverse ,
} = useSegments ( { filePath , workingRef , setWorking , setCutProgress , mainVideoStream , duration , getRelevantTime , maxLabelLength , checkFileOpened , invertCutSegments } ) ;
cutSegments , cutSegmentsHistory , createSegmentsFromKeyframes , shuffleSegments , detectBlackScenes , detectSilentScenes , detectSceneChanges , removeCutSegment , invertAllSegments , fillSegmentsGaps , combineOverlappingSegments , shiftAllSegmentTimes , alignSegmentTimesToKeyframes , onViewSegmentTags , updateSegOrder , updateSegOrders , reorderSegsByStartTime , addSegment , setCutStart , setCutEnd , onLabelSegment , splitCurrentSegment , createNumSegments , createFixedDurationSegments , createRandomSegments , apparentCutSegments , haveInvalidSegs , currentSegIndexSafe , currentCutSeg , currentApparentCutSeg , inverseCutSegments , clearSegments , loadCutSegments , isSegmentSelected , setCutTime , setCurrentSegIndex, onLabelSelectedSegments , deselectAllSegments , selectAllSegments , selectOnlyCurrentSegment , toggleCurrentSegmentSelected , removeSelectedSegments , setDeselectedSegmentIds , onSelectSegmentsByLabel , toggleSegmentSelected , selectOnlySegment , getApparentCutSegmentById , selectedSegments , selectedSegmentsOrInverse , nonFilteredSegmentsOrInverse , segmentsToExport ,
} = useSegments ( { filePath , workingRef , setWorking , setCutProgress , mainVideoStream , duration , getRelevantTime , maxLabelLength , checkFileOpened , invertCutSegments , segmentsToChaptersOnly } ) ;
const jumpSegStart = useCallback ( ( index ) => userSeekAbs ( apparentCutSegments [ index ] . start ) , [ apparentCutSegments , userSeekAbs ] ) ;
const jumpSegEnd = useCallback ( ( index ) => userSeekAbs ( apparentCutSegments [ index ] . end ) , [ apparentCutSegments , userSeekAbs ] ) ;
@ -679,6 +675,13 @@ const App = memo(() => {
if ( ! hideAllNotifications ) toast . fire ( { icon : 'info' , text : i18n . t ( 'Loaded existing preview file: {{ fileName }}' , { fileName } ) } ) ;
} , [ hideAllNotifications ] ) ;
const areWeCutting = useMemo ( ( ) => segmentsToExport . some ( ( { start , end } ) => isCuttingStart ( start ) || isCuttingEnd ( end , duration ) ) , [ duration , segmentsToExport ] ) ;
const needSmartCut = ! ! ( areWeCutting && enableSmartCut ) ;
const {
concatFiles , html5ifyDummy , cutMultiple , autoConcatCutSegments , html5ify , fixInvalidDuration ,
} = useFfmpegOperations ( { filePath , enableTransferTimestamps , needSmartCut } ) ;
const html5ifyAndLoad = useCallback ( async ( cod , fp , speed , hv , ha ) => {
const usesDummyVideo = [ 'fastest-audio' , 'fastest-audio-remux' , 'fastest' ] . includes ( speed ) ;
console . log ( 'html5ifyAndLoad' , { speed , hasVideo : hv , hasAudio : ha , usesDummyVideo } ) ;
@ -1024,15 +1027,6 @@ const App = memo(() => {
}
} , [ isFileOpened , cleanupChoices , askForCleanupChoices , cleanupFiles , setWorking ] ) ;
const segmentsToExport = useMemo ( ( ) => {
if ( ! segmentsToChaptersOnly ) return selectedSegmentsOrInverse ;
/ / s e g m e n t s T o C h a p t e r s O n l y i s a s p e c i a l m o d e w h e r e a l l s e g m e n t s w i l l b e s i m p l y w r i t t e n o u t a s c h a p t e r s t o o n e f i l e : h t t p s : / / g i t h u b . c o m / m i f i / l o s s l e s s - c u t / i s s u e s / 9 9 3 # i s s u e c o m m e n t - 1 0 3 7 9 2 7 5 9 5
/ / C h a p t e r s e x p o r t m o d e : E m u l a t e a s i n g l e s e g m e n t w i t h n o c u t s ( f u l l t i m e l i n e )
return [ { start : 0 , end : getSegApparentEnd ( { } ) } ] ;
} , [ selectedSegmentsOrInverse , getSegApparentEnd , segmentsToChaptersOnly ] ) ;
const areWeCutting = useMemo ( ( ) => segmentsToExport . some ( ( { start , end } ) => isCuttingStart ( start ) || isCuttingEnd ( end , duration ) ) , [ duration , segmentsToExport ] ) ;
const generateOutSegFileNames = useCallback ( ( { segments = segmentsToExport , template , forceSafeOutputFileName } ) => (
segments . map ( ( segment , i ) => {
const { start , end , name = '' } = segment ;
@ -1124,7 +1118,6 @@ const App = memo(() => {
dispositionByStreamId ,
chapters : chaptersToAdd ,
detectedFps ,
enableSmartCut ,
enableOverwriteOutput ,
} ) ;
@ -1207,7 +1200,7 @@ const App = memo(() => {
setWorking ( ) ;
setCutProgress ( ) ;
}
} , [ numStreamsToCopy , setWorking , segmentsToChaptersOnly , outSegTemplateOrDefault , generateOutSegFileNames , segmentsToExport , getOutSegError , cutMultiple , outputDir , customOutDir , fileFormat , duration , isRotationSet , effectiveRotation , copyFileStreams , allFilesMeta , keyframeCut , shortestFlag , ffmpegExperimental , preserveMovData , preserveMetadataOnMerge , movFastStart , avoidNegativeTs , customTagsByFile , customTagsByStreamId , dispositionByStreamId , detectedFps , enable SmartCut, enable OverwriteOutput, willMerge , exportConfirmEnabled , mainFileFormatData , mainStreams , exportExtraStreams , areWeCutting , hideAllNotifications , cleanupChoices , cleanupFiles , selectedSegmentsOrInverse , segmentsToChapters , invertCutSegments , autoConcatCutSegments , isCustomFormatSelected , autoDeleteMergedSegments , nonCopiedExtraStreams , filePath , handleExportFailed ] ) ;
} , [ numStreamsToCopy , setWorking , segmentsToChaptersOnly , outSegTemplateOrDefault , generateOutSegFileNames , segmentsToExport , getOutSegError , cutMultiple , outputDir , customOutDir , fileFormat , duration , isRotationSet , effectiveRotation , copyFileStreams , allFilesMeta , keyframeCut , shortestFlag , ffmpegExperimental , preserveMovData , preserveMetadataOnMerge , movFastStart , avoidNegativeTs , customTagsByFile , customTagsByStreamId , dispositionByStreamId , detectedFps , enable OverwriteOutput, willMerge , exportConfirmEnabled , mainFileFormatData , mainStreams , exportExtraStreams , areWeCutting , hideAllNotifications , cleanupChoices , cleanupFiles , selectedSegmentsOrInverse , segmentsToChapters , invertCutSegments , autoConcatCutSegments , isCustomFormatSelected , autoDeleteMergedSegments , nonCopiedExtraStreams , filePath , handleExportFailed ] ) ;
const onExportPress = useCallback ( async ( ) => {
if ( ! filePath || workingRef . current || segmentsToExport . length < 1 ) return ;
@ -2394,7 +2387,7 @@ const App = memo(() => {
) }
< / SideSheet >
< ExportConfirm filePath = { filePath } areWeCutting = { areWeCutting } nonFilteredSegmentsOrInverse = { nonFilteredSegmentsOrInverse } selectedSegments = { selectedSegmentsOrInverse } segmentsToExport = { segmentsToExport } willMerge = { willMerge } visible = { exportConfirmVisible } onClosePress = { closeExportConfirm } onExportConfirm = { onExportConfirm } renderOutFmt = { renderOutFmt } outputDir = { outputDir } numStreamsTotal = { numStreamsTotal } numStreamsToCopy = { numStreamsToCopy } setStreamsSelectorShown = { setStreamsSelectorShown } outFormat = { fileFormat } setOutSegTemplate = { setOutSegTemplate } outSegTemplate = { outSegTemplateOrDefault } generateOutSegFileNames = { generateOutSegFileNames } currentSegIndexSafe = { currentSegIndexSafe } getOutSegError = { getOutSegError } mainCopiedThumbnailStreams = { mainCopiedThumbnailStreams } / >
< ExportConfirm filePath = { filePath } areWeCutting = { areWeCutting } nonFilteredSegmentsOrInverse = { nonFilteredSegmentsOrInverse } selectedSegments = { selectedSegmentsOrInverse } segmentsToExport = { segmentsToExport } willMerge = { willMerge } visible = { exportConfirmVisible } onClosePress = { closeExportConfirm } onExportConfirm = { onExportConfirm } renderOutFmt = { renderOutFmt } outputDir = { outputDir } numStreamsTotal = { numStreamsTotal } numStreamsToCopy = { numStreamsToCopy } setStreamsSelectorShown = { setStreamsSelectorShown } outFormat = { fileFormat } setOutSegTemplate = { setOutSegTemplate } outSegTemplate = { outSegTemplateOrDefault } generateOutSegFileNames = { generateOutSegFileNames } currentSegIndexSafe = { currentSegIndexSafe } getOutSegError = { getOutSegError } mainCopiedThumbnailStreams = { mainCopiedThumbnailStreams } needSmartCut = { needSmartCut } / >
< LastCommandsSheet
visible = { lastCommandsVisible }