fix(api): 一键生成自动选素材,创建计划时从项目视频素材库自动分配ready视频素材 #490
Reference in New Issue
Block a user
Delete Branch "fix/auto-select-assets"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
问题
一键生成基于PIP模板创建剪辑计划后,片段的asset_id全是空的,导致渲染时找不到可用片段。有6个ready视频素材但一个都没选上。
根因
create_plan和generate-from-template两个创建计划的入口,如果没有传入asset_ids,片段的 asset_id 就全为空。自动选素材的逻辑只在
/{{plan_id}}/generate阶段的兜底函数_auto_fallback_auto_material_mode里有,而且需要material_mode == "auto"才触发(默认是 manual)。一键生成场景下,素材在创建计划时就应该分配好,用户能看到完整的计划内容。
修复
在两个创建计划入口添加自动选素材逻辑:
auto_select_video_assets到_helpers.py,两个入口复用影响范围
POST /edit-plans— 新增自动选素材POST /edit-plans/generate-from-template— 新增自动选素材asset_ids的场景完全不受影响,行为不变测试
CI全绿,自动审批通过。
CI全绿,自动审批通过。
代码审查结果 - PR #490
⚠️ 问题(2个需要修改)
apps/api/app/api/routes/edit_plans.py 第425行:
list(body.asset_ids)存在潜在的空指针异常风险。body.asset_ids在 Pydantic 模型中定义为Optional[List[str]]且未传值(即为None),调用list(None)会直接抛出TypeError,导致接口崩溃。resolved_asset_ids = list(body.asset_ids or [])或先判断if body.asset_ids is None。apps/api/app/api/routes/edit_plans_timeline.py 第187行:同上,
list(body.asset_ids)存在相同的空指针异常风险。resolved_asset_ids = list(body.asset_ids or [])。apps/api/app/api/routes/_helpers.py 第76-82行:存在严重的性能隐患(N+1 查询及内存过滤)。
asset_repo.find_by_library(video_lib.id)可能会拉取该素材库下所有素材到内存中,再通过列表推导式进行过滤。如果素材库包含大量(如上万)非 ready 状态或非视频类型的文件,会造成不必要的内存占用和 CPU 消耗,响应时间显著增加。status和mime_type过滤的查询方法(如find_ready_videos_by_library),将过滤逻辑下推到数据库层。💡 建议(2个可选)
apps/api/app/api/routes/_helpers.py 第56-62行:代码重复,建议提取枚举值获取逻辑。
lib.kind和a.status的取值逻辑(hasattr判断)重复出现。建议提取一个内部辅助函数_get_enum_value(obj)来统一处理,保持代码整洁。apps/api/app/api/routes/_helpers.py 第56-62行:循环查找可优化。
next((lib for lib in libs if ...), None)替代显式的for循环和break,代码会更简洁且意图更明确。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能
🤖 由 AI 代码审查机器人自动生成 | 2026-07-18 08:39:07 | 模型: