diff --git a/client/src/lib/settings.ts b/client/src/lib/settings.ts new file mode 100644 index 0000000..2387cf4 --- /dev/null +++ b/client/src/lib/settings.ts @@ -0,0 +1,58 @@ +import { + serverUrl, quality, clips, spread, shortSide, portraitRatio, + format, hwEncode, profile, subprofiles +} from "./stores"; +import { setServer } from "./api"; +import { get } from "svelte/store"; + +const KEY = "8cut-settings"; + +interface Settings { + serverUrl: string; + quality: string; + clips: number; + spread: number; + shortSide: number | null; + portraitRatio: string | null; + format: string; + hwEncode: boolean; + profile: string; + subprofiles: string[]; +} + +export function saveSettings() { + const data: Settings = { + serverUrl: get(serverUrl), + quality: get(quality), + clips: get(clips), + spread: get(spread), + shortSide: get(shortSide), + portraitRatio: get(portraitRatio), + format: get(format), + hwEncode: get(hwEncode), + profile: get(profile), + subprofiles: get(subprofiles), + }; + localStorage.setItem(KEY, JSON.stringify(data)); +} + +export function loadSettings() { + const raw = localStorage.getItem(KEY); + if (!raw) return; + try { + const data: Settings = JSON.parse(raw); + if (data.serverUrl) { + serverUrl.set(data.serverUrl); + setServer(data.serverUrl); + } + if (data.quality) quality.set(data.quality); + if (data.clips) clips.set(data.clips); + if (data.spread) spread.set(data.spread); + if (data.shortSide !== undefined) shortSide.set(data.shortSide); + if (data.portraitRatio !== undefined) portraitRatio.set(data.portraitRatio); + if (data.format) format.set(data.format); + if (data.hwEncode !== undefined) hwEncode.set(data.hwEncode); + if (data.profile) profile.set(data.profile); + if (data.subprofiles) subprofiles.set(data.subprofiles); + } catch { /* ignore corrupt settings */ } +} diff --git a/client/src/routes/+page.svelte b/client/src/routes/+page.svelte index ebe1c6b..f10280b 100644 --- a/client/src/routes/+page.svelte +++ b/client/src/routes/+page.svelte @@ -7,6 +7,7 @@ import { mpvStart, mpvLoad, mpvSeek, mpvPause, mpvResume, mpvSetLoop, mpvClearLoop, mpvTimePos, mpvDuration } from "$lib/mpv"; import { streamUrl, audioUrl, deleteExport, getMarkers } from "$lib/api"; import { connectExportWs } from "$lib/ws"; + import { loadSettings, saveSettings } from "$lib/settings"; import { currentFile, cursor, duration, playPos, playing, quality, clips, spread, locked, markers, profile, clipSpan, subprofiles @@ -16,6 +17,8 @@ let exportPanelRef: ExportPanel; onMount(async () => { + loadSettings(); + await mpvStart(); connectExportWs(); @@ -27,6 +30,16 @@ } catch { /* mpv not ready */ } } }, 50); + + // Auto-save settings on changes + const unsubs = [ + quality.subscribe(() => saveSettings()), + clips.subscribe(() => saveSettings()), + spread.subscribe(() => saveSettings()), + profile.subscribe(() => saveSettings()), + subprofiles.subscribe(() => saveSettings()), + ]; + return () => unsubs.forEach(u => u()); }); onDestroy(() => {