fix(cover): 修复预览视频存储路径错误导致封面生成 500
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1m8s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m30s
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
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 813h28m21s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 813h29m49s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 813h28m41s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 813h29m51s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 813h28m43s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 813h29m53s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 813h29m45s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 813h29m53s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 814h3m18s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 814h3m24s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1m8s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m30s
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
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 813h28m21s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 813h29m49s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 813h28m41s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 813h29m51s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 813h28m43s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 813h29m53s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 813h29m45s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 813h29m53s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 814h3m18s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 814h3m24s
修复两个导致封面生成 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
- 修复:过滤空路径段,新文件不再产生 //
This commit is contained in:
@@ -241,9 +241,15 @@ def _render_with_unified(
|
||||
return {"status": "error", "message": result.error_message or "渲染失败"}
|
||||
|
||||
output_path = result.output_path or Path("")
|
||||
output_url = result.output_url
|
||||
output_url = result.output_url or ""
|
||||
thumbnail_url = result.thumbnail_url or ""
|
||||
storage_key = f"rendered/{plan_id}/output.mp4"
|
||||
# adapter 上传到 rendered/{plan_id}/{job_id}.mp4,从 URL 提取实际 key
|
||||
# 不能用 output.mp4 硬编码,否则 cover 等下游通过 key 构造的 URL 指向不存在的文件
|
||||
if output_url:
|
||||
from packages.shared.storage import get_shared_storage_service
|
||||
storage_key = get_shared_storage_service().normalize_storage_key(output_url)
|
||||
else:
|
||||
storage_key = f"rendered/{plan_id}/{generation_task_id or plan_id}.mp4"
|
||||
|
||||
# 用 adapter 返回的 clip 明细(以 adapter 的结果为准)
|
||||
rendered_clip_ids = result.rendered_clip_ids or []
|
||||
|
||||
@@ -1262,7 +1262,9 @@ def _upload_and_record(
|
||||
Returns:
|
||||
(file_url, duration, file_size, video_count)
|
||||
"""
|
||||
storage_key = f"generated/projects/{project_id}/tasks/{task_id}/{output_path.name}"
|
||||
# project_id 可能为空(模板编辑器草稿不属于任何项目),过滤空段避免 OSS key 出现 //
|
||||
path_parts = [p for p in ("generated", "projects", project_id, "tasks", task_id, output_path.name) if p]
|
||||
storage_key = "/".join(path_parts)
|
||||
file_size = output_path.stat().st_size
|
||||
|
||||
# 上传 OSS
|
||||
|
||||
@@ -342,3 +342,4 @@ class TestGenerateCover:
|
||||
assert result["type"] == "ai_frame"
|
||||
call_kwargs = mock_cover_service.call_args[1]
|
||||
assert call_kwargs["primary_video_url"] is None
|
||||
|
||||
|
||||
Reference in New Issue
Block a user