add new setting for importing chapters to segments

when opening a new file: 'always' | 'never' | 'ask'
#2699
pull/2734/head
Mikael Finstad 5 months ago
parent 260129f694
commit 260129be71
No known key found for this signature in database
GPG Key ID: 25AB36E3E81CBC26

@ -19,6 +19,8 @@ export type PreserveMetadata = 'default' | 'nonglobal' | 'none'
export type WaveformMode = 'big-waveform' | 'waveform';
export type EnableImportChapters = 'always' | 'never' | 'ask'
export interface Config {
version: number,
lastAppVersion: string,
@ -34,7 +36,7 @@ export interface Config {
autoExportExtraStreams: boolean,
exportConfirmEnabled: boolean,
askBeforeClose: boolean,
enableAskForImportChapters: boolean,
enableImportChapters: EnableImportChapters,
enableAskForFileOpenAction: boolean,
playbackVolume: number,
autoSaveProjectFile: boolean,

@ -110,7 +110,7 @@ const defaults: Config = {
autoExportExtraStreams: true,
exportConfirmEnabled: true,
askBeforeClose: false,
enableAskForImportChapters: true,
enableImportChapters: 'ask',
enableAskForFileOpenAction: true,
playbackVolume: 0.3, // so that we don't shock new users with loud volume
autoSaveProjectFile: true,

@ -179,7 +179,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, enableAskForImportChapters, 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, 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);
@ -1369,7 +1369,7 @@ function App() {
// OK, we didn't find a project file, instead maybe try to create project (segments) from chapters
const edl = tryMapChaptersToEdl(chapters);
if (edl.length > 0 && enableAskForImportChapters && (await askForImportChapters())) {
if (edl.length > 0 && (enableImportChapters === 'always' || (enableImportChapters === 'ask' && (await askForImportChapters())))) {
console.log('Convert chapters to segments', edl);
loadCutSegments({ segments: edl, append: false });
}
@ -1497,7 +1497,7 @@ function App() {
resetState();
throw err;
}
}, [storeProjectInWorkingDir, setWorking, loadEdlFile, getEdlFilePath, enableAskForImportChapters, ensureAccessToSourceDir, loadCutSegments, autoLoadTimecode, enableNativeHevc, ensureWritableOutDir, customOutDir, resetState, clearSegColorCounter, setCopyStreamIdsForPath, setDetectedFileFormat, outFormatLocked, setUsingDummyVideo, setPreviewFilePath, html5ifyAndLoadWithPreferences, setFileFormat, showNotification, showPreviewFileLoadedMessage, showNotNativelySupportedMessage]);
}, [storeProjectInWorkingDir, setWorking, loadEdlFile, getEdlFilePath, enableImportChapters, ensureAccessToSourceDir, loadCutSegments, autoLoadTimecode, enableNativeHevc, ensureWritableOutDir, customOutDir, resetState, clearSegColorCounter, setCopyStreamIdsForPath, setDetectedFileFormat, outFormatLocked, setUsingDummyVideo, setPreviewFilePath, html5ifyAndLoadWithPreferences, setFileFormat, showNotification, showPreviewFileLoadedMessage, showNotNativelySupportedMessage]);
const toggleLastCommands = useCallback(() => setLastCommandsVisible((val) => !val), []);
const toggleSettings = useCallback(() => setSettingsVisible((val) => !val), []);

