import json import os from app.utils.logger import logger CONFIG_PATH = os.path.abspath( os.path.join(os.path.dirname(__file__), "..", "config.json") ) class ServerConfig: def __init__(self): self.theme = "auto" self.token = "" self.url = "" self.scheme = "https" self.port = "32400" self.library_name = "" self.path_rules: list[dict[str, str]] = [] # 新增:本地播放列表目录和默认同步策略(用于新的前端界面) self.local_playlist_dir = os.getenv("LOCAL_PLAYLIST_DIR", "playlist") self.sync_strategy = "LOCAL_OVERWRITE" self.load() def load(self) -> None: try: with open(CONFIG_PATH, "r", encoding="utf-8") as f: config = json.load(f) logger.debug(f"Loaded server config: {config}") except FileNotFoundError: # 如果配置文件不存在,使用默认值 self.save() logger.debug("Config file not found, using default values.") return except json.JSONDecodeError: # 如果配置文件格式错误,使用默认值 self.save() logger.debug("Config file is invalid, using default values.") return self.theme = config.get("theme", "auto") self.token = config.get("token", "") self.url = config.get("server_url", "") self.scheme = config.get("server_scheme", "https") self.port = config.get("server_port", "32400") self.library_name = config.get("library_name", "") self.path_rules = config.get("path_rules", []) or [] self.local_playlist_dir = config.get( "local_playlist_dir", self.local_playlist_dir ) self.sync_strategy = config.get("sync_strategy", self.sync_strategy) logger.info(f"Server config loaded: {self.__dict__}") def save(self): config = { "theme": self.theme, "token": self.token, "server_url": self.url, "server_scheme": self.scheme, "server_port": self.port, "library_name": self.library_name, "path_rules": self.path_rules, "local_playlist_dir": self.local_playlist_dir, "sync_strategy": self.sync_strategy, } with open(CONFIG_PATH, "w", encoding="utf-8") as f: json.dump(config, f, indent=4, ensure_ascii=False) logger.info(f"Server config saved: {config}") def set_url(self, url: str) -> None: self.url = url def set_scheme(self, scheme: str) -> None: self.scheme = scheme def set_port(self, port: str) -> None: self.port = port def set_token(self, token: str) -> None: self.token = token def set_library(self, library_name: str) -> None: self.library_name = library_name or "" def set_theme(self, theme: str) -> None: # check theme is valid if theme not in ["auto", "dark", "light"]: logger.error(f"Invalid theme: {theme}") raise ValueError("Invalid theme. Must be 'auto', 'dark', or 'light'.") self.theme = theme def set_path_rules(self, path_rules: list[dict[str, str]]) -> None: self.path_rules = path_rules or [] def set_local_playlist_dir(self, playlist_dir: str) -> None: if playlist_dir: self.local_playlist_dir = playlist_dir def set_sync_strategy(self, sync_strategy: str) -> None: self.sync_strategy = sync_strategy def set_and_save_config( self, theme: str = None, token: str = None, url: str = None, scheme: str = None, port: str = None, library_name: str | None = None, path_rules: list[dict[str, str]] | None = None, local_playlist_dir: str | None = None, sync_strategy: str | None = None, ) -> None: if theme is not None: self.set_theme(theme) if token is not None: self.set_token(token) if url is not None: self.set_url(url) if scheme is not None: self.set_scheme(scheme) if port is not None: self.set_port(port) if library_name is not None: self.set_library(library_name) if path_rules is not None: self.set_path_rules(path_rules) if local_playlist_dir is not None: self.set_local_playlist_dir(local_playlist_dir) if sync_strategy is not None: self.set_sync_strategy(sync_strategy) self.save() server_config = ServerConfig()