8cb9e2da12
6. reload_config() 吞掉异常详情: - 返回类型从 bool 改为 tuple[bool, str],包含具体错误信息 - API 层将错误详情返回给前端,便于排查 - 异常统一记录到日志 8. 远程配置无 schema 校验: - 后端新增 MaterialsConfig Pydantic Model 校验 materials.json 结构 - load_config() 远程/本地配置均先校验再应用,格式错误时抛出明确异常 - 前端 CoverDesign 新增 isValidBgConfig() 运行时校验 bg-config.json - 校验失败时优雅降级到本地配置,避免页面白屏
47 lines
1.4 KiB
Python
47 lines
1.4 KiB
Python
"""
|
|
空镜素材 API
|
|
============
|
|
|
|
提供空镜素材匹配接口和配置重载接口。
|
|
"""
|
|
|
|
from fastapi import APIRouter
|
|
|
|
from app.schemas.common import ApiResponse, success_response
|
|
from app.schemas.materials import MatchMaterialRequest, MaterialInfo
|
|
from app.services.material_service import match_material, reload_config
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.post("/match", response_model=ApiResponse[MaterialInfo | None])
|
|
async def match_material_endpoint(request: MatchMaterialRequest):
|
|
"""
|
|
根据场景描述和所需时长匹配空镜素材
|
|
|
|
返回匹配到的素材信息,无匹配返回 data: null
|
|
"""
|
|
result = match_material(request.scene, request.duration, request.exclude_urls, request.strict)
|
|
|
|
if result is None:
|
|
return success_response(data=None, message="未匹配到素材")
|
|
|
|
return success_response(
|
|
data=MaterialInfo(url=result["url"], duration=result["duration"]),
|
|
message="匹配成功",
|
|
)
|
|
|
|
|
|
@router.post("/reload", response_model=ApiResponse[bool])
|
|
async def reload_materials_config():
|
|
"""
|
|
重新加载素材配置
|
|
|
|
从远程 CDN 拉取最新配置,失败则 fallback 到本地文件。
|
|
新增素材后调用此接口即可生效,无需重启服务。
|
|
"""
|
|
ok, error_msg = reload_config()
|
|
if ok:
|
|
return success_response(data=True, message="素材配置已重新加载")
|
|
return success_response(data=False, message=f"素材配置重载失败: {error_msg}")
|