feat(#584): 智能匹配视频素材增强 — 多维度评分+多样性保证+项目级支持 #751
Reference in New Issue
Block a user
Delete Branch "feat/smart-asset-matching-enhanced"
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?
背景
一键生成的智能匹配素材功能太弱:
改动
新增 SmartAssetSelector 服务(
apps/api/app/services/smart_asset_selector.py)4维度加权评分(总分0-1):
时长多样性保证:
质量门槛过滤:
API 层改造(
generation_tasks.py)验证
🚀 预览环境已部署
代码审查结果 - PR #751
⚠️ 问题(3个需要修改)
apps/api/app/api/routes/generation_tasks.py 第221-227行:当项目下无素材时逻辑漏洞。
if assets: ...,如果asset_repository.find_by_project(project_id)返回空列表,则跳过整个if块。此时resolved_asset_ids保持为空(或进入该分支前的状态),代码继续向下执行use_case,可能导致下游逻辑报错或创建了无效的空任务,而不是返回明确的错误提示。assets为空时也抛出 HTTPException,提示用户项目下没有可用素材。apps/worker/video_processing/unified_render_service.py 第883行:
ResolvedClip的actual_duration参数赋值错误。actual_duration通常代表素材文件的真实物理时长。代码将其赋值为video_duration(视频总时长)。如果配音音频文件时长短于视频时长(例如音频10s,视频60s),这里会导致actual_duration(60s) 与实际文件长度 (10s) 不符。这可能导致渲染引擎在计算进度、分配缓冲区或进行时间轴映射时出现越界或逻辑错误。actual_duration应赋值为音频文件的真实时长(需读取文件获取或传入),duration(时间轴占用时长)可以设置为video_duration(如果引擎支持自动补齐或混音),但actual_duration必须真实。apps/api/app/services/smart_asset_selector.py 第255行:类型安全缺失导致潜在崩溃。
quality_score = (quality / 100.0) ...直接进行除法运算。如果数据库中的quality_score字段因脏数据或迁移问题存储了字符串类型(如"80"或"null"),此行将直接抛出TypeError,导致 API 500 错误。float(quality) if quality is not None else 0.5,并捕获可能的转换异常。💡 建议(2个可选)
apps/api/app/services/smart_asset_selector.py 第253-269行:循环内重复调用
getattr影响性能。_score_asset方法中,多次对同一个asset对象调用getattr(如quality_score,width,height,duration,file_size)。建议在方法开头一次性提取所有需要的属性到局部变量,减少属性查找开销。apps/api/app/api/routes/generation_tasks.py 第133行:存在重复的过滤逻辑。
_select_assets_from_library函数中已经过滤了ready状态和video类型的素材。当调用SmartAssetSelector时,其内部select方法又执行了一次完全相同的status和mime_type过滤。建议优化逻辑,避免对同一列表进行两次相同的遍历过滤。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能
🤖 由 AI 代码审查机器人自动生成 | 2026-07-23 11:02:16 | 模型:
🗑️ 预览环境已清理
PR #751 已关闭或合并,对应的预览环境已被清理。