@ -10,10 +10,10 @@ import AutoExportToggler from './AutoExportToggler';
import Switch from './Switch';
import useUserSettings from '../hooks/useUserSettings';
import { askForFfPath } from '../dialogs';
import { isMasBuild, isStoreBuild } from '../util';
import { getEnableImportChaptersOptions, isMasBuild, isStoreBuild } from '../util';
import type { SupportedLanguage } from '../../../common/i18n';
import { langNames } from '../../../common/i18n';
import type { Config, ModifierKey, TimecodeFormat } from '../../../common/types.js';
import type { Config, EnableImportChapters, ModifierKey, TimecodeFormat } from '../../../common/types.js';
import styles from './Settings.module.css';
import type { SelectProps } from './Select';
import SelectRaw from './Select';
@ -76,7 +76,7 @@ function Settings({
}) {
const { t } = useTranslation();
const { customOutDir, changeOutDir, keyframeCut, toggleKeyframeCut, timecodeFormat, setTimecodeFormat, invertCutSegments, setInvertCutSegments, askBeforeClose, setAskBeforeClose, enableAskForImportChapters, setEnableAskForImportChapters, enableAskForFileOpenAction, setEnableAskForFileOpenAction, autoSaveProjectFile, setAutoSaveProjectFile, invertTimelineScroll, setInvertTimelineScroll, language, setLanguage, hideNotifications, setHideNotifications, hideOsNotifications, setHideOsNotifications, autoLoadTimecode, setAutoLoadTimecode, enableAutoHtml5ify, setEnableAutoHtml5ify, customFfPath, setCustomFfPath, storeProjectInWorkingDir, mouseWheelZoomModifierKey, setMouseWheelZoomModifierKey, mouseWheelFrameSeekModifierKey, setMouseWheelFrameSeekModifierKey, mouseWheelKeyframeSeekModifierKey, setMouseWheelKeyframeSeekModifierKey, segmentMouseModifierKey, setSegmentMouseModifierKey, captureFrameMethod, setCaptureFrameMethod, captureFrameQuality, setCaptureFrameQuality, captureFrameFileNameFormat, setCaptureFrameFileNameFormat, enableNativeHevc, setEnableNativeHevc, enableUpdateCheck, setEnableUpdateCheck, allowMultipleInstances, setAllowMultipleInstances, preferStrongColors, setPreferStrongColors, treatInputFileModifiedTimeAsStart, setTreatInputFileModifiedTimeAsStart, treatOutputFileModifiedTimeAsStart, setTreatOutputFileModifiedTimeAsStart, exportConfirmEnabled, toggleExportConfirmEnabled, storeWindowBounds, setStoreWindowBounds, reducedMotion, setReducedMotion } = useUserSettings();
const { customOutDir, changeOutDir, keyframeCut, toggleKeyframeCut, timecodeFormat, setTimecodeFormat, invertCutSegments, setInvertCutSegments, askBeforeClose, setAskBeforeClose, enableImportChapters, setEnableImportChapters, enableAskForFileOpenAction, setEnableAskForFileOpenAction, autoSaveProjectFile, setAutoSaveProjectFile, invertTimelineScroll, setInvertTimelineScroll, language, setLanguage, hideNotifications, setHideNotifications, hideOsNotifications, setHideOsNotifications, autoLoadTimecode, setAutoLoadTimecode, enableAutoHtml5ify, setEnableAutoHtml5ify, customFfPath, setCustomFfPath, storeProjectInWorkingDir, mouseWheelZoomModifierKey, setMouseWheelZoomModifierKey, mouseWheelFrameSeekModifierKey, setMouseWheelFrameSeekModifierKey, mouseWheelKeyframeSeekModifierKey, setMouseWheelKeyframeSeekModifierKey, segmentMouseModifierKey, setSegmentMouseModifierKey, captureFrameMethod, setCaptureFrameMethod, captureFrameQuality, setCaptureFrameQuality, captureFrameFileNameFormat, setCaptureFrameFileNameFormat, enableNativeHevc, setEnableNativeHevc, enableUpdateCheck, setEnableUpdateCheck, allowMultipleInstances, setAllowMultipleInstances, preferStrongColors, setPreferStrongColors, treatInputFileModifiedTimeAsStart, setTreatInputFileModifiedTimeAsStart, treatOutputFileModifiedTimeAsStart, setTreatOutputFileModifiedTimeAsStart, exportConfirmEnabled, toggleExportConfirmEnabled, storeWindowBounds, setStoreWindowBounds, reducedMotion, setReducedMotion } = useUserSettings();
const onLangChange = useCallback<ChangeEventHandler<HTMLSelectElement>>((e) => {
const { value } = e.target;
@ -546,10 +546,12 @@ function Settings({
{showAdvancedSettings && (
<Row>
<KeyCell>{t('Ask about importing chapters from opened file?')}</KeyCell>
<td>
<Switch checked={enableAskForImportChapters} onCheckedChange={setEnableAskForImportChapters} />
</td>
<KeyCell>{t('Import chapters to segments when opening file')}</KeyCell>
<Select value={enableImportChapters} onChange={(e) => setEnableImportChapters(e.target.value as EnableImportChapters)}>
{Object.entries(getEnableImportChaptersOptions() satisfies Record<EnableImportChapters, string>).map(([key, name]) => (
<option key={key} value={key}>{name}</option>
))}
</Select>
</Row>
)}
</tbody>

@ -80,8 +80,8 @@ export default function useUserSettingsRoot() {
useEffect(() => safeSetConfig({ autoExportExtraStreams }), [autoExportExtraStreams]);
const [askBeforeClose, setAskBeforeClose] = useState(safeGetConfigInitial('askBeforeClose'));
useEffect(() => safeSetConfig({ askBeforeClose }), [askBeforeClose]);
const [enableAskForImportChapters, setEnableAskForImportChapters] = useState(safeGetConfigInitial('enableAskForImportChapters'));
useEffect(() => safeSetConfig({ enableAskForImportChapters }), [enableAskForImportChapters]);
const [enableImportChapters, setEnableImportChapters] = useState(safeGetConfigInitial('enableImportChapters'));
useEffect(() => safeSetConfig({ enableImportChapters }), [enableImportChapters]);
const [enableAskForFileOpenAction, setEnableAskForFileOpenAction] = useState(safeGetConfigInitial('enableAskForFileOpenAction'));
useEffect(() => safeSetConfig({ enableAskForFileOpenAction }), [enableAskForFileOpenAction]);
const [playbackVolume, setPlaybackVolume] = useState(safeGetConfigInitial('playbackVolume'));
@ -238,7 +238,7 @@ export default function useUserSettingsRoot() {
invertCutSegments,
autoExportExtraStreams,
askBeforeClose,
enableAskForImportChapters,
enableImportChapters,
enableAskForFileOpenAction,
playbackVolume,
autoSaveProjectFile,
@ -313,7 +313,7 @@ export default function useUserSettingsRoot() {
setInvertCutSegments,
setAutoExportExtraStreams,
setAskBeforeClose,
setEnableAskForImportChapters,
setEnableImportChapters,
setEnableAskForFileOpenAction,
setPlaybackVolume,
setAutoSaveProjectFile,

@ -10,7 +10,7 @@ import invariant from 'tiny-invariant';
import { ffmpegExtractWindow } from './util/constants';
import { appName } from '../../main/common';
import type { Html5ifyMode } from '../../common/types';
import type { EnableImportChapters, Html5ifyMode } from '../../common/types';
import { UserFacingError } from '../errors';
import type { FFprobeFormat } from '../../common/ffprobe';
@ -420,6 +420,12 @@ export function getMetaKeyName() {
return i18n.t('Meta');
}
export const getEnableImportChaptersOptions = (): Record<EnableImportChapters, string> => ({
always: i18n.t('Always'),
ask: i18n.t('Ask'),
never: i18n.t('Never'),
} as const);
export const dialogButtonOrder = isWindows ? 'rtl' : 'ltr'; // use ltr for mac and linux, rtl for windows
export function shootConfetti(options?: confetti.Options) {

Loading…
Cancel
Save