@ -57,7 +57,7 @@ import {
getDuration , getTimecodeFromStreams , createChaptersFromSegments , extractSubtitleTrack ,
RefuseOverwriteError , readFrames , mapTimesToSegments , abortFfmpegs ,
} from './ffmpeg' ;
import { shouldCopyStreamByDefault , getAudioStreams , getRealVideoStreams , isAudioDefinitelyNotSupported , willPlayerProperlyHandleVideo , doesPlayerSupportHevcPlayback } from './util/streams' ;
import { shouldCopyStreamByDefault , getAudioStreams , getRealVideoStreams , isAudioDefinitelyNotSupported , willPlayerProperlyHandleVideo , doesPlayerSupportHevcPlayback , isStreamThumbnail } from './util/streams' ;
import { exportEdlFile , readEdlFile , saveLlcProject , loadLlcProject , askForEdlImport } from './edlStore' ;
import { formatYouTube , getFrameCountRaw } from './edlFormats' ;
import {
@ -804,13 +804,14 @@ const App = memo(() => {
}
} , [ setWorking , subtitleStreams , subtitlesByStreamId , filePath ] ) ;
const mainCopiedStreams = useMemo ( ( ) => mainStreams . filter ( ( stream ) => isCopyingStreamId ( filePath , stream . index ) ) , [ filePath , isCopyingStreamId , mainStreams ] ) ;
const mainCopiedThumbnailStreams = useMemo ( ( ) => mainCopiedStreams . filter ( isStreamThumbnail ) , [ mainCopiedStreams ] ) ;
/ / S t r e a m s t h a t a r e n o t c o p y e n a b l e d b y d e f a u l t
const extraStreams = useMemo ( ( ) => mainStreams
. filter ( ( stream ) => ! shouldCopyStreamByDefault ( stream ) ) , [ mainStreams ] ) ;
const extraStreams = useMemo ( ( ) => mainStreams . filter ( ( stream ) => ! shouldCopyStreamByDefault ( stream ) ) , [ mainStreams ] ) ;
/ / E x t r a s t r e a m s t h a t t h e u s e r h a s n o t s e l e c t e d f o r c o p y
const nonCopiedExtraStreams = useMemo ( ( ) => extraStreams
. filter ( ( stream ) => ! isCopyingStreamId ( filePath , stream . index ) ) , [ extraStreams , filePath , isCopyingStreamId ] ) ;
const nonCopiedExtraStreams = useMemo ( ( ) => extraStreams . filter ( ( stream ) => ! isCopyingStreamId ( filePath , stream . index ) ) , [ extraStreams , filePath , isCopyingStreamId ] ) ;
const exportExtraStreams = autoExportExtraStreams && nonCopiedExtraStreams . length > 0 ;
@ -819,14 +820,15 @@ const App = memo(() => {
streamIds : Object . keys ( streamIdsMap ) . filter ( index => streamIdsMap [ index ] ) . map ( ( streamIdStr ) => parseInt ( streamIdStr , 10 ) ) ,
} ) ) , [ copyStreamIdsByFile ] ) ;
const numStreamsToCopy = copyFileStream s
. reduce ( ( acc , { streamIds } ) => acc + streamIds . length , 0 ) ;
/ / t o t a l n u m b e r o f s t r e a m s t o c o p y f o r A L L f i l e s
const numStreamsToCopy = copyFileStreams . reduce ( ( acc , { streamIds } ) => acc + streamIds . length , 0 ) ;
const allFilesMeta = useMemo ( ( ) => ( {
... externalFilesMeta ,
[ filePath ] : mainFileMeta ,
} ) , [ externalFilesMeta , filePath , mainFileMeta ] ) ;
/ / t o t a l n u m b e r o f s t r e a m s f o r A L L f i l e s
const numStreamsTotal = flatMap ( Object . values ( allFilesMeta ) , ( { streams } ) => streams ) . length ;
const toggleStripAudio = useCallback ( ( ) => {
@ -1818,11 +1820,9 @@ const App = memo(() => {
if ( workingRef . current ) return ;
try {
const enabledStreams = mainStreams . filter ( ( stream ) => isCopyingStreamId ( filePath , stream . index ) ) ;
setWorking ( i18n . t ( 'Extracting all streams' ) ) ;
setStreamsSelectorShown ( false ) ;
const extractedPaths = await extractStreams ( { customOutDir , filePath , streams : enabl edStreams, enableOverwriteOutput } ) ;
const extractedPaths = await extractStreams ( { customOutDir , filePath , streams : mainCopi edStreams, enableOverwriteOutput } ) ;
if ( ! hideAllNotifications ) openDirToast ( { icon : 'success' , filePath : extractedPaths [ 0 ] , text : i18n . t ( 'All streams have been extracted as separate files' ) } ) ;
} catch ( err ) {
if ( err instanceof RefuseOverwriteError ) {
@ -1834,7 +1834,7 @@ const App = memo(() => {
} finally {
setWorking ( ) ;
}
} , [ customOutDir , enableOverwriteOutput , filePath , hideAllNotifications , isCopyingStreamId, main Streams, setWorking ] ) ;
} , [ customOutDir , enableOverwriteOutput , filePath , hideAllNotifications , mainCopied Streams, setWorking ] ) ;
const detectSegments = useCallback ( async ( { name , workingText , errorText , fn } ) => {
if ( ! filePath ) return ;
@ -2702,7 +2702,7 @@ const App = memo(() => {
) }
< / SideSheet >
< ExportConfirm filePath = { filePath } areWeCutting = { areWeCutting } nonFilteredSegments = { nonFilteredSegments } 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 } / >
< ExportConfirm filePath = { filePath } areWeCutting = { areWeCutting } nonFilteredSegments = { nonFilteredSegments } 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 } / >
< LastCommandsSheet
visible = { lastCommandsVisible }