Files
meijiaka-zy/python-api/app/schemas/materials.py
T
小鱼开发 447f3c2ffe feat: 空镜素材系统数据库化 + 修复积分不足弹窗叠加
后端:
- 新增 BrollCategory/BrollMaterial/BrollTag 模型及表(mjk_categories/materials/tags)
- 新增 Alembic 迁移 69274ce979a5
- 新增 broll_category/broll_material CRUD 层
- 重构 material_service:删除 JSON 配置,改用 PostgreSQL + Redis 去重
- 新增 /materials/batch-match 接口,删除 /materials/reload
- usage_count 原子递增,Redis 失败自动降级

前端:
- materials API 改为 projectId 去重,新增 batchMatch
- VideoGeneration 批量匹配改用 batchMatch,删除 usedUrls 手动维护
- 修复积分不足时进度弹窗与充值弹窗叠加的 bug
- 操作前预检积分,不足时显示提示条+立即充值按钮
2026-05-11 17:40:38 +08:00

82 lines
2.1 KiB
Python

"""
空镜素材 Schema
==============
"""
from pydantic import BaseModel, Field, field_validator
class MaterialInfo(BaseModel):
"""素材条目"""
url: str = Field(description="素材 URL(远程或本地路径)")
duration: float = Field(description="素材时长(秒)")
class MatchMaterialRequest(BaseModel):
"""匹配素材请求"""
scene: str = Field(description="分镜场景描述")
duration: float = Field(description="所需时长(秒)", gt=0)
project_id: str | None = Field(
default=None, description="项目ID,用于跨分镜去重"
)
@field_validator("scene")
@classmethod
def _validate_scene(cls, v: str) -> str:
v = v.strip()
if not v:
raise ValueError("场景描述不能为空")
return v
@field_validator("project_id")
@classmethod
def _validate_project_id(cls, v: str | None) -> str | None:
if v is not None and not v.strip():
return None
return v
class BatchMatchSceneItem(BaseModel):
"""批量匹配场景项"""
scene: str = Field(description="分镜场景描述")
duration: float = Field(description="所需时长(秒)", gt=0)
@field_validator("scene")
@classmethod
def _validate_scene(cls, v: str) -> str:
v = v.strip()
if not v:
raise ValueError("场景描述不能为空")
return v
class BatchMatchMaterialRequest(BaseModel):
"""批量匹配素材请求"""
project_id: str | None = Field(
default=None, description="项目ID,用于跨分镜去重"
)
scenes: list[BatchMatchSceneItem] = Field(
description="分镜场景列表",
min_length=1,
)
@field_validator("project_id")
@classmethod
def _validate_project_id(cls, v: str | None) -> str | None:
if v is not None and not v.strip():
return None
return v
class BatchMatchMaterialResponse(BaseModel):
"""批量匹配素材响应"""
project_id: str | None = Field(description="项目ID")
results: list[MaterialInfo | None] = Field(
description="匹配结果列表,与 scenes 一一对应"
)