fix(cover): 修复预览视频存储路径错误导致封面生成 500 #1358

Merged
xiaoxia merged 2 commits from fix/double-slash-oss-path into develop 2026-08-13 18:17:10 +08:00
Owner

问题

封面生成 API 返回 500,MediaKit 报 DownloadFileError, http status code is 404

根因(两个独立 bug)

Bug 1: 统一渲染引擎 storage_key 路径不匹配(主要问题)

  • RenderAdapter 实际上传到 rendered/{plan_id}/{job_id}.mp4
  • edit_plan_generation.py 硬编码存储 rendered/{plan_id}/output.mp4
  • cover.py 通过 storage_key 构造的 URL 指向不存在的文件 → 404
  • 验证:rendered/f86959d8.../output.mp4 → 404,实际文件在 rendered/gen_f869.../d54bcb32....mp4 → 200

Bug 2: Worker _upload_and_record 双斜杠路径

  • project_id 为空时(模板编辑器草稿),路径产生 projects//tasks/
  • MediaKit HTTP 客户端规范化 URL(合并 //)→ 404

修复

文件 修复
edit_plan_generation.py 从 adapter 返回的 output_url 提取实际 storage_key
worker/generation.py 过滤空路径段,新文件不再产生 //

注意

旧数据中已存在的错误路径需要用户重新生成预览。新任务不再产生此问题。

## 问题 封面生成 API 返回 500,MediaKit 报 `DownloadFileError, http status code is 404`。 ## 根因(两个独立 bug) ### Bug 1: 统一渲染引擎 storage_key 路径不匹配(主要问题) - RenderAdapter 实际上传到 `rendered/{plan_id}/{job_id}.mp4` - 但 `edit_plan_generation.py` 硬编码存储 `rendered/{plan_id}/output.mp4` - cover.py 通过 storage_key 构造的 URL 指向不存在的文件 → 404 - 验证:`rendered/f86959d8.../output.mp4` → 404,实际文件在 `rendered/gen_f869.../d54bcb32....mp4` → 200 ### Bug 2: Worker _upload_and_record 双斜杠路径 - `project_id` 为空时(模板编辑器草稿),路径产生 `projects//tasks/` - MediaKit HTTP 客户端规范化 URL(合并 `//`)→ 404 ## 修复 | 文件 | 修复 | |---|---| | `edit_plan_generation.py` | 从 adapter 返回的 `output_url` 提取实际 storage_key | | `worker/generation.py` | 过滤空路径段,新文件不再产生 `//` | ## 注意 旧数据中已存在的错误路径需要用户重新生成预览。新任务不再产生此问题。
xiaoxia added 1 commit 2026-08-13 17:56:57 +08:00
fix(cover): 修复预览视频存储路径错误导致封面生成 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 / 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 1m8s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m30s
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
AI Code Review / AI Code Review (pull_request) Successful in 1m59s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m59s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m7s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m10s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m20s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m2s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m55s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 4m19s
CI/CD Pipeline / Validate - Code Quality (pull_request) Has been cancelled
CI/CD Pipeline / 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
1157acd2ad
修复两个导致封面生成 MediaKit 404 的存储路径 bug:

Bug 1: 统一渲染引擎 storage_key 路径不匹配
- RenderAdapter 实际上传到 rendered/{plan_id}/{job_id}.mp4
- 但 edit_plan_generation.py 硬编码存储 rendered/{plan_id}/output.mp4
- cover.py 通过 storage_key 构造的 URL 指向不存在的文件 → 404
- 修复:从 adapter 返回的 output_url 提取实际 storage_key

Bug 2: Worker _upload_and_record 双斜杠路径
- project_id 为空时(模板编辑器草稿),f'generated/projects/{project_id}/tasks/...'
  产生 projects//tasks/ 双斜杠
- MediaKit HTTP 客户端规范化 URL(合并 //)→ 404
- 修复:过滤空路径段,新文件不再产生 //

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1358 | | 预览链接 | [https://pr-1358.preview.xiaoxiajianji.com](https://pr-1358.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot added 1 commit 2026-08-13 18:04:00 +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 26s
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
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m39s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m43s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m57s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m58s
AI Code Review / AI Code Review (pull_request) Successful in 2m21s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m43s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m43s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m26s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 4m5s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 6m12s
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production API 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 3m1s
CI/CD Pipeline / CI Gate (pull_request) Successful in 6s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 53s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 53s
35d5757c13
Collaborator

代码审查结果 - PR #1358

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

  1. apps/worker/worker_app/tasks/generation.py 第1265行:列表推导式中错误使用了字符串字面量 "task_id" 而非变量 task_id。这会导致生成的存储路径包含 "task_id" 文本而非实际的任务 ID,造成文件上传路径错误,下游服务无法正确访问文件。

💡 建议(1个可选)

  1. apps/worker/worker_app/tasks/generation.py 第1265行:原路径中包含 "tasks" 目录层级,新代码构建 path_parts 时遗漏了该层级,导致目录结构发生变化。请确认是否需要保留 tasks 层级,若需保留应在列表中补充 "tasks" 字符串。

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


🤖 由 AI 代码审查机器人自动生成 | 2026-08-13 10:06:22 | 模型:

## 代码审查结果 - PR #1358 ### ⚠️ 问题(1个需要修改) 1. **apps/worker/worker_app/tasks/generation.py 第1265行**:列表推导式中错误使用了字符串字面量 `"task_id"` 而非变量 `task_id`。这会导致生成的存储路径包含 "task_id" 文本而非实际的任务 ID,造成文件上传路径错误,下游服务无法正确访问文件。 ### 💡 建议(1个可选) 1. **apps/worker/worker_app/tasks/generation.py 第1265行**:原路径中包含 `"tasks"` 目录层级,新代码构建 `path_parts` 时遗漏了该层级,导致目录结构发生变化。请确认是否需要保留 `tasks` 层级,若需保留应在列表中补充 `"tasks"` 字符串。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-13 10:06:22 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit 0a00870ab6 into develop 2026-08-13 18:17:10 +08:00

🗑️ 预览环境已清理

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

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

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