feat(config): auto-persist Video & Quality settings to config.json across app restarts

This commit is contained in:
m4xx1m committed 2026-11-12 23:32:20 +03:00
1 parent e142ad9326
commit 4b42e1ee11
1 file changed
+27
+27
View File
@@ -420,6 +420,26 @@ function crfQualityHint(crf: number): string {
return tr.crfHintSmall; return tr.crfHintSmall;
} }
let saveCfgTimer = 0;
function persistVideoSettings() {
const api = appApi();
if (!api || !state.appInfo) return;
state.appInfo.config.defaultEncoder = state.encoder;
state.appInfo.config.defaultHwDecode = state.hwDecode;
state.appInfo.config.defaultPreset = state.preset;
state.appInfo.config.defaultCrf = state.crf;
state.appInfo.config.defaultFps = state.fps;
state.appInfo.config.defaultTune = state.tune;
state.appInfo.config.defaultMergeAudio = state.audioMode === 'merge';
window.clearTimeout(saveCfgTimer);
saveCfgTimer = window.setTimeout(() => {
if (state.appInfo) {
void api.SaveConfig(state.appInfo.config);
}
}, 350);
}
function syncControlsFromState() { function syncControlsFromState() {
el<'select'>('encoderSelect').value = state.encoder; el<'select'>('encoderSelect').value = state.encoder;
el<'select'>('hwDecodeSelect').value = state.hwDecode; el<'select'>('hwDecodeSelect').value = state.hwDecode;
@@ -1168,26 +1188,32 @@ function bindEvents() {
el<'select'>('encoderSelect').addEventListener('change', (e) => { el<'select'>('encoderSelect').addEventListener('change', (e) => {
state.encoder = (e.target as HTMLSelectElement).value; state.encoder = (e.target as HTMLSelectElement).value;
syncControlsFromState(); syncControlsFromState();
persistVideoSettings();
}); });
el<'select'>('hwDecodeSelect').addEventListener('change', (e) => { el<'select'>('hwDecodeSelect').addEventListener('change', (e) => {
state.hwDecode = (e.target as HTMLSelectElement).value; state.hwDecode = (e.target as HTMLSelectElement).value;
persistVideoSettings();
void refreshCLI(); void refreshCLI();
}); });
el<'input'>('crfRange').addEventListener('input', (e) => { el<'input'>('crfRange').addEventListener('input', (e) => {
state.crf = Number((e.target as HTMLInputElement).value); state.crf = Number((e.target as HTMLInputElement).value);
el<'span'>('crfLabel').textContent = `${state.crf} · ${crfQualityHint(state.crf)}`; el<'span'>('crfLabel').textContent = `${state.crf} · ${crfQualityHint(state.crf)}`;
persistVideoSettings();
void refreshCLI(); void refreshCLI();
}); });
el<'select'>('presetSelect').addEventListener('change', (e) => { el<'select'>('presetSelect').addEventListener('change', (e) => {
state.preset = (e.target as HTMLSelectElement).value; state.preset = (e.target as HTMLSelectElement).value;
persistVideoSettings();
void refreshCLI(); void refreshCLI();
}); });
el<'select'>('tuneSelect').addEventListener('change', (e) => { el<'select'>('tuneSelect').addEventListener('change', (e) => {
state.tune = (e.target as HTMLSelectElement).value; state.tune = (e.target as HTMLSelectElement).value;
persistVideoSettings();
void refreshCLI(); void refreshCLI();
}); });
el<'select'>('fpsSelect').addEventListener('change', (e) => { el<'select'>('fpsSelect').addEventListener('change', (e) => {
state.fps = Number((e.target as HTMLSelectElement).value); state.fps = Number((e.target as HTMLSelectElement).value);
persistVideoSettings();
void refreshCLI(); void refreshCLI();
}); });
@@ -1206,6 +1232,7 @@ function bindEvents() {
b.addEventListener('click', () => { b.addEventListener('click', () => {
state.audioMode = b.dataset.amode as 'merge' | 'track' | 'mute'; state.audioMode = b.dataset.amode as 'merge' | 'track' | 'mute';
syncControlsFromState(); syncControlsFromState();
persistVideoSettings();
}); });
}); });