8cb9e2da12
6. reload_config() 吞掉异常详情: - 返回类型从 bool 改为 tuple[bool, str],包含具体错误信息 - API 层将错误详情返回给前端,便于排查 - 异常统一记录到日志 8. 远程配置无 schema 校验: - 后端新增 MaterialsConfig Pydantic Model 校验 materials.json 结构 - load_config() 远程/本地配置均先校验再应用,格式错误时抛出明确异常 - 前端 CoverDesign 新增 isValidBgConfig() 运行时校验 bg-config.json - 校验失败时优雅降级到本地配置,避免页面白屏
37 lines
1.2 KiB
Python
37 lines
1.2 KiB
Python
"""
|
|
空镜素材 Schema
|
|
==============
|
|
"""
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class MaterialEntry(BaseModel):
|
|
"""素材配置条目"""
|
|
|
|
url: str = Field(description="素材 URL(远程或本地路径)")
|
|
|
|
|
|
class MaterialsConfig(BaseModel):
|
|
"""素材库配置 Schema(用于校验远程/本地 JSON)"""
|
|
|
|
version: str = Field(default="1.0", description="配置版本")
|
|
keywords: dict[str, str] = Field(description="关键词到分类 slug 的映射")
|
|
materials: dict[str, list[MaterialEntry]] = Field(description="分类 slug 到素材列表的映射")
|
|
|
|
|
|
class MaterialInfo(BaseModel):
|
|
"""素材条目"""
|
|
|
|
url: str = Field(description="素材 URL(远程或本地路径)")
|
|
duration: float = Field(description="素材时长(秒),从文件名解析)")
|
|
|
|
|
|
class MatchMaterialRequest(BaseModel):
|
|
"""匹配素材请求"""
|
|
|
|
scene: str = Field(description="分镜场景描述")
|
|
duration: float = Field(description="所需时长(秒)")
|
|
exclude_urls: list[str] = Field(default=[], description="已使用的素材 URL 列表(排除重复)")
|
|
strict: bool = Field(default=False, description="严格模式:若候选池全部被排除,返回 None 而非 fallback 到已排除素材")
|