From 981a7115418a5ab0613751a211aa716f39329e78 Mon Sep 17 00:00:00 2001 From: Mikael Finstad Date: Sat, 30 Dec 2023 12:47:44 +0800 Subject: [PATCH] implement "copy thumbnails" action closes #1628 --- src/App.jsx | 16 +++++++++++----- src/components/KeyboardShortcuts.jsx | 4 ++++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index f301a47..555b769 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -575,7 +575,8 @@ const App = memo(() => { const mainFileFormatData = useMemo(() => mainFileMeta.formatData, [mainFileMeta.formatData]); const mainFileChapters = useMemo(() => mainFileMeta.chapters, [mainFileMeta.chapters]); - const copyAnyAudioTrack = useMemo(() => mainStreams.some(stream => isCopyingStreamId(filePath, stream.index) && stream.codec_type === 'audio'), [filePath, isCopyingStreamId, mainStreams]); + const checkCopyingAnyTrackOfType = useCallback((filter) => mainStreams.some(stream => isCopyingStreamId(filePath, stream.index) && filter(stream)), [filePath, isCopyingStreamId, mainStreams]); + const copyAnyAudioTrack = useMemo(() => checkCopyingAnyTrackOfType((stream) => stream.codec_type === 'audio'), [checkCopyingAnyTrackOfType]); const subtitleStreams = useMemo(() => mainStreams.filter((stream) => stream.codec_type === 'subtitle'), [mainStreams]); const activeSubtitle = useMemo(() => subtitlesByStreamId[activeSubtitleStreamIndex], [activeSubtitleStreamIndex, subtitlesByStreamId]); @@ -630,15 +631,19 @@ const App = memo(() => { // total number of streams for ALL files const numStreamsTotal = flatMap(Object.values(allFilesMeta), ({ streams }) => streams).length; - const toggleStripAudio = useCallback(() => { + const toggleStripStream = useCallback((filter) => { + const copyingAnyTrackOfType = checkCopyingAnyTrackOfType(filter); setCopyStreamIdsForPath(filePath, (old) => { const newCopyStreamIds = { ...old }; mainStreams.forEach((stream) => { - if (stream.codec_type === 'audio') newCopyStreamIds[stream.index] = !copyAnyAudioTrack; + if (filter(stream)) newCopyStreamIds[stream.index] = !copyingAnyTrackOfType; }); return newCopyStreamIds; }); - }, [copyAnyAudioTrack, filePath, mainStreams, setCopyStreamIdsForPath]); + }, [checkCopyingAnyTrackOfType, filePath, mainStreams, setCopyStreamIdsForPath]); + + const toggleStripAudio = useCallback(() => toggleStripStream((stream) => stream.codec_type === 'audio'), [toggleStripStream]); + const toggleStripThumbnail = useCallback(() => toggleStripStream(isStreamThumbnail), [toggleStripStream]); const thumnailsRef = useRef([]); const thumnailsRenderingPromiseRef = useRef(); @@ -2043,6 +2048,7 @@ const App = memo(() => { toggleKeyframeCutMode: () => toggleKeyframeCut(true), toggleCaptureFormat, toggleStripAudio, + toggleStripThumbnail, setStartTimeOffset: askStartTimeOffset, deselectAllSegments, selectAllSegments, @@ -2076,7 +2082,7 @@ const App = memo(() => { showIncludeExternalStreamsDialog, toggleFullscreenVideo, }; - }, [addSegment, alignSegmentTimesToKeyframes, apparentCutSegments, askStartTimeOffset, batchFileJump, batchOpenSelectedFile, captureSnapshot, captureSnapshotAsCoverArt, changePlaybackRate, checkFileOpened, cleanupFilesDialog, clearSegments, closeBatch, closeFileWithConfirm, combineOverlappingSegments, combineSelectedSegments, concatBatch, convertFormatBatch, copySegmentsToClipboard, createFixedDurationSegments, createNumSegments, createRandomSegments, createSegmentsFromKeyframes, currentSegIndexSafe, cutSegmentsHistory, deselectAllSegments, detectBlackScenes, detectSceneChanges, detectSilentScenes, duplicateCurrentSegment, editCurrentSegmentTags, extractAllStreams, extractCurrentSegmentFramesAsImages, extractSelectedSegmentsFramesAsImages, fillSegmentsGaps, goToTimecode, handleShowStreamsSelectorClick, increaseRotation, invertAllSegments, invertSelectedSegments, jumpCutEnd, jumpCutStart, jumpSeg, jumpTimelineEnd, jumpTimelineStart, keyboardNormalSeekSpeed, keyboardSeekAccFactor, onExportPress, onLabelSegment, openFilesDialog, openSendReportDialogWithState, pause, play, removeCutSegment, removeSelectedSegments, reorderSegsByStartTime, seekClosestKeyframe, seekRel, seekRelPercent, selectAllSegments, selectOnlyCurrentSegment, setCutEnd, setCutStart, setPlaybackVolume, shiftAllSegmentTimes, shortStep, showIncludeExternalStreamsDialog, shuffleSegments, splitCurrentSegment, timelineToggleComfortZoom, toggleCaptureFormat, toggleCurrentSegmentSelected, toggleFullscreenVideo, toggleKeyboardShortcuts, toggleKeyframeCut, toggleLastCommands, toggleLoopSelectedSegments, togglePlay, toggleSegmentsList, toggleSettings, toggleShowKeyframes, toggleShowThumbnails, toggleStreamsSelector, toggleStripAudio, toggleWaveformMode, tryFixInvalidDuration, userHtml5ifyCurrentFile, zoomRel]); + }, [addSegment, alignSegmentTimesToKeyframes, apparentCutSegments, askStartTimeOffset, batchFileJump, batchOpenSelectedFile, captureSnapshot, captureSnapshotAsCoverArt, changePlaybackRate, checkFileOpened, cleanupFilesDialog, clearSegments, closeBatch, closeFileWithConfirm, combineOverlappingSegments, combineSelectedSegments, concatBatch, convertFormatBatch, copySegmentsToClipboard, createFixedDurationSegments, createNumSegments, createRandomSegments, createSegmentsFromKeyframes, currentSegIndexSafe, cutSegmentsHistory, deselectAllSegments, detectBlackScenes, detectSceneChanges, detectSilentScenes, duplicateCurrentSegment, editCurrentSegmentTags, extractAllStreams, extractCurrentSegmentFramesAsImages, extractSelectedSegmentsFramesAsImages, fillSegmentsGaps, goToTimecode, handleShowStreamsSelectorClick, increaseRotation, invertAllSegments, invertSelectedSegments, jumpCutEnd, jumpCutStart, jumpSeg, jumpTimelineEnd, jumpTimelineStart, keyboardNormalSeekSpeed, keyboardSeekAccFactor, onExportPress, onLabelSegment, openFilesDialog, openSendReportDialogWithState, pause, play, removeCutSegment, removeSelectedSegments, reorderSegsByStartTime, seekClosestKeyframe, seekRel, seekRelPercent, selectAllSegments, selectOnlyCurrentSegment, setCutEnd, setCutStart, setPlaybackVolume, shiftAllSegmentTimes, shortStep, showIncludeExternalStreamsDialog, shuffleSegments, splitCurrentSegment, timelineToggleComfortZoom, toggleCaptureFormat, toggleCurrentSegmentSelected, toggleFullscreenVideo, toggleKeyboardShortcuts, toggleKeyframeCut, toggleLastCommands, toggleLoopSelectedSegments, togglePlay, toggleSegmentsList, toggleSettings, toggleShowKeyframes, toggleShowThumbnails, toggleStreamsSelector, toggleStripAudio, toggleStripThumbnail, toggleWaveformMode, tryFixInvalidDuration, userHtml5ifyCurrentFile, zoomRel]); const getKeyboardAction = useCallback((action) => mainActions[action], [mainActions]); diff --git a/src/components/KeyboardShortcuts.jsx b/src/components/KeyboardShortcuts.jsx index 07029c1..09076eb 100644 --- a/src/components/KeyboardShortcuts.jsx +++ b/src/components/KeyboardShortcuts.jsx @@ -513,6 +513,10 @@ const KeyboardShortcuts = memo(({ name: t('Keep or discard audio tracks'), category: otherCategory, }, + toggleStripThumbnail: { + name: t('Keep or discard thumbnail tracks'), + category: otherCategory, + }, increaseRotation: { name: t('Change rotation'), category: otherCategory,