55 lines
1.6 KiB
Python
55 lines
1.6 KiB
Python
|
|
import json
|
|
import os
|
|
import logging
|
|
from config import Config
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class SettingsService:
|
|
"""Manage application settings using a JSON file"""
|
|
|
|
SETTINGS_FILE = os.path.join(Config.DATA_DIR, 'settings.json')
|
|
|
|
# Default settings
|
|
DEFAULTS = {
|
|
'youtube_engine': 'auto', # auto, local, remote
|
|
}
|
|
|
|
@classmethod
|
|
def _load_settings(cls) -> dict:
|
|
"""Load settings from file or return defaults"""
|
|
try:
|
|
if os.path.exists(cls.SETTINGS_FILE):
|
|
with open(cls.SETTINGS_FILE, 'r') as f:
|
|
data = json.load(f)
|
|
# Merge with defaults to ensure all keys exist
|
|
return {**cls.DEFAULTS, **data}
|
|
except Exception as e:
|
|
logger.error(f"Error loading settings: {e}")
|
|
|
|
return cls.DEFAULTS.copy()
|
|
|
|
@classmethod
|
|
def get(cls, key: str, default=None):
|
|
"""Get a setting value"""
|
|
settings = cls._load_settings()
|
|
return settings.get(key, default if default is not None else cls.DEFAULTS.get(key))
|
|
|
|
@classmethod
|
|
def set(cls, key: str, value):
|
|
"""Set a setting value and persist"""
|
|
settings = cls._load_settings()
|
|
settings[key] = value
|
|
|
|
try:
|
|
with open(cls.SETTINGS_FILE, 'w') as f:
|
|
json.dump(settings, f, indent=2)
|
|
except Exception as e:
|
|
logger.error(f"Error saving settings: {e}")
|
|
raise
|
|
|
|
@classmethod
|
|
def get_all(cls):
|
|
"""Get all settings"""
|
|
return cls._load_settings()
|