fix: Worker渲染后提取封面帧+预览任务自动关联edit_plan #1394

Merged
xiaoxia merged 3 commits from fix/cover-extract-frames into develop 2026-08-16 19:25:23 +08:00
Owner

问题

Step6 封面生成返回 400:封面尚未生成,请先重新生成预览视频以触发封面自动提取

根因

  1. Worker 渲染预览视频并上传 OSS 后,没有调用 MediaKit 抽帧并将封面 URL 写入 gen_task.cover_url
  2. 预览任务创建时未设置 source_edit_plan_id,导致封面路由步骤 B(通过 source_edit_plan 关联查找)无法生效

修复

修复点 1 - Worker 封面帧提取

generation.py 在 _upload_and_record 后调用 MediaKitClient.extract_frames,取第一帧 URL 持久化到 cover_url

修复点 2 - API 自动关联 source_edit_plan_id

generation_preview.py 创建预览任务后,通过 template_id + user_id 查找 edit_plan,自动设置 source_edit_plan_id

测试

  • 新增 11 个测试
  • 已有 24 个相关测试无回归
## 问题 Step6 封面生成返回 400:封面尚未生成,请先重新生成预览视频以触发封面自动提取 ## 根因 1. Worker 渲染预览视频并上传 OSS 后,没有调用 MediaKit 抽帧并将封面 URL 写入 gen_task.cover_url 2. 预览任务创建时未设置 source_edit_plan_id,导致封面路由步骤 B(通过 source_edit_plan 关联查找)无法生效 ## 修复 ### 修复点 1 - Worker 封面帧提取 generation.py 在 _upload_and_record 后调用 MediaKitClient.extract_frames,取第一帧 URL 持久化到 cover_url ### 修复点 2 - API 自动关联 source_edit_plan_id generation_preview.py 创建预览任务后,通过 template_id + user_id 查找 edit_plan,自动设置 source_edit_plan_id ## 测试 - 新增 11 个测试 - 已有 24 个相关测试无回归

🚀 预览环境已部署

项目 详情
PR号 #1394
预览链接 https://pr-1394.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1394 | | 预览链接 | [https://pr-1394.preview.xiaoxiajianji.com](https://pr-1394.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot approved these changes 2026-08-16 19:10:30 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-08-16 19:10:30 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
xiaoxia added 2 commits 2026-08-16 19:11:30 +08:00
修复 Step6 封面生成 400 错误(根因:预览视频渲染后未抽帧写入 cover_url)

修复点 1 - Worker 封面帧提取:
- generation.py 在 _upload_and_record 后调用 MediaKitClient.extract_frames
- 使用 SpecifiedFrames 策略提取 1 帧
- 通过独立 session 将 cover_frame_url 持久化到 gen_task.cover_url
- 异常不影响主流程(try/except 包裹)

修复点 2 - API 自动关联 source_edit_plan_id:
- generation_preview.py 创建预览任务后,通过 template_id + user_id 查找 edit_plan
- 找到后自动设置 task.source_edit_plan_id 并更新 DB
- 使封面路由步骤 B(list_by_source_edit_plan)能生效

新增 11 个测试(test_cover_extract_frames.py)
已有 24 个相关测试无回归
test: add API-level tests for preview edit_plan auto-association
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 41s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m29s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m41s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m43s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m3s
AI Code Review / AI Code Review (pull_request) Successful in 2m46s
CI/CD Pipeline / Validate - Code Quality (pull_request) Has been cancelled
CI/CD Pipeline / Unit Tests (pull_request) Has been cancelled
CI/CD Pipeline / Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / PR Build API Image (pull_request) Has been cancelled
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
PR Automation / Auto Approve on CI Green (pull_request) Has been cancelled
f6d0a009e7
Cover generation_preview.py edit_plan auto-association logic:
- Auto-associate when source_edit_plan_id empty + template_id matches
- Skip when source_edit_plan_id already provided
- Graceful degradation when plan lookup fails
- Skip when no plan matches current user

Also rebase onto latest develop (PR #1393 merged) to eliminate
ass_subtitle_builder.py from diff coverage calculation.
xiaoxia force-pushed fix/cover-extract-frames from 8daf25b83b to f6d0a009e7 2026-08-16 19:11:30 +08:00 Compare
auto-approve-bot added 1 commit 2026-08-16 19:15:01 +08:00
style: auto-format with black + isort + prettier [skip ci-format-check]
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 26s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m24s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m38s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m55s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m57s
AI Code Review / AI Code Review (pull_request) Successful in 3m3s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m2s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 3m5s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 3m8s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m35s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m41s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m39s
CI/CD Pipeline / CI Gate (pull_request) Successful in 7s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 44s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 1m6s
7aa69b5fc6
Collaborator

代码审查结果 - PR #1394

⚠️ 问题(0个需要修改)

💡 建议(3个可选)

  1. apps/api/app/api/routes/generation_preview.py 第324行:建议优化查询逻辑以避免边界条件遗漏

    • 当前逻辑先查询 limit=20 的计划,再在内存中遍历匹配 user_id。如果该模板下用户的计划排在第20条之后,将导致自动关联失败。
    • 建议在数据库层面增加 created_by_user_id 的过滤条件,或者适当调大 limit 值,并确保查询排序(如按创建时间倒序)以优先关联最新计划。
  2. apps/worker/worker_app/tasks/generation.py 第1590行:建议简化条件判断

    • 代码中 if snapshots and len(snapshots) > 0: 存在冗余。在 Python 中空列表 [] 为 False,直接使用 if snapshots: 即可,代码更简洁。
  3. apps/api/app/api/routes/generation_preview.py 第318行:建议调整导入位置

    • SQLAlchemyEditPlanRepository 的导入位于函数内部。除非是为了解决循环依赖,否则建议移至文件顶部,以符合代码规范并提升可读性。

格式检查通过 | 逻辑审查需修改 | ⚠️ 建议关注性能


🤖 由 AI 代码审查机器人自动生成 | 2026-08-16 11:18:05 | 模型:

## 代码审查结果 - PR #1394 ### ⚠️ 问题(0个需要修改) 无 ### 💡 建议(3个可选) 1. **apps/api/app/api/routes/generation_preview.py 第324行**:建议优化查询逻辑以避免边界条件遗漏 - 当前逻辑先查询 `limit=20` 的计划,再在内存中遍历匹配 `user_id`。如果该模板下用户的计划排在第20条之后,将导致自动关联失败。 - 建议在数据库层面增加 `created_by_user_id` 的过滤条件,或者适当调大 `limit` 值,并确保查询排序(如按创建时间倒序)以优先关联最新计划。 2. **apps/worker/worker_app/tasks/generation.py 第1590行**:建议简化条件判断 - 代码中 `if snapshots and len(snapshots) > 0:` 存在冗余。在 Python 中空列表 `[]` 为 False,直接使用 `if snapshots:` 即可,代码更简洁。 3. **apps/api/app/api/routes/generation_preview.py 第318行**:建议调整导入位置 - `SQLAlchemyEditPlanRepository` 的导入位于函数内部。除非是为了解决循环依赖,否则建议移至文件顶部,以符合代码规范并提升可读性。 --- ✅ 格式检查通过 | ✅ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-16 11:18:05 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit c539095a33 into develop 2026-08-16 19:25:23 +08:00

🗑️ 预览环境已清理

PR #1394 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #1394 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.