fix(cover): 封面生成前校验视频URL可达性,避免MediaKit超时120秒 #1356

Merged
auto-approve-bot merged 2 commits from fix/cover-video-url-validation into develop 2026-08-13 15:36:01 +08:00
Owner

问题

封面生成 API 返回 500 错误。日志显示 MediaKit 抽帧超时(120秒),原因是传给 MediaKit 的视频 URL 在 OSS 上不存在(HTTP 404)。

根因链路:
rendered_storage_key 指向的预览视频文件不存在 → MediaKit 无法下载 → 轮询 60 次(120秒)后超时 → 500 Internal Server Error

修复

在调用 MediaKit extract_frames 之前,先通过 HTTP HEAD 请求检查视频 URL 是否可访问:

  • URL 返回非 200 → 立即报错 封面生成失败: 预览视频URL不可访问 (HTTP 404)。请重新生成预览视频后再试。
  • HEAD 请求网络异常 → 报错并附带异常类型
  • 避免等待 120 秒超时才发现问题

改动文件

  • packages/shared/ai_service.py: 添加 URL 可达性检查(HEAD 请求)
  • tests/unit/test_mediakit_cover.py: mock HEAD 请求 + 新增 URL 不可达测试用例

测试

  • 16 个 MediaKit/封面相关单测全部通过
  • 9 个 confirm_generation 单测全部通过
## 问题 封面生成 API 返回 500 错误。日志显示 MediaKit 抽帧超时(120秒),原因是传给 MediaKit 的视频 URL 在 OSS 上不存在(HTTP 404)。 **根因链路:** `rendered_storage_key` 指向的预览视频文件不存在 → MediaKit 无法下载 → 轮询 60 次(120秒)后超时 → 500 Internal Server Error ## 修复 在调用 MediaKit `extract_frames` 之前,先通过 HTTP HEAD 请求检查视频 URL 是否可访问: - URL 返回非 200 → 立即报错 `封面生成失败: 预览视频URL不可访问 (HTTP 404)。请重新生成预览视频后再试。` - HEAD 请求网络异常 → 报错并附带异常类型 - 避免等待 120 秒超时才发现问题 ## 改动文件 - `packages/shared/ai_service.py`: 添加 URL 可达性检查(HEAD 请求) - `tests/unit/test_mediakit_cover.py`: mock HEAD 请求 + 新增 URL 不可达测试用例 ## 测试 - 16 个 MediaKit/封面相关单测全部通过 - 9 个 confirm_generation 单测全部通过
xiaoxia added 1 commit 2026-08-13 15:13:26 +08:00
fix(cover): validate video URL before MediaKit call
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 / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1m5s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m9s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m12s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m14s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
AI Code Review / AI Code Review (pull_request) Successful in 3m5s
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m26s
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
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m38s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m33s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m50s
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 / 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
dbf209e737
Root cause: MediaKit extract-frames times out (120s) when the video URL
returns 404 (file doesn't exist on OSS). The timeout error message is
misleading and wastes 2 minutes.

Fix:
- Add HTTP HEAD check before calling MediaKit to verify the video URL
  is accessible (returns 200)
- If URL returns non-200, immediately return clear error:
  '预览视频URL不可访问 (HTTP 404)。请重新生成预览视频后再试。'
- If HEAD request fails (network error), return clear error with
  exception type
- Moved 'import requests as http_requests' to module top level

Tests:
- Updated test_mediakit_cover.py: mock http_requests.head in 4 tests
  that pass primary_video_url
- Added new test: test_call_ai_cover_video_url_unreachable

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1356 | | 预览链接 | [https://pr-1356.preview.xiaoxiajianji.com](https://pr-1356.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot added 1 commit 2026-08-13 15:21:50 +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 Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web 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 33s
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 1m23s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m50s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m23s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m41s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m16s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m16s
AI Code Review / AI Code Review (pull_request) Successful in 2m53s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m27s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 7m30s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 9m45s
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 5m10s
CI/CD Pipeline / CI Gate (pull_request) Successful in 46s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 55s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 56s
6f6e1e9c41
Collaborator

代码审查结果 - PR #1356

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

💡 建议(1个可选)

  1. packages/shared/ai_service.py 第406行:HEAD 请求兼容性建议
    • 问题描述:部分老旧或特殊配置的 CDN/服务器可能不支持 HEAD 方法(返回 405 Method Not Allowed),但支持 GET 方法。当前逻辑将 405 视为不可访问,可能导致误判。
    • 修改建议:建议在捕获到 status_code != 200 时,特殊处理 405 状态码(例如记录警告但不抛出异常,或者降级发送一次 GET 请求验证),或者确认业务中的视频源均支持 HEAD 方法。

格式检查通过 | 逻辑审查通过 | 性能无明显问题


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

## 代码审查结果 - PR #1356 ### ⚠️ 问题(0个需要修改) 无 ### 💡 建议(1个可选) 1. **packages/shared/ai_service.py 第406行**:HEAD 请求兼容性建议 - 问题描述:部分老旧或特殊配置的 CDN/服务器可能不支持 HEAD 方法(返回 405 Method Not Allowed),但支持 GET 方法。当前逻辑将 405 视为不可访问,可能导致误判。 - 修改建议:建议在捕获到 `status_code != 200` 时,特殊处理 405 状态码(例如记录警告但不抛出异常,或者降级发送一次 GET 请求验证),或者确认业务中的视频源均支持 HEAD 方法。 --- ✅ 格式检查通过 | ✅ 逻辑审查通过 | ✅ 性能无明显问题 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-13 07:24:45 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot approved these changes 2026-08-13 15:35:30 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

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

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit 7ba46cb9c0 into develop 2026-08-13 15:36:01 +08:00
auto-approve-bot deleted branch fix/cover-video-url-validation 2026-08-13 15:36:01 +08:00

🗑️ 预览环境已清理

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

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

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