@ -69,7 +69,7 @@ import {
} from './util' ;
import { formatDuration } from './util/duration' ;
import { adjustRate } from './util/rate-calculator' ;
import { askForOutDir , askForInputDir , askForImportChapters , createNumSegments as createNumSegmentsDialog , createFixedDurationSegments as createFixedDurationSegmentsDialog , createRandomSegments as createRandomSegmentsDialog , promptTimeOffset , askForHtml5ifySpeed , askForFileOpenAction , confirmExtractAllStreamsDialog , showCleanupFilesDialog , showDiskFull , show Cu tFailedDialog, labelSegmentDialog , openYouTubeChaptersDialog , openAbout , showEditableJsonDialog , askForShiftSegments , selectSegmentsByLabelDialog , confirmExtractFramesAsImages , showRefuseToOverwrite , showParametersDialog , openDirToast , openCutFinishedToast } from './dialogs' ;
import { askForOutDir , askForInputDir , askForImportChapters , createNumSegments as createNumSegmentsDialog , createFixedDurationSegments as createFixedDurationSegmentsDialog , createRandomSegments as createRandomSegmentsDialog , promptTimeOffset , askForHtml5ifySpeed , askForFileOpenAction , confirmExtractAllStreamsDialog , showCleanupFilesDialog , showDiskFull , show Expor tFailedDialog, labelSegmentDialog , openYouTubeChaptersDialog , openAbout , showEditableJsonDialog , askForShiftSegments , selectSegmentsByLabelDialog , confirmExtractFramesAsImages , showRefuseToOverwrite , showParametersDialog , openDirToast , openCutFinishedToast } from './dialogs' ;
import { openSendReportDialog } from './reporting' ;
import { fallbackLng } from './i18n' ;
import { createSegment , getCleanCutSegments , getSegApparentStart , getSegApparentEnd as getSegApparentEnd2 , findSegmentsAtCursor , sortSegments , invertSegments , getSegmentTags , convertSegmentsToChapters , hasAnySegmentOverlap , combineOverlappingSegments as combineOverlappingSegments2 , isDurationValid } from './segments' ;
@ -1178,8 +1178,6 @@ const App = memo(() => {
const selectOnlyCurrentSegment = useCallback ( ( ) => selectOnlySegment ( currentCutSeg ) , [ currentCutSeg , selectOnlySegment ] ) ;
const toggleCurrentSegmentSelected = useCallback ( ( ) => toggleSegmentSelected ( currentCutSeg ) , [ currentCutSeg , toggleSegmentSelected ] ) ;
const filenamifyOrNot = useCallback ( ( name ) => ( safeOutputFileName ? filenamify ( name ) : name ) . substr ( 0 , maxLabelLength ) , [ safeOutputFileName , maxLabelLength ] ) ;
const onLabelSegment = useCallback ( async ( index ) => {
const { name } = cutSegments [ index ] ;
const value = await labelSegmentDialog ( { currentName : name , maxLength : maxLabelLength } ) ;
@ -1205,13 +1203,15 @@ const App = memo(() => {
const areWeCutting = useMemo ( ( ) => segmentsToExport . some ( ( { start , end } ) => isCuttingStart ( start ) || isCuttingEnd ( end , duration ) ) , [ duration , segmentsToExport ] ) ;
const generateOutSegFileNames = useCallback ( ( { segments = segmentsToExport , template } ) => (
const generateOutSegFileNames = useCallback ( ( { segments = segmentsToExport , template , forceSafeOutputFileName } ) => (
segments . map ( ( segment , i ) => {
const { start , end , name = '' } = segment ;
const cutFromStr = formatDuration ( { seconds : start , fileNameFriendly : true } ) ;
const cutToStr = formatDuration ( { seconds : end , fileNameFriendly : true } ) ;
const segNum = i + 1 ;
const filenamifyOrNot = ( fileName ) => ( safeOutputFileName || forceSafeOutputFileName ? filenamify ( fileName ) : fileName ) . substr ( 0 , maxLabelLength ) ;
/ / 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 / 5 8 3
let segSuffix = '' ;
if ( name ) segSuffix = ` - ${ filenamifyOrNot ( name ) } ` ;
@ -1228,7 +1228,7 @@ const App = memo(() => {
const generated = generateSegFileName ( { template , segSuffix , inputFileNameWithoutExt : fileNameWithoutExt , ext , segNum , segLabel : nameSanitized , cutFrom : cutFromStr , cutTo : cutToStr , tags : tagsSanitized } ) ;
return safeOutputFileName ? generated . substring ( 0 , 200 ) : generated ; / / I f s a n i t a t i o n i s e n a b l e d , m a k e s u r e f i l e n a m e i s n o t t o o l o n g
} )
) , [ segmentsToExport , filenamifyOrNot, isCustomFormatSelected, fileFormat , filePath , safeOutputFileName ] ) ;
) , [ segmentsToExport , isCustomFormatSelected, fileFormat , filePath , safeOutputFileName , maxLabelLength ] ) ;
const getOutSegError = useCallback ( ( fileNames ) => getOutSegErrorRaw ( { fileNames , filePath , outputDir } ) , [ outputDir , filePath ] ) ;
@ -1250,10 +1250,10 @@ const App = memo(() => {
openSendReportDialog ( err , state ) ;
} , [ filePath , fileFormat , externalFilesMeta , mainStreams , copyStreamIdsByFile , cutSegments , mainFileFormatData , rotation , shortestFlag , effectiveExportMode , outSegTemplate ] ) ;
const handle Cu tFailed = useCallback ( async ( err ) => {
const sendErrorReport = await show Cu tFailedDialog( { detectedFileFormat } ) ;
const handle Expor tFailed = useCallback ( async ( err ) => {
const sendErrorReport = await show Expor tFailedDialog( { detectedFileFormat , safeOutputFileName } ) ;
if ( sendErrorReport ) openSendReportDialogWithState ( err ) ;
} , [ openSendReportDialogWithState, detectedFileFormat ] ) ;
} , [ detectedFileFormat, safeOutputFileName , openSendReportDialogWithState] ) ;
const closeExportConfirm = useCallback ( ( ) => setExportConfirmVisible ( false ) , [ ] ) ;
@ -1287,8 +1287,8 @@ const App = memo(() => {
let outSegFileNames = generateOutSegFileNames ( { segments : segmentsToExport , template : outSegTemplateOrDefault } ) ;
if ( getOutSegError ( outSegFileNames ) != null ) {
console . error ( 'Output segments file name invalid, using default instead' , outSegFileNames ) ;
outSegFileNames = generateOutSegFileNames ( { segments : segmentsToExport , template : defaultOutSegTemplate } ) ;
console . warn ( 'Output segments file name invalid, using default instead' , outSegFileNames ) ;
outSegFileNames = generateOutSegFileNames ( { segments : segmentsToExport , template : defaultOutSegTemplate , forceSafeOutputFileName : true } ) ;
}
/ / t h r o w ( ( ) = > { c o n s t e r r = n e w E r r o r ( ' t e s t ' ) ; e r r . c o d e = ' E N O E N T ' ; r e t u r n e r r ; } ) ( ) ;
@ -1377,7 +1377,7 @@ const App = memo(() => {
showDiskFull ( ) ;
return ;
}
handle Cu tFailed( err ) ;
handle Expor tFailed( err ) ;
return ;
}
@ -1386,7 +1386,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 , enableSmartCut , enableOverwriteOutput , willMerge , mainFileFormatData , mainStreams , exportExtraStreams , hideAllNotifications , selectedSegmentsOrInverse , segmentsToChapters , invertCutSegments , autoConcatCutSegments , isCustomFormatSelected , autoDeleteMergedSegments , filePath , nonCopiedExtraStreams , handle Cu tFailed] ) ;
} , [ 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 , enableSmartCut , enableOverwriteOutput , willMerge , mainFileFormatData , mainStreams , exportExtraStreams , hideAllNotifications , selectedSegmentsOrInverse , segmentsToChapters , invertCutSegments , autoConcatCutSegments , isCustomFormatSelected , autoDeleteMergedSegments , filePath , nonCopiedExtraStreams , handle Expor tFailed] ) ;
const onExportPress = useCallback ( async ( ) => {
if ( ! filePath || workingRef . current || segmentsToExport . length < 1 ) return ;