@ -1701,11 +1701,13 @@ function App() {
text : i18n.t ( 'Instead of video apparently starting at 0, you can offset by a specified value. This only applies to the preview inside LosslessCut and does not modify the file in any way. (Useful for viewing/cutting videos according to timecodes)' ) ,
inputPlaceholder : timecodePlaceholder ,
parseTimecode ,
allowRelative : true ,
} ) ;
if ( newStartTimeOffset === undefined || newStartTimeOffset . duration < 0 ) return ;
setStartTimeOffset ( newStartTimeOffset . duration ) ;
const duration = newStartTimeOffset . relDirection != null ? newStartTimeOffset . duration * newStartTimeOffset.relDirection : newStartTimeOffset.duration ;
setStartTimeOffset ( duration ) ;
} , [ formatTimecode , parseTimecode , startTimeOffset , timecodePlaceholder ] ) ;
const toggleKeyboardShortcuts = useCallback ( ( ) = > setKeyboardShortcutsVisible ( ( v ) = > ! v ) , [ ] ) ;
@ -2122,6 +2124,7 @@ function App() {
shiftAllSegmentTimes ,
increaseVolume : ( ) = > setPlaybackVolume ( ( val ) = > Math . min ( 1 , val + 0.07 ) ) ,
decreaseVolume : ( ) = > setPlaybackVolume ( ( val ) = > Math . max ( 0 , val - 0.07 ) ) ,
makeCursorTimeZero : ( ) = > setStartTimeOffset ( - commandedTimeRef . current ) ,
toggleMuted ,
copySegmentsToClipboard ,
reloadFile : ( ) = > setCacheBuster ( ( v ) = > v + 1 ) ,
@ -2154,7 +2157,7 @@ function App() {
} ;
return ret ;
} , [ toggleLoopSelectedSegments , pause , timelineToggleComfortZoom , captureSnapshot , captureSnapshotAsCoverArt , setCutStart , setCutEnd , cleanupFilesDialog , splitCurrentSegment , focusSegmentAtCursor , selectSegmentsAtCursor , increaseRotation , goToTimecode , jumpCutStart , jumpCutEnd , jumpTimelineStart , jumpTimelineEnd , batchOpenSelectedFile , closeBatch , addSegment , duplicateCurrentSegment , onExportPress , extractCurrentSegmentFramesAsImages , extractSelectedSegmentsFramesAsImages , reorderSegsByStartTime , invertAllSegments , fillSegmentsGaps , combineOverlappingSegments , combineSelectedSegments , createFixedDurationSegments , createNumSegments , createFixedByteSizedSegments , createRandomSegments , alignSegmentTimesToKeyframes , shuffleSegments , clearSegments , toggleSegmentsList , toggleStreamsSelector , extractAllStreams , convertFormatBatch , concatBatch , toggleCaptureFormat , toggleStripAudio , toggleStripVideo , toggleStripSubtitle , toggleStripThumbnail , toggleStripAll , toggleDarkMode , askStartTimeOffset , deselectAllSegments , selectAllSegments , selectOnlyCurrentSegment , editCurrentSegmentTags , toggleCurrentSegmentSelected , invertSelectedSegments , removeSelectedSegments , tryFixInvalidDuration , shiftAllSegmentTimes , toggleMuted , copySegmentsToClipboard , handleShowStreamsSelectorClick , openFilesDialog , openDirDialog , toggleSettings , readAllKeyframes , createSegmentsFromKeyframes , toggleWaveformMode , toggleShowThumbnails , toggleShowKeyframes , showIncludeExternalStreamsDialog , toggleFullscreenVideo , selectAllMarkers , checkFileOpened , cutSegments , seekRel , keyboardSeekAccFactor , togglePlay , play , userChangePlaybackRate , keyboardNormalSeekSpeed , keyboardSeekSpeed2 , keyboardSeekSpeed3 , seekRelPercent , seekClosestKeyframe , shortStep , jumpSeg , zoomRel , batchFileJump , removeSegment , currentSegIndexSafe , cutSegmentsHistory , labelSegment , toggleLastCommands , userHtml5ifyCurrentFile , toggleKeyframeCut , applyEnabledStreamsFilter , setPlaybackVolume , c loseFileWithConfirm, openSendReportDialogWithState , detectBlackScenes , detectSilentScenes , detectSceneChanges ] ) ;
} , [ toggleLoopSelectedSegments , pause , timelineToggleComfortZoom , captureSnapshot , captureSnapshotAsCoverArt , setCutStart , setCutEnd , cleanupFilesDialog , splitCurrentSegment , focusSegmentAtCursor , selectSegmentsAtCursor , increaseRotation , goToTimecode , jumpCutStart , jumpCutEnd , jumpTimelineStart , jumpTimelineEnd , batchOpenSelectedFile , closeBatch , addSegment , duplicateCurrentSegment , onExportPress , extractCurrentSegmentFramesAsImages , extractSelectedSegmentsFramesAsImages , reorderSegsByStartTime , invertAllSegments , fillSegmentsGaps , combineOverlappingSegments , combineSelectedSegments , createFixedDurationSegments , createNumSegments , createFixedByteSizedSegments , createRandomSegments , alignSegmentTimesToKeyframes , shuffleSegments , clearSegments , toggleSegmentsList , toggleStreamsSelector , extractAllStreams , convertFormatBatch , concatBatch , toggleCaptureFormat , toggleStripAudio , toggleStripVideo , toggleStripSubtitle , toggleStripThumbnail , toggleStripAll , toggleDarkMode , askStartTimeOffset , deselectAllSegments , selectAllSegments , selectOnlyCurrentSegment , editCurrentSegmentTags , toggleCurrentSegmentSelected , invertSelectedSegments , removeSelectedSegments , tryFixInvalidDuration , shiftAllSegmentTimes , toggleMuted , copySegmentsToClipboard , handleShowStreamsSelectorClick , openFilesDialog , openDirDialog , toggleSettings , readAllKeyframes , createSegmentsFromKeyframes , toggleWaveformMode , toggleShowThumbnails , toggleShowKeyframes , showIncludeExternalStreamsDialog , toggleFullscreenVideo , selectAllMarkers , checkFileOpened , cutSegments , seekRel , keyboardSeekAccFactor , togglePlay , play , userChangePlaybackRate , keyboardNormalSeekSpeed , keyboardSeekSpeed2 , keyboardSeekSpeed3 , seekRelPercent , seekClosestKeyframe , shortStep , jumpSeg , zoomRel , batchFileJump , removeSegment , currentSegIndexSafe , cutSegmentsHistory , labelSegment , toggleLastCommands , userHtml5ifyCurrentFile , toggleKeyframeCut , applyEnabledStreamsFilter , setPlaybackVolume , c ommandedTimeRef, c loseFileWithConfirm, openSendReportDialogWithState , detectBlackScenes , detectSilentScenes , detectSceneChanges ] ) ;
const getKeyboardAction = useCallback ( ( action : MainKeyboardAction ) = > mainActions [ action ] , [ mainActions ] ) ;