@ -148,7 +148,7 @@ const App = memo(() => {
const isCustomFormatSelected = fileFormat !== detectedFileFormat ;
const {
captureFormat , setCaptureFormat , customOutDir , setCustomOutDir , keyframeCut , setKeyframeCut , preserveMovData , setPreserveMovData , movFastStart , setMovFastStart , avoidNegativeTs , setAvoidNegativeTs , autoMerge , setAutoMerge , timecodeShowFrames , setTimecodeShowFrames , invertCutSegments , setInvertCutSegments , autoExportExtraStreams , setAutoExportExtraStreams , askBeforeClose , setAskBeforeClose , enableAskForImportChapters , setEnableAskForImportChapters , enableAskForFileOpenAction , setEnableAskForFileOpenAction , muted , setMuted , autoSaveProjectFile , setAutoSaveProjectFile , wheelSensitivity , setWheelSensitivity , invertTimelineScroll , setInvertTimelineScroll , language , setLanguage , ffmpegExperimental , setFfmpegExperimental , hideNotifications , setHideNotifications , autoLoadTimecode , setAutoLoadTimecode , autoDeleteMergedSegments , setAutoDeleteMergedSegments , exportConfirmEnabled , setExportConfirmEnabled , segmentsToChapters , setSegmentsToChapters , preserveMetadataOnMerge , setPreserveMetadataOnMerge , simpleMode , setSimpleMode , outSegTemplate , setOutSegTemplate , keyboardSeekAccFactor , setKeyboardSeekAccFactor , keyboardNormalSeekSpeed , setKeyboardNormalSeekSpeed , enableTransferTimestamps , setEnableTransferTimestamps , outFormatLocked , setOutFormatLocked ,
captureFormat , setCaptureFormat , customOutDir , setCustomOutDir , keyframeCut , setKeyframeCut , preserveMovData , setPreserveMovData , movFastStart , setMovFastStart , avoidNegativeTs , setAvoidNegativeTs , autoMerge , setAutoMerge , timecodeShowFrames , setTimecodeShowFrames , invertCutSegments , setInvertCutSegments , autoExportExtraStreams , setAutoExportExtraStreams , askBeforeClose , setAskBeforeClose , enableAskForImportChapters , setEnableAskForImportChapters , enableAskForFileOpenAction , setEnableAskForFileOpenAction , muted , setMuted , autoSaveProjectFile , setAutoSaveProjectFile , wheelSensitivity , setWheelSensitivity , invertTimelineScroll , setInvertTimelineScroll , language , setLanguage , ffmpegExperimental , setFfmpegExperimental , hideNotifications , setHideNotifications , autoLoadTimecode , setAutoLoadTimecode , autoDeleteMergedSegments , setAutoDeleteMergedSegments , exportConfirmEnabled , setExportConfirmEnabled , segmentsToChapters , setSegmentsToChapters , preserveMetadataOnMerge , setPreserveMetadataOnMerge , simpleMode , setSimpleMode , outSegTemplate , setOutSegTemplate , keyboardSeekAccFactor , setKeyboardSeekAccFactor , keyboardNormalSeekSpeed , setKeyboardNormalSeekSpeed , enableTransferTimestamps , setEnableTransferTimestamps , outFormatLocked , setOutFormatLocked , safeOutputFileName , setSafeOutputFileName ,
} = useUserPreferences ( ) ;
const {
@ -231,6 +231,11 @@ const App = memo(() => {
const hideAllNotifications = hideNotifications === 'all' ;
const toggleSafeOutputFileName = useCallback ( ( ) => setSafeOutputFileName ( ( v ) => {
if ( v && ! hideAllNotifications ) toast . fire ( { icon : 'info' , text : i18n . t ( 'Output file name will not be sanitized, and any special characters will be preserved. This may cause the export to fail and can cause other funny issues. Use at your own risk!' ) } ) ;
return ! v ;
} ) , [ setSafeOutputFileName , hideAllNotifications ] ) ;
const toggleMute = useCallback ( ( ) => {
setMuted ( ( v ) => {
if ( ! v && ! hideAllNotifications ) toast . fire ( { icon : 'info' , title : i18n . t ( 'Muted preview (exported file will not be affected)' ) } ) ;
@ -891,6 +896,8 @@ const App = memo(() => {
const onExportSegmentDisableAll = useCallback ( ( ) => setDisabledSegmentIds ( Object . fromEntries ( cutSegments . map ( ( s ) => [ s . segId , true ] ) ) ) , [ cutSegments ] ) ;
const onExportSegmentEnableAll = useCallback ( ( ) => setDisabledSegmentIds ( { } ) , [ ] ) ;
const filenamifyOrNot = useCallback ( ( name ) => ( safeOutputFileName ? filenamify ( name ) : name ) , [ safeOutputFileName ] ) ;
const generateOutSegFileNames = useCallback ( ( { segments = enabledOutSegments , template } ) => (
segments . map ( ( { start , end , name = '' } , i ) => {
const cutFromStr = formatDuration ( { seconds : start , fileNameFriendly : true } ) ;
@ -899,17 +906,17 @@ const App = memo(() => {
/ / 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 = ` - ${ filenamify ( name ) } ` ;
if ( name ) segSuffix = ` - ${ filenamify OrNot ( name ) } ` ;
else if ( segments . length > 1 ) segSuffix = ` -seg ${ segNum } ` ;
const ext = getOutFileExtension ( { isCustomFormatSelected , outFormat : fileFormat , filePath } ) ;
const { name : fileNameWithoutExt } = parsePath ( filePath ) ;
const generated = generateSegFileName ( { template , segSuffix , inputFileNameWithoutExt : fileNameWithoutExt , ext , segNum , segLabel : filenamify ( name ) , cutFrom : cutFromStr , cutTo : cutToStr } ) ;
const generated = generateSegFileName ( { template , segSuffix , inputFileNameWithoutExt : fileNameWithoutExt , ext , segNum , segLabel : filenamify OrNot ( name ) , cutFrom : cutFromStr , cutTo : cutToStr } ) ;
return generated . substr ( 0 , 200 ) ; / / J u s t t o b e s u r e
} )
) , [ fileFormat , filePath , isCustomFormatSelected , enabledOutSegments ]) ;
) , [ fileFormat , filePath , isCustomFormatSelected , enabledOutSegments , filenamifyOrNot ]) ;
/ / T O D O i m p r o v e u s e r f e e d b a c k
const isOutSegFileNamesValid = useCallback ( ( fileNames ) => fileNames . every ( ( fileName ) => {
@ -2293,7 +2300,7 @@ const App = memo(() => {
< / div >
< / motion.div >
< ExportConfirm filePath = { filePath } autoMerge = { autoMerge } setAutoMerge = { setAutoMerge } areWeCutting = { areWeCutting } enabledOutSegments = { enabledOutSegments } visible = { exportConfirmVisible } onClosePress = { closeExportConfirm } onExportConfirm = { onExportConfirm } keyframeCut = { keyframeCut } toggleKeyframeCut = { toggleKeyframeCut } renderOutFmt = { renderOutFmt } preserveMovData = { preserveMovData } togglePreserveMovData = { togglePreserveMovData } movFastStart = { movFastStart } toggleMovFastStart = { toggleMovFastStart } avoidNegativeTs = { avoidNegativeTs } setAvoidNegativeTs = { setAvoidNegativeTs } changeOutDir = { changeOutDir } outputDir = { outputDir } numStreamsTotal = { numStreamsTotal } numStreamsToCopy = { numStreamsToCopy } setStreamsSelectorShown = { setStreamsSelectorShown } exportConfirmEnabled = { exportConfirmEnabled } toggleExportConfirmEnabled = { toggleExportConfirmEnabled } segmentsToChapters = { segmentsToChapters } toggleSegmentsToChapters = { toggleSegmentsToChapters } outFormat = { fileFormat } preserveMetadataOnMerge = { preserveMetadataOnMerge } togglePreserveMetadataOnMerge = { togglePreserveMetadataOnMerge } setOutSegTemplate = { setOutSegTemplate } outSegTemplate = { outSegTemplateOrDefault } generateOutSegFileNames = { generateOutSegFileNames } currentSegIndexSafe = { currentSegIndexSafe } isOutSegFileNamesValid = { isOutSegFileNamesValid } autoDeleteMergedSegments = { autoDeleteMergedSegments } setAutoDeleteMergedSegments = { setAutoDeleteMergedSegments } / >
< ExportConfirm filePath = { filePath } autoMerge = { autoMerge } setAutoMerge = { setAutoMerge } areWeCutting = { areWeCutting } enabledOutSegments = { enabledOutSegments } visible = { exportConfirmVisible } onClosePress = { closeExportConfirm } onExportConfirm = { onExportConfirm } keyframeCut = { keyframeCut } toggleKeyframeCut = { toggleKeyframeCut } renderOutFmt = { renderOutFmt } preserveMovData = { preserveMovData } togglePreserveMovData = { togglePreserveMovData } movFastStart = { movFastStart } toggleMovFastStart = { toggleMovFastStart } avoidNegativeTs = { avoidNegativeTs } setAvoidNegativeTs = { setAvoidNegativeTs } changeOutDir = { changeOutDir } outputDir = { outputDir } numStreamsTotal = { numStreamsTotal } numStreamsToCopy = { numStreamsToCopy } setStreamsSelectorShown = { setStreamsSelectorShown } exportConfirmEnabled = { exportConfirmEnabled } toggleExportConfirmEnabled = { toggleExportConfirmEnabled } segmentsToChapters = { segmentsToChapters } toggleSegmentsToChapters = { toggleSegmentsToChapters } outFormat = { fileFormat } preserveMetadataOnMerge = { preserveMetadataOnMerge } togglePreserveMetadataOnMerge = { togglePreserveMetadataOnMerge } setOutSegTemplate = { setOutSegTemplate } outSegTemplate = { outSegTemplateOrDefault } generateOutSegFileNames = { generateOutSegFileNames } currentSegIndexSafe = { currentSegIndexSafe } isOutSegFileNamesValid = { isOutSegFileNamesValid } autoDeleteMergedSegments = { autoDeleteMergedSegments } setAutoDeleteMergedSegments = { setAutoDeleteMergedSegments } safeOutputFileName = { safeOutputFileName } toggleSafeOutputFileName = { toggleSafeOutputFileName } / >
< HelpSheet
visible = { helpVisible }