Files

108 lines
2.3 KiB
Python

import json
import os
import sys
def _is_frozen():
return getattr(sys, 'frozen', False) or '__compiled__' in sys.modules
def _get_app_dir():
if _is_frozen():
return os.path.dirname(sys.executable)
return os.path.dirname(os.path.abspath(__file__))
def _get_config_path():
return os.path.join(_get_app_dir(), "config.json")
DEFAULT_CONFIG = {
"api": {
"url": "http://localhost:8080/wallpaper",
"mode": "direct",
"json_image_field": "url",
"timeout": 30,
},
"wallpaper": {
"fill_style": "fill",
"cache_dir": "./cache",
"max_cache_files": 10,
"show_notification": True,
},
"auto_refresh": {
"enabled": False,
"interval_minutes": 10,
},
}
_config = None
def _resolve_path(path: str) -> str:
if os.path.isabs(path):
return path
return os.path.normpath(os.path.join(_get_app_dir(), path))
def load() -> dict:
global _config
if _config is not None:
return _config
config_path = _get_config_path()
if os.path.exists(config_path):
with open(config_path, "r", encoding="utf-8") as f:
_config = json.load(f)
else:
_config = DEFAULT_CONFIG
merged = dict(DEFAULT_CONFIG)
_deep_merge(merged, _config)
_config = merged
return _config
def save(cfg: dict = None) -> None:
global _config
if cfg is not None:
_config = cfg
with open(_get_config_path(), "w", encoding="utf-8") as f:
json.dump(_config, f, indent=4, ensure_ascii=False)
def reload() -> dict:
global _config
_config = None
return load()
def get(path: str, default=None):
cfg = load()
keys = path.split(".")
for k in keys:
if isinstance(cfg, dict):
cfg = cfg.get(k)
if cfg is None:
return default
else:
return default
return cfg
def set_(path: str, value):
global _config
cfg = load()
keys = path.split(".")
d = cfg
for k in keys[:-1]:
d = d.setdefault(k, {})
d[keys[-1]] = value
save(cfg)
def _deep_merge(base, override):
for key, value in override.items():
if key in base and isinstance(base[key], dict) and isinstance(value, dict):
_deep_merge(base[key], value)
else:
base[key] = value