108 lines
2.3 KiB
Python
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
|