import yaml from functools import lru_cache from pydantic import BaseModel from pydantic_settings import BaseSettings from typing import Optional CONFIG_PATH = "configs/config.yaml" class TMDBConfig(BaseModel): api_key: Optional[str] = None class DoubanConfig(BaseModel): cookie: Optional[str] = None class RedisConfig(BaseModel): host: str port: int db: int cache_ttl_seconds: int class UploaderConfig(BaseModel): enable: bool api_url: str api_key: str class Settings(BaseSettings): api_key: str tmdb: TMDBConfig douban: DoubanConfig redis: RedisConfig uploader: UploaderConfig def set_config_path(path: str = "configs/config.yaml"): """允许在启动时设置配置文件路径""" global CONFIG_PATH CONFIG_PATH = path @lru_cache() # 使用 lru_cache 确保配置文件只被读取和解析一次 def get_settings() -> Settings: """ 加载并返回配置对象。 这是一个可被 FastAPI 依赖注入的函数。 """ try: with open(CONFIG_PATH, 'r', encoding='utf-8') as f: config_data = yaml.safe_load(f) return Settings.parse_obj(config_data) except FileNotFoundError: raise RuntimeError(f"配置文件未找到: {CONFIG_PATH}") except Exception as e: raise RuntimeError(f"加载配置文件失败: {e}")