fix(ai-avatar): 修复智能封面502 - cover_service视频URL重签+轮询扩容+连接池+路由异常兜底 #1843

Merged
xiaoxia merged 1 commits from fix/cover-403-and-robustness into develop 2026-09-10 17:55:44 +08:00
Owner

问题

smart-cover接口传入的video_url为upload_file()返回的裸public_url,OSS桶(xiaoxia-autocut)为私有桶,MediaKit GPU worker通过storageGW拉取时返回403 Forbidden。

根因

storage.upload_file() 返回裸 public_url(不带签名),私有桶匿名访问会被拒绝。lipsync_service已在bf6d02f2中修复,但cover_service的select_best_cover_frame未做同样处理。

修复内容

  1. cover_service新增_sign_video_url_for_mediakit() - 检测自家OSS URL并重签7天有效期,外部URL原样透传
  2. 增大MediaKit抽帧轮询参数 - poll_interval: 2.0→3.0, max_poll_attempts: 5→20, max_retries: 0→1
  3. 帧下载改用httpx.Client连接池 - 复用TCP连接,减少多帧下载延迟
  4. smart-cover路由增加try/except - 异常时返回空而非502

测试

  • 更新2个已有测试适配httpx.Client mock
  • 新增3个测试:URL重签验证、外部URL跳过验证、轮询参数验证
  • 全部15个测试通过
## 问题 smart-cover接口传入的video_url为upload_file()返回的裸public_url,OSS桶(xiaoxia-autocut)为私有桶,MediaKit GPU worker通过storageGW拉取时返回403 Forbidden。 ## 根因 `storage.upload_file()` 返回裸 `public_url`(不带签名),私有桶匿名访问会被拒绝。lipsync_service已在bf6d02f2中修复,但cover_service的select_best_cover_frame未做同样处理。 ## 修复内容 1. **cover_service新增`_sign_video_url_for_mediakit()`** - 检测自家OSS URL并重签7天有效期,外部URL原样透传 2. **增大MediaKit抽帧轮询参数** - poll_interval: 2.0→3.0, max_poll_attempts: 5→20, max_retries: 0→1 3. **帧下载改用httpx.Client连接池** - 复用TCP连接,减少多帧下载延迟 4. **smart-cover路由增加try/except** - 异常时返回空而非502 ## 测试 - 更新2个已有测试适配httpx.Client mock - 新增3个测试:URL重签验证、外部URL跳过验证、轮询参数验证 - 全部15个测试通过
xiaoxia added 1 commit 2026-09-10 17:49:15 +08:00
fix(ai-avatar): 修复智能封面502 - cover_service视频URL重签+轮询扩容+连接池+路由异常兜底
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 2s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 27s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 27s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 1m25s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 1m47s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m48s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m28s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m12s
AI Code Review / AI Code Review (pull_request) Successful in 6m27s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 3m24s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 14s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 36s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 8m27s
CI/CD Pipeline / Validate - Style (pull_request) Failing after 11m50s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Failing after 8s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 141h22m32s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 141h22m32s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 141h22m38s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 141h22m38s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 141h33m6s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 141h33m6s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 141h33m6s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 141h34m11s
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Failing after 141h34m26s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Failing after 141h34m31s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 141h34m33s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 141h34m34s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 141h34m34s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 141h34m35s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 141h34m36s
CI/CD Pipeline / Check push changed paths (pull_request) Failing after 141h34m41s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 141h57m28s
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Failing after 142h9m15s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 142h9m22s
2a6da04685
根因: smart-cover接口传入的video_url为upload_file()返回的裸public_url,
OSS桶为私有桶,MediaKit GPU worker拉取时返回403 Forbidden。

修复内容:
1. cover_service新增_sign_video_url_for_mediakit(),对自家OSS URL重签7天有效期
2. 增大MediaKit抽帧轮询参数(poll_interval=3.0, max_poll_attempts=20, max_retries=1)
3. 帧下载改用httpx.Client连接池复用TCP连接,减少延迟
4. smart-cover路由增加try/except异常捕获,防止未捕获异常导致502

测试: 新增3个测试(URL重签/外部URL跳过/轮询参数验证),全部15个测试通过

Closes #1840

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1843 | | 预览链接 | [https://pr-1843.preview.xiaoxiajianji.com](https://pr-1843.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia merged commit a526a28865 into develop 2026-09-10 17:55:44 +08:00
xiaoxia deleted branch fix/cover-403-and-robustness 2026-09-10 17:55:50 +08:00

🗑️ 预览环境已清理

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

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

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