feat: 视频合成完成后生成封面 #1255

Merged
xiaoxia merged 2 commits from feature/integrate-cover-generation into develop 2026-08-07 12:50:54 +08:00
Owner

需求

在视频生成完成后,根据 plan.config.cover_config 配置生成封面

实现

  • 修改 apps/worker/worker_app/tasks/compose_video.py
  • 视频渲染完成后,读取 plan.config.cover_config
  • 支持三种模式:
    • enabled=false → 不生成封面
    • enabled=true, mode=smart → 调用 extract_smart_cover()(抽取3帧选最清晰的)
    • enabled=true, mode=time → 调用 extract_frame()(指定时间抽帧)
    • enabled=true, mode=custom → 处理自定义上传封面
  • 生成的封面保存到输出目录,更新任务的 cover_url 字段
  • 封面生成失败不影响视频合成(容错处理)

测试

  • 新增 4 个单元测试覆盖所有场景
  • 全量测试通过

验证方式

  • 生成视频时开启封面 → 检查封面文件是否生成
  • 生成视频时关闭封面 → 检查不生成封面文件
  • 智能封面模式 → 检查封面是否为最清晰的帧
## 需求 在视频生成完成后,根据 plan.config.cover_config 配置生成封面 ## 实现 - 修改 `apps/worker/worker_app/tasks/compose_video.py` - 视频渲染完成后,读取 plan.config.cover_config - 支持三种模式: - `enabled=false` → 不生成封面 - `enabled=true, mode=smart` → 调用 extract_smart_cover()(抽取3帧选最清晰的) - `enabled=true, mode=time` → 调用 extract_frame()(指定时间抽帧) - `enabled=true, mode=custom` → 处理自定义上传封面 - 生成的封面保存到输出目录,更新任务的 cover_url 字段 - 封面生成失败不影响视频合成(容错处理) ## 测试 - 新增 4 个单元测试覆盖所有场景 - 全量测试通过 ## 验证方式 - 生成视频时开启封面 → 检查封面文件是否生成 - 生成视频时关闭封面 → 检查不生成封面文件 - 智能封面模式 → 检查封面是否为最清晰的帧
xiaoxia added 1 commit 2026-08-07 12:40:20 +08:00
feat: integrate cover generation into video composition workflow
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API 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 32s
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 58s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m15s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m39s
AI Code Review / AI Code Review (pull_request) Failing after 1m53s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m58s
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
ace7e0d7d1
- Add cover generation after video render completes in compose_video.py
- Read plan.config.cover_config to determine if cover should be generated
- Support enabled=false (skip), enabled=true with mode=smart/time/custom
- Update job result with cover_url field
- Cover generation failure does not break video composition
- Add 4 unit tests for cover integration

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1255 | | 预览链接 | [https://pr-1255.preview.xiaoxiajianji.com](https://pr-1255.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot added 1 commit 2026-08-07 12:42:35 +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 / Check if frontend-only change (pull_request) Successful in 1m13s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m24s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m47s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
AI Code Review / AI Code Review (pull_request) Successful in 2m21s
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
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 2m35s
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 / Validate - Code Quality (pull_request) Successful in 4m49s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 3m34s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 3m27s
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
PR Automation / Auto Approve on CI Green (pull_request) Successful in 5m6s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 4m6s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m4s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 4m48s
CI/CD Pipeline / CI Gate (pull_request) Successful in 9s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 13s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 19s
66630befa9
Collaborator

代码审查结果 - PR #1255

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

  1. apps/worker/worker_app/tasks/compose_video.py 第186行:封面生成逻辑中 cover_url 硬编码且未使用实际生成的文件路径。
    • 问题描述:代码调用 generate_cover_from_plan 获取了实际生成的封面路径 cover_path,但在构建 cover_url 时完全忽略了该返回值,直接使用了硬编码的格式 f"/covers/{plan_id}.jpg"
    • 后果:如果 generate_cover_from_plan 将文件生成在临时目录(如 /tmp)或未自动移动到 /covers/ 目录下,返回给上层的 cover_url 将是一个无效路径(404),导致前端无法显示封面,造成数据不一致。

💡 建议(1个可选)

  1. apps/worker/worker_app/tasks/compose_video.py 第166-170行:建议将模块内部的 import 语句(from video_processing...from packages.adapters...)移至文件顶部,除非是为了解决循环依赖或特定的延迟加载需求,否则这不符合 Python 的常规编码规范(PEP 8)。

格式检查通过 | 逻辑审查需修改 | 性能良好


🤖 由 AI 代码审查机器人自动生成 | 2026-08-07 04:45:08 | 模型:

## 代码审查结果 - PR #1255 ### ⚠️ 问题(1个需要修改) 1. **apps/worker/worker_app/tasks/compose_video.py 第186行**:封面生成逻辑中 `cover_url` 硬编码且未使用实际生成的文件路径。 - **问题描述**:代码调用 `generate_cover_from_plan` 获取了实际生成的封面路径 `cover_path`,但在构建 `cover_url` 时完全忽略了该返回值,直接使用了硬编码的格式 `f"/covers/{plan_id}.jpg"`。 - **后果**:如果 `generate_cover_from_plan` 将文件生成在临时目录(如 `/tmp`)或未自动移动到 `/covers/` 目录下,返回给上层的 `cover_url` 将是一个无效路径(404),导致前端无法显示封面,造成数据不一致。 ### 💡 建议(1个可选) 1. **apps/worker/worker_app/tasks/compose_video.py 第166-170行**:建议将模块内部的 import 语句(`from video_processing...` 和 `from packages.adapters...`)移至文件顶部,除非是为了解决循环依赖或特定的延迟加载需求,否则这不符合 Python 的常规编码规范(PEP 8)。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能良好 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-07 04:45:08 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit 6c70056a12 into develop 2026-08-07 12:50:54 +08:00

🗑️ 预览环境已清理

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

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

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