"""Shared settings for API and Worker services.""" import os from typing import Optional from pydantic_settings import BaseSettings, SettingsConfigDict class SharedSettings(BaseSettings): """Settings shared between API and Worker services.""" # Database database_url: str = "postgresql+psycopg://postgres:postgres@localhost:5432/xiaoxia_saas" database_pool_size: int = 20 database_max_overflow: int = 40 database_pool_timeout: int = 30 database_pool_recycle: int = 3600 # Redis redis_url: str = "redis://localhost:6379/0" # Celery celery_broker_url: str = "redis://localhost:6379/0" celery_result_backend: str = "redis://localhost:6379/1" # OSS Aliyun oss_endpoint: str = "oss-cn-hangzhou.aliiyuncs.com" oss_access_key_id: str = "" oss_access_key_secret: str = "" oss_bucket_name: str = "xiaoxia-autocut" # CosyVoice (阿里云语音合成) cosyvoice_api_key: str = "" cosyvoice_base_url: str = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text2audio" cosyvoice_model: str = "cosyvoice-v1" cosyvoice_voice: str = "longxiaochun" # 默认音色 cosyvoice_sample_rate: int = 22050 cosyvoice_format: str = "mp3" # 输出格式:mp3/wav/pcm # Environment environment: str = "development" auto_create_schema: bool = False model_config = SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", case_sensitive=False, extra="ignore", ) _settings: Optional[SharedSettings] = None def get_shared_settings() -> SharedSettings: """Get shared settings instance (global singleton).""" global _settings if _settings is None: env = os.getenv("APP_ENV", "development") env_file = f".env.{env}" if env != "development" else ".env" if os.path.exists(env_file): _settings = SharedSettings(_env_file=env_file) else: _settings = SharedSettings() return _settings