@ -59,7 +59,7 @@ import {
readFileFfprobeMeta , getDefaultOutFormat ,
setCustomFfPath as ffmpegSetCustomFfPath ,
isIphoneHevc , isProblematicAvc1 , tryMapChaptersToEdl ,
getTimecodeFromStreams , createChaptersFromSegments ,
getTimecodeFromStreams , createChaptersFromSegments , createChaptersFromOriginalFiles ,
RefuseOverwriteError , extractSubtitleTrackToSegments ,
mapRecommendedDefaultFormat ,
getFfCommandLine ,
@ -180,7 +180,7 @@ function App() {
const [ selectedBatchFiles , setSelectedBatchFiles ] = useState < string [ ] > ( [ ] ) ;
const allUserSettings = useUserSettingsRoot ( ) ;
const { captureFormat , customOutDir , keyframeCut , preserveMetadata , preserveMetadataOnMerge , preserveMovData, preserveChapters , movFastStart , avoidNegativeTs , autoMerge , timecodeFormat , invertCutSegments , autoExportExtraStreams , askBeforeClose , enableImportChapters , enableAskForFileOpenAction , playbackVolume , autoSaveProjectFile , wheelSensitivity , waveformHeight , invertTimelineScroll , language , ffmpegExperimental , hideNotifications , hideOsNotifications , autoLoadTimecode , autoDeleteMergedSegments , exportConfirmEnabled , segmentsToChapters , simpleMode , cutFileTemplate , cutMergedFileTemplate , mergedFileTemplate , keyboardSeekAccFactor , keyboardNormalSeekSpeed , keyboardSeekSpeed2 , keyboardSeekSpeed3 , treatInputFileModifiedTimeAsStart , treatOutputFileModifiedTimeAsStart , outFormatLocked , safeOutputFileName , enableAutoHtml5ify , segmentsToChaptersOnly , keyBindings , enableSmartCut , customFfPath , storeProjectInWorkingDir , enableOverwriteOutput , mouseWheelZoomModifierKey , mouseWheelFrameSeekModifierKey , mouseWheelKeyframeSeekModifierKey , captureFrameMethod , captureFrameQuality , captureFrameFileNameFormat , enableNativeHevc , cleanupChoices , darkMode , preferStrongColors , outputFileNameMinZeroPadding , cutFromAdjustmentFrames , cutToAdjustmentFrames , waveformMode : waveformModePreference , thumbnailsEnabled , keyframesEnabled , reducedMotion } = allUserSettings . settings ;
const { captureFormat , customOutDir , keyframeCut , preserveMetadata , preserveMetadataOnMerge , keepOriginalChaptersOnMerge, preserveMovData, preserveChapters , movFastStart , avoidNegativeTs , autoMerge , timecodeFormat , invertCutSegments , autoExportExtraStreams , askBeforeClose , enableImportChapters , enableAskForFileOpenAction , playbackVolume , autoSaveProjectFile , wheelSensitivity , waveformHeight , invertTimelineScroll , language , ffmpegExperimental , hideNotifications , hideOsNotifications , autoLoadTimecode , autoDeleteMergedSegments , exportConfirmEnabled , segmentsToChapters , simpleMode , cutFileTemplate , cutMergedFileTemplate , mergedFileTemplate , keyboardSeekAccFactor , keyboardNormalSeekSpeed , keyboardSeekSpeed2 , keyboardSeekSpeed3 , treatInputFileModifiedTimeAsStart , treatOutputFileModifiedTimeAsStart , outFormatLocked , safeOutputFileName , enableAutoHtml5ify , segmentsToChaptersOnly , keyBindings , enableSmartCut , customFfPath , storeProjectInWorkingDir , enableOverwriteOutput , mouseWheelZoomModifierKey , mouseWheelFrameSeekModifierKey , mouseWheelKeyframeSeekModifierKey , captureFrameMethod , captureFrameQuality , captureFrameFileNameFormat , enableNativeHevc , cleanupChoices , darkMode , preferStrongColors , outputFileNameMinZeroPadding , cutFromAdjustmentFrames , cutToAdjustmentFrames , waveformMode : waveformModePreference , thumbnailsEnabled , keyframesEnabled , reducedMotion } = allUserSettings . settings ;
const { setCaptureFormat , setCustomOutDir , setKeyframeCut , setPlaybackVolume , setExportConfirmEnabled , setSimpleMode , setOutFormatLocked , setSafeOutputFileName , setKeyBindings , resetKeyBindings , setStoreProjectInWorkingDir , setCleanupChoices , toggleDarkMode , setWaveformMode , setThumbnailsEnabled , setKeyframesEnabled , prefersReducedMotion } = allUserSettings ;
const [ showAdvancedSettings , setShowAdvancedSettings ] = useState ( ! simpleMode ) ;
@ -914,7 +914,9 @@ function App() {
const outPath = getOutPath ( { customOutDir , filePath : firstPath , fileName } ) ;
let chaptersFromSegments : Awaited < ReturnType < typeof createChaptersFromSegments > > ;
if ( segmentsToChapters ) {
if ( keepOriginalChaptersOnMerge ) {
chaptersFromSegments = await createChaptersFromOriginalFiles ( { paths , createChapterForFilesWithoutChapters : segmentsToChapters } ) ;
} else if ( segmentsToChapters ) {
const chapterNames = paths . map ( ( path ) = > parsePath ( path ) . name ) ;
chaptersFromSegments = await createChaptersFromSegments ( { segmentPaths : paths , chapterNames } ) ;
}
@ -971,7 +973,7 @@ function App() {
setWorking ( undefined ) ;
setProgress ( undefined ) ;
}
} , [ workingRef , ensureWritableOutDir , customOutDir , setWorking , segmentsToChapters , concatFiles, ffmpegExperimental , preserveMovData , movFastStart , preserveMetadataOnMerge , closeBatch , enableOverwriteOutput , hideAllNotifications , t , showOsNotification , openConcatFinishedDialog , handleConcatFailed ] ) ;
} , [ workingRef , ensureWritableOutDir , customOutDir , setWorking , segmentsToChapters , keepOriginalChaptersOnMerge, concatFiles, ffmpegExperimental , preserveMovData , movFastStart , preserveMetadataOnMerge , closeBatch , enableOverwriteOutput , hideAllNotifications , t , showOsNotification , openConcatFinishedDialog , handleConcatFailed ] ) ;
const cleanupFiles = useCallback ( async ( cleanupChoices2 : CleanupChoicesType ) = > {
// Store paths before we reset state