78 lines
2.3 KiB
TypeScript
78 lines
2.3 KiB
TypeScript
import { create } from 'zustand'
|
|
import { SplitOptions, ContainerInfo, CodecInfo } from '../types'
|
|
import {
|
|
DEFAULT_FORMAT,
|
|
DEFAULT_OUTPUT_TEMPLATE,
|
|
DEFAULT_REPLACEMENT_CHAR,
|
|
DEFAULT_BAD_CHARS,
|
|
DEFAULT_ALBUM,
|
|
DEFAULT_COMMENT,
|
|
DEFAULT_NO_COMMENT,
|
|
DEFAULT_COMMENT_STREAM,
|
|
DEFAULT_MERGE_COMMENTS,
|
|
DEFAULT_COMMENT_SEPARATOR,
|
|
DEFAULT_DROP_VIDEO,
|
|
DEFAULT_DROP_SUBS,
|
|
DEFAULT_NUMBER_TRACKS,
|
|
DEFAULT_REPLACE_BAD_CHARS,
|
|
DEFAULT_SKIP_EXISTING,
|
|
DEFAULT_TRACKLIST_FORMAT,
|
|
} from '../constants/generated'
|
|
|
|
// We use DEFAULT_FORMAT only as a fallback; container default is null (auto-detect)
|
|
const DEFAULT_OPTIONS: SplitOptions = {
|
|
container: null,
|
|
audio_codec: 'copy',
|
|
video_codec: 'copy',
|
|
subtitle_codec: 'copy',
|
|
video_quality: null,
|
|
drop_video: DEFAULT_DROP_VIDEO,
|
|
drop_subs: DEFAULT_DROP_SUBS,
|
|
number_tracks: DEFAULT_NUMBER_TRACKS,
|
|
replace_bad_chars: DEFAULT_REPLACE_BAD_CHARS,
|
|
replacement_char: DEFAULT_REPLACEMENT_CHAR,
|
|
bad_chars: DEFAULT_BAD_CHARS,
|
|
skip_existing: DEFAULT_SKIP_EXISTING,
|
|
output_template: DEFAULT_OUTPUT_TEMPLATE,
|
|
album: DEFAULT_ALBUM ?? '',
|
|
comment: DEFAULT_COMMENT ?? '',
|
|
no_comment: DEFAULT_NO_COMMENT,
|
|
comment_stream: DEFAULT_COMMENT_STREAM,
|
|
merge_comments: DEFAULT_MERGE_COMMENTS,
|
|
comment_separator: DEFAULT_COMMENT_SEPARATOR,
|
|
tracklist_format: DEFAULT_TRACKLIST_FORMAT,
|
|
}
|
|
|
|
interface OptionsState {
|
|
options: SplitOptions
|
|
containers: ContainerInfo[]
|
|
codecs: CodecInfo[]
|
|
compatibility: Record<string, { audio: string[] | null; video: string[] | null }>
|
|
setOptions: (newOptions: Partial<SplitOptions>) => void
|
|
setContainers: (containers: ContainerInfo[]) => void
|
|
setCodecs: (codecs: CodecInfo[]) => void
|
|
setCompatibility: (compat: Record<string, { audio: string[] | null; video: string[] | null }>) => void
|
|
reset: () => void
|
|
}
|
|
|
|
export const useOptionsStore = create<OptionsState>((set) => ({
|
|
options: { ...DEFAULT_OPTIONS },
|
|
containers: [],
|
|
codecs: [],
|
|
compatibility: {},
|
|
setOptions: (newOptions) =>
|
|
set((state) => ({
|
|
options: { ...state.options, ...newOptions },
|
|
})),
|
|
setContainers: (containers) => set({ containers }),
|
|
setCodecs: (codecs) => set({ codecs }),
|
|
setCompatibility: (compatibility) => set({ compatibility }),
|
|
reset: () =>
|
|
set({
|
|
options: { ...DEFAULT_OPTIONS },
|
|
containers: [],
|
|
codecs: [],
|
|
compatibility: {},
|
|
}),
|
|
}))
|