voicemeeter-compact/vmcompact/configurations.py

99 lines
2.7 KiB
Python

import logging
from pathlib import Path
try:
import tomllib
except ModuleNotFoundError:
import tomli as tomllib
logger = logging.getLogger(__name__)
configuration = {}
def get_configpath():
configpaths = [
Path.cwd() / 'configs',
Path.home() / '.config' / 'vm-compact' / 'configs',
Path.home() / 'Documents' / 'Voicemeeter' / 'configs',
]
for configpath in configpaths:
if configpath.exists():
return configpath
if configpath := get_configpath():
filepaths = list(configpath.glob('*.toml'))
if any(f.stem in ('app', 'vban') for f in filepaths):
configs = {}
for filepath in filepaths:
filename = filepath.with_suffix('').stem
if filename in ('app', 'vban'):
try:
with open(filepath, 'rb') as f:
configs[filename] = tomllib.load(f)
logger.info(f'configuration: {filename} loaded into memory')
except tomllib.TOMLDecodeError:
logger.error(f'Invalid TOML config: configs/{filename.stem}')
configuration |= configs
_defaults = {
'configs': {
'config': None,
},
'theme': {
'enabled': True,
'mode': 'light',
},
'extends': {
'extended': True,
'extends_horizontal': True,
},
'channel': {
'width': 80,
'height': 130,
'xpadding': 3,
},
'mwscroll_step': {
'size': 3,
},
'submixes': {
'default': 0,
},
'navigation': {'show': True},
}
if 'app' in configuration:
for key in _defaults:
if key in configuration['app']:
configuration['app'][key] = _defaults[key] | configuration['app'][key]
else:
configuration['app'][key] = _defaults[key]
else:
configuration['app'] = _defaults
def get_configuration(key):
if key in configuration:
return configuration[key]
def loader(kind_id, target):
configs = {'reset': target.configs['reset']}
if configpath := get_configpath():
userconfigpath = configpath / kind_id
if userconfigpath.exists():
filepaths = list(userconfigpath.glob('*.toml'))
for filepath in filepaths:
identifier = filepath.with_suffix('').stem
try:
with open(filepath, 'rb') as f:
configs[identifier] = tomllib.load(f)
logger.info(f'loader: {identifier} loaded into memory')
except tomllib.TOMLDecodeError:
logger.error(f'Invalid TOML config: configs/{filename.stem}')
target.configs = configs
return target.configs