import { useEffect, useState } from 'react'; import { Divider, Stack } from '@mantine/core'; import isElectron from 'is-electron'; import { FileInput, Textarea, Text, Select, NumberInput, Switch } from '/@/renderer/components'; import { SettingsSection, SettingOption, } from '/@/renderer/features/settings/components/settings-section'; import { SettingsState, usePlaybackSettings, useSettingsStoreActions, } from '/@/renderer/store/settings.store'; import { PlaybackType } from '/@/renderer/types'; const localSettings = isElectron() ? window.electron.localSettings : null; const mpvPlayer = isElectron() ? window.electron.mpvPlayer : null; export const getMpvSetting = ( key: keyof SettingsState['playback']['mpvProperties'], value: any, ) => { switch (key) { case 'audioExclusiveMode': return { 'audio-exclusive': value || 'no' }; case 'audioSampleRateHz': return { 'audio-samplerate': value }; case 'gaplessAudio': return { 'gapless-audio': value || 'weak' }; case 'replayGainMode': return { replaygain: value || 'no' }; case 'replayGainClip': return { 'replaygain-clip': value || 'no' }; case 'replayGainFallbackDB': return { 'replaygain-fallback': value }; case 'replayGainPreampDB': return { 'replaygain-preamp': value || 0 }; default: return { 'audio-format': value }; } }; export const getMpvProperties = (settings: SettingsState['playback']['mpvProperties']) => { const properties: Record = { 'audio-exclusive': settings.audioExclusiveMode || 'no', 'audio-samplerate': settings.audioSampleRateHz === 0 ? undefined : settings.audioSampleRateHz, 'gapless-audio': settings.gaplessAudio || 'weak', replaygain: settings.replayGainMode || 'no', 'replaygain-clip': settings.replayGainClip || 'no', 'replaygain-fallback': settings.replayGainFallbackDB, 'replaygain-preamp': settings.replayGainPreampDB || 0, }; Object.keys(properties).forEach((key) => properties[key] === undefined ? delete properties[key] : {}, ); return properties; }; export const MpvSettings = () => { const settings = usePlaybackSettings(); const { setSettings } = useSettingsStoreActions(); const [mpvPath, setMpvPath] = useState(''); const handleSetMpvPath = (e: File) => { localSettings?.set('mpv_path', e.path); }; useEffect(() => { const getMpvPath = async () => { if (!localSettings) return setMpvPath(''); const mpvPath = (await localSettings.get('mpv_path')) as string; return setMpvPath(mpvPath); }; getMpvPath(); }, []); const handleSetMpvProperty = ( setting: keyof SettingsState['playback']['mpvProperties'], value: any, ) => { setSettings({ playback: { ...settings, mpvProperties: { ...settings.mpvProperties, [setting]: value, }, }, }); const mpvSetting = getMpvSetting(setting, value); mpvPlayer?.setProperties(mpvSetting); }; const handleSetExtraParameters = (data: string[]) => { setSettings({ playback: { ...settings, mpvExtraParameters: data, }, }); }; const options: SettingOption[] = [ { control: ( ), description: 'The location of your mpv executable', isHidden: settings.type !== PlaybackType.LOCAL, note: 'Restart required', title: 'MPV executable path', }, { control: (