fix: 统一封面管道增加cover_url多步fallback查找,修复500错误 #1373

Merged
auto-approve-bot merged 2 commits from fix/cover-500-cover-url-fallback into develop 2026-08-15 11:41:00 +08:00
Owner

问题

PR #1372 部署后,封面自动生成仍报 500。

根因

统一封面管道(PR #1371)在 generation_cover.py 中只通过 generation_task_id 查找 GenerationTask.cover_url。但 generation_task_id 为空时(如 plan 创建时未关联),直接 fall through 到 run_generate_cover()_call_ai_cover_service()ai_frame 类型抛出 RuntimeError → 路由捕获后返回 500。

实际数据验证:staging DB 中 plan 70958badgeneration_task_id 为空,但该用户的预览任务(7d4fdf11)有 cover_url

修复

  1. 统一封面管道增加 3 步 fallback 查找 cover_url(与视频 URL 查找一致的逻辑):

    • 步骤 A:通过 generation_task_id 直接查找
    • 步骤 B:通过 source_edit_plan_id 查找关联预览任务
    • 步骤 C:通过 user+template 兜底查找
  2. 所有步骤都找不到 cover_url 时返回 400(而非 500),提示用户重新生成预览视频以触发封面自动提取

  3. 新增 3 个单元测试覆盖新 fallback 路径

变更文件

  • apps/api/app/api/routes/generation_cover.py — 统一封面管道多步 fallback (+78 -16)
  • tests/unit/test_generation_cover.py — 新增 3 个测试 + 更新 3 个已有测试

验收标准

  • CI 全绿
  • 15/15 封面测试通过
  • staging 部署后封面生成不再 500
## 问题 PR #1372 部署后,封面自动生成仍报 500。 ## 根因 统一封面管道(PR #1371)在 `generation_cover.py` 中只通过 `generation_task_id` 查找 `GenerationTask.cover_url`。但 `generation_task_id` 为空时(如 plan 创建时未关联),直接 fall through 到 `run_generate_cover()` → `_call_ai_cover_service()` 对 `ai_frame` 类型抛出 `RuntimeError` → 路由捕获后返回 500。 实际数据验证:staging DB 中 plan `70958bad` 的 `generation_task_id` 为空,但该用户的预览任务(`7d4fdf11`)有 `cover_url`。 ## 修复 1. **统一封面管道增加 3 步 fallback 查找 cover_url**(与视频 URL 查找一致的逻辑): - 步骤 A:通过 `generation_task_id` 直接查找 - 步骤 B:通过 `source_edit_plan_id` 查找关联预览任务 - 步骤 C:通过 `user+template` 兜底查找 2. **所有步骤都找不到 cover_url 时返回 400**(而非 500),提示用户重新生成预览视频以触发封面自动提取 3. **新增 3 个单元测试**覆盖新 fallback 路径 ## 变更文件 - `apps/api/app/api/routes/generation_cover.py` — 统一封面管道多步 fallback (+78 -16) - `tests/unit/test_generation_cover.py` — 新增 3 个测试 + 更新 3 个已有测试 ## 验收标准 - [ ] CI 全绿 - [ ] 15/15 封面测试通过 - [ ] staging 部署后封面生成不再 500
xiaoxia added 1 commit 2026-08-15 11:31:11 +08:00
fix: 统一封面管道增加cover_url多步fallback查找,修复500错误
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 / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 45s
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 - Type Check (mypy) (pull_request) Successful in 1m15s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m17s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m20s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m41s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 1m58s
CI/CD Pipeline / Validate - Code Quality (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 / Staging API Integration Tests (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
AI Code Review / AI Code Review (pull_request) Has been cancelled
PR Automation / Auto Approve on CI Green (pull_request) Has been cancelled
8b1be55f9d
根因:统一封面管道只通过 generation_task_id 查找 cover_url,
但 generation_task_id 为空时(如 plan 创建时未关联),
直接 fall through 到 run_generate_cover → RuntimeError → 500。

修复:
- 统一封面管道 section 增加与视频URL查找一致的 3 步 fallback:
  A: generation_task_id 直接查找
  B: source_edit_plan_id 查找
  C: user+template 兜底查找
- 所有步骤都找不到 cover_url 时返回 400 而非 500,
  提示用户重新生成预览视频以触发封面自动提取
- 新增 3 个单元测试覆盖新 fallback 路径

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1373 | | 预览链接 | [https://pr-1373.preview.xiaoxiajianji.com](https://pr-1373.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot added 1 commit 2026-08-15 11:34:15 +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 / 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 40s
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 - Type Check (mypy) (pull_request) Successful in 58s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m17s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m25s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m39s
AI Code Review / AI Code Review (pull_request) Successful in 2m14s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 2m3s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m26s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m26s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 3m35s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m36s
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 1m29s
CI/CD Pipeline / CI Gate (pull_request) Successful in 6s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 49s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 48s
e59cb16847
Collaborator

【阻塞级判定】

  • 是否存在阻塞级问题:否
  • 阻塞级问题数量:0 个

📊 审查概览

  • 整体评价:通过
  • 建议级问题数量:2 个

🔴 阻塞级问题(必须修复)

💡 改进建议(不阻塞合并)

  1. [apps/api/app/api/routes/generation_cover.py: 236] 性能优化建议

    • 具体内容:在 步骤 B 中调用了 gen_task_repo.list_by_source_edit_plan(plan_id)。根据测试用例 TestSourceEditPlanFallback 的注释 "Both video lookup (step 2.5) and cover_url lookup (step B) use this" 可知,该方法在同一个请求流程中可能被调用两次(一次用于查找视频,一次用于查找封面)。建议在函数作用域或上层逻辑中缓存该查询结果,避免重复查询数据库。
  2. [apps/api/app/api/routes/generation_cover.py: 225, 244, 263] 异常处理优化

    • 具体内容:代码中使用了 except Exception 捕获所有异常。虽然这在“降级/回退”管道中可以保证后续步骤执行,但会掩盖数据库连接错误、模型属性错误等程序异常。建议细化异常捕获范围(如捕获特定数据库异常),或者在日志中记录更详细的错误堆栈以便排查问题。

良好实践

  • 多级回退逻辑清晰:实现了 A -> B -> C 的清晰查找策略,增强了系统的鲁棒性。
  • 防御性编程:使用 getattr(task, "cover_url", "") 等方式安全访问属性,有效避免了因模型字段缺失导致的 AttributeError。
  • 测试覆盖充分:单元测试很好地覆盖了新增的各个回退分支以及失败场景。

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


🤖 由 AI 代码审查机器人自动生成 | 2026-08-15 03:36:28 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:否 - 阻塞级问题数量:0 个 ### 📊 审查概览 - 整体评价:通过 - 建议级问题数量:2 个 ### 🔴 阻塞级问题(必须修复) 无 ### 💡 改进建议(不阻塞合并) 1. **[apps/api/app/api/routes/generation_cover.py: 236] 性能优化建议** - 具体内容:在 `步骤 B` 中调用了 `gen_task_repo.list_by_source_edit_plan(plan_id)`。根据测试用例 `TestSourceEditPlanFallback` 的注释 "Both video lookup (step 2.5) and cover_url lookup (step B) use this" 可知,该方法在同一个请求流程中可能被调用两次(一次用于查找视频,一次用于查找封面)。建议在函数作用域或上层逻辑中缓存该查询结果,避免重复查询数据库。 2. **[apps/api/app/api/routes/generation_cover.py: 225, 244, 263] 异常处理优化** - 具体内容:代码中使用了 `except Exception` 捕获所有异常。虽然这在“降级/回退”管道中可以保证后续步骤执行,但会掩盖数据库连接错误、模型属性错误等程序异常。建议细化异常捕获范围(如捕获特定数据库异常),或者在日志中记录更详细的错误堆栈以便排查问题。 ### ✅ 良好实践 - **多级回退逻辑清晰**:实现了 A -> B -> C 的清晰查找策略,增强了系统的鲁棒性。 - **防御性编程**:使用 `getattr(task, "cover_url", "")` 等方式安全访问属性,有效避免了因模型字段缺失导致的 AttributeError。 - **测试覆盖充分**:单元测试很好地覆盖了新增的各个回退分支以及失败场景。 --- ✅ 格式检查通过 | ✅ 逻辑审查通过 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-15 03:36:28 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot approved these changes 2026-08-15 11:40:30 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

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

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit 59faf37fc9 into develop 2026-08-15 11:41:00 +08:00
auto-approve-bot deleted branch fix/cover-500-cover-url-fallback 2026-08-15 11:41:00 +08:00

🗑️ 预览环境已清理

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

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

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