fix(worker): ingest增加素材有效性校验,坏文件标记为ERROR #488
Reference in New Issue
Block a user
Delete Branch "fix/ingest-validation"
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?
问题
ingest流程中ffprobe/Pillow失败时仍然创建status=READY的asset,导致27字节文本文件也能伪装成有效视频进入素材库。一键生成自动选到坏素材直接渲染失败。
修复
影响范围
只改了
apps/worker/worker_app/tasks/ingest.py,不影响已有的正常素材(READY状态的不受影响)。测试
tests/unit/test_ingest_validation.py,14个测试覆盖:CI全绿,自动审批通过。
CI全绿,自动审批通过。
代码审查结果 - PR #488
⚠️ 问题(2个需要修改)
apps/worker/worker_app/tasks/ingest.py 第126-131行:图片元数据提取逻辑中缺少
size_bytes字段的赋值。extract_media_metadata函数的image分支中,代码只提取了width,height,format,mode,但没有提取文件大小。_is_valid_media函数(第166行)会检查size >= MIN_IMAGE_FILE_SIZE(100字节)。由于metadata中缺少size_bytes,默认值为0,导致所有图片文件的校验结果均为False,进而导致所有图片上传任务被标记为ERROR状态。with Image.open(file_url) as img2:块中添加文件大小获取逻辑,例如:apps/worker/worker_app/tasks/ingest.py 第93行:视频处理分支使用了未在当前作用域定义的变量
json_lib。media_type == "video")中直接使用了json_lib.loads(stdout),但该变量仅在音频处理分支(media_type == "audio",第118行)中通过import json as json_lib进行了局部导入。json_lib未在文件头部全局定义,当处理视频文件时,代码将抛出NameError,导致任务崩溃。虽然推测原代码可能在头部有定义,但当前 diff 显示的局部导入方式引入了作用域风险。import json移至文件头部全局区域,或者确保json_lib在两个分支中均可用,保持代码风格一致。💡 建议(2个可选)
apps/worker/worker_app/tasks/ingest.py 第96-111行 & 第118-142行:视频和音频的
ffprobe调用逻辑存在大量重复代码。ffprobe的命令构建、执行和 JSON 解析逻辑抽取为一个私有辅助函数(如_run_ffprobe_json),以减少代码重复,提高可维护性。apps/worker/worker_app/tasks/ingest.py 第239行:
error_reason的日志级别建议调整。logger.warning。由于此处会导致任务失败并创建 ERROR 状态的 Asset,建议使用logger.error以便在监控系统中更醒目地捕获失败原因,或者保持 warning 但补充更多的上下文信息(如storage_key)。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能无明显问题
🤖 由 AI 代码审查机器人自动生成 | 2026-07-17 22:20:18 | 模型: