fix: 封面选帧输入源改为最终成片,预览片段作为兼容回退 #1534

Merged
xiaoxia merged 7 commits from fix/cover-from-final-video into develop 2026-08-29 01:19:02 +08:00
Owner

改动内容

配合前端步骤调整(选择标题(含预览) → 选择配音 → 确认生成 → 选择封面),封面选帧接口的输入视频源从「预览片段」改为「确认生成产出的最终成片」。

与前端 PR #1533 契约对齐:前端传入 generated_video_id + video_url

后端改动

  1. GenerateCoverRequest 新增两个可选字段

    • generated_video_id:确认生成产出的最终视频 ID
    • video_url:最终视频 URL(兜底)
  2. 视频源查找优先级调整

    • 0a:请求体 generated_video_id → 查 GeneratedVideo.file_url
    • 0b:请求体 video_url → 直接使用
    • 1:plan.config.rendered_storage_key
    • 2:plan.config.generation_task_id
    • 3:source_edit_plan_id 关联的 is_preview=False 已完成任务(最终成片优先)
    • 4:source_edit_plan_id 关联的 is_preview=True 预览任务(回退)
    • 5:user+template 最近预览任务(兜底)
  3. cover_url 查找同步调整:步骤B 优先取最终成片任务的 cover_url,再回退预览任务

  4. MediaKit 调用完全不变strategy=SpecifiedFramesmax_frames=1、轮询间隔、重试次数、降级逻辑全部保持原样,只是传入的视频 URL 从预览换成最终成片

  5. 权限校验:通过 generated_video_id 查找视频后,校验其关联 generation_task 的用户归属

兼容性

  • 新字段均可选,不传时自动查找该 plan 关联的最终成片任务
  • 找不到最终成片时回退到预览片段,旧流程不受影响
  • upload 类型封面完全不走视频查找,不受影响

测试

  • 27 个原有测试全部通过
  • 新增 5 个单测:schema 字段、generated_video_id 抽帧、video_url 抽帧、最终成片优先于预览、权限校验 403
  • ruff lint 通过
## 改动内容 配合前端步骤调整(选择标题(含预览) → 选择配音 → 确认生成 → 选择封面),封面选帧接口的输入视频源从「预览片段」改为「确认生成产出的最终成片」。 与前端 PR #1533 契约对齐:前端传入 `generated_video_id` + `video_url`。 ### 后端改动 1. **`GenerateCoverRequest` 新增两个可选字段**: - `generated_video_id`:确认生成产出的最终视频 ID - `video_url`:最终视频 URL(兜底) 2. **视频源查找优先级调整**: - 0a:请求体 `generated_video_id` → 查 `GeneratedVideo.file_url` - 0b:请求体 `video_url` → 直接使用 - 1:`plan.config.rendered_storage_key` - 2:`plan.config.generation_task_id` - 3:`source_edit_plan_id` 关联的 `is_preview=False` 已完成任务(最终成片优先) - 4:`source_edit_plan_id` 关联的 `is_preview=True` 预览任务(回退) - 5:`user+template` 最近预览任务(兜底) 3. **cover_url 查找同步调整**:步骤B 优先取最终成片任务的 `cover_url`,再回退预览任务 4. **MediaKit 调用完全不变**:`strategy=SpecifiedFrames`、`max_frames=1`、轮询间隔、重试次数、降级逻辑全部保持原样,只是传入的视频 URL 从预览换成最终成片 5. **权限校验**:通过 `generated_video_id` 查找视频后,校验其关联 `generation_task` 的用户归属 ### 兼容性 - 新字段均可选,不传时自动查找该 plan 关联的最终成片任务 - 找不到最终成片时回退到预览片段,旧流程不受影响 - `upload` 类型封面完全不走视频查找,不受影响 ### 测试 - 27 个原有测试全部通过 - 新增 5 个单测:schema 字段、generated_video_id 抽帧、video_url 抽帧、最终成片优先于预览、权限校验 403 - ruff lint 通过
xiaoxia added 1 commit 2026-08-28 23:19:27 +08:00
fix: 封面选帧输入源改为最终成片,预览片段作为兼容回退
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 / Check if frontend-only change (pull_request) Successful in 1m37s
AI Code Review / AI Code Review (pull_request) Failing after 3m22s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m40s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m30s
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 2m38s
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 / PR Build Worker Image (pull_request) Successful in 53s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m19s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 11m47s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 13m51s
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
3e71a00b12
- GenerateCoverRequest 新增可选字段 generated_video_id / video_url,
  与前端 PR #1533 契约对齐:前端在「选择封面」步骤传入确认生成产出的
  最终视频 ID 或 URL,后端据此定位最终成片文件并抽帧
- 视频源查找优先级调整:
  0a. 请求体 generated_video_id → GeneratedVideo.file_url
  0b. 请求体 video_url → 直接使用
  1. plan.config.rendered_storage_key
  2. plan.config.generation_task_id
  3. source_edit_plan 关联的 is_preview=False 已完成任务(最终成片优先)
  4. source_edit_plan 关联的 is_preview=True 预览任务(回退)
  5. user+template 最近预览任务(兜底)
- cover_url 查找同步调整:优先最终成片任务的 cover_url,再回退预览
- MediaKit 的 strategy/max_frames/轮询/重试/降级逻辑全部不变
- 权限校验:通过 generated_video_id 关联的 generation_task 校验归属
- 新增 5 个单测覆盖:schema 字段、video_id 抽帧、video_url 抽帧、
  最终成片优先于预览、权限校验 403

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1534 | | 预览链接 | [https://pr-1534.preview.xiaoxiajianji.com](https://pr-1534.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot added 1 commit 2026-08-28 23:35:02 +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 / Check if frontend-only change (pull_request) Successful in 2m31s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 3m18s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 3m57s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m16s
CI/CD Pipeline / PR Build Web Image (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
PR Automation / Auto Approve on CI Green (pull_request) Successful in 5m53s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 35s
AI Code Review / AI Code Review (pull_request) Failing after 7m15s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 11m22s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 12m31s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 28m3s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 25m1s
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 4m50s
CI/CD Pipeline / CI Gate (pull_request) Successful in 31s
b6f211ebe6
auto-approve-bot approved these changes 2026-08-29 00:05:31 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-08-29 00:05:31 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
xiaoxia added 1 commit 2026-08-29 00:21:56 +08:00
fix: 封面选帧接口安全加固 — 权限校验防绕过 + video_url SSRF 白名单
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 2m31s
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 3m35s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 3m55s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 4m4s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m56s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 4m31s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m3s
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
AI Code Review / AI Code Review (pull_request) Has been cancelled
PR Automation / Auto Approve on CI Green (pull_request) Has been cancelled
3b828ab184
AI Code Review 指出的两个阻塞问题:

1. 权限校验绕过(步骤0a):原逻辑仅在关联任务存在且
   created_by_user_id 非空时才校验归属;若 GeneratedVideo 的
   generation_task_id 为空或关联任务被删除,校验被静默跳过。
   修复:
   - 优先校验 GeneratedVideo.user_id 直接归属
   - 关联任务存在时校验 task.created_by_user_id
   - video 无 owner 且关联任务也查不到(归属无法确认)→ 403,
     不再静默放行

2. video_url SSRF(步骤0b):原逻辑直接使用请求体传入的 URL,
   攻击者可传入内网/云元数据地址诱导服务端请求。
   修复:新增 _is_trusted_media_url() 白名单校验:
   - 仅允许 http/https 且主机为自家 OSS bucket/endpoint 域名
   - 显式拒绝 localhost/127.*/10.*/192.168.*/169.254.*/172.16-31.*
   - 校验失败静默忽略该 URL,回退后续查找链

附带改进(review 建议项):
- 函数内联 import 全部移至模块顶部(storage/re)
- 新增 2 个安全测试:SSRF 内网地址拦截、归属无法确认 403
- 现有 32 个测试适配新的 mock 命名空间,共 34 个测试全过
auto-approve-bot added 1 commit 2026-08-29 00:27:58 +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
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 3m41s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 4m0s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 4m1s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 5m5s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 5m54s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 7m1s
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) Failing after 8m22s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 8m41s
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m33s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m34s
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
e5e18ef269
xiaoxia added 1 commit 2026-08-29 00:39:06 +08:00
fix: SSRF 白名单加固 — 修复 endpoint 解析绕过 + 补充 IPv6 内网拦截
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 / Check if frontend-only change (pull_request) Successful in 4m7s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 4m45s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 4m52s
AI Code Review / AI Code Review (pull_request) Failing after 5m18s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 5m24s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 5m27s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
PR Automation / Auto Approve on CI Green (pull_request) Successful in 8m9s
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 / 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 / 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 / PR Build API Image (pull_request) Has been cancelled
CI/CD Pipeline / PR Build Worker Image (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
bde37af2bb
AI Code Review 第二轮指出的两个阻塞问题:

1. endpoint 主机名解析绕过:原逻辑 ep.split(':')[0] 在 endpoint
   带 scheme(http://host:9000)时取到 'http',虽白名单顺序使
   public_url 先生效,但 endpoint 分支可能错误匹配 '.http' 后缀。
   修复:新增 _endpoint_host() 统一用 urlparse 提取主机名,
   兼容有无 scheme、带端口等各种配置形式。

2. 缺失 IPv6 内网地址校验:[::1]、fe80::/10(链路本地)、
   fc00::/7(唯一本地)等 IPv6 本地地址未拦截。
   修复:补充 IPv6 回环/链路本地/ULA 地址显式拒绝。

附带:
- 移除函数内重复的 urlparse 导入,统一使用顶部导入
- 新增 2 个白名单单元测试(IPv4/IPv6/元数据拦截 + scheme 解析)
- 共 36 个测试全部通过
xiaoxia added 1 commit 2026-08-29 00:49:22 +08:00
fix: SSRF 内网判定改用 ipaddress 标准库,覆盖全部 IPv4/IPv6 私有段
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 3m20s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 3m30s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 3m19s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 2m48s
AI Code Review / AI Code Review (pull_request) Failing after 3m31s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
PR Automation / Auto Approve on CI Green (pull_request) Successful in 5m1s
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
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 / 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 E2E Tests (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 / ACR Image Cleanup (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
Preview Deploy / Deploy Preview Environment (pull_request) Has been cancelled
cf7e295f35
AI Code Review 第三轮指出:IPv6 链路本地地址使用字符串前缀匹配
(fe80/fe90/...)不严谨且易漏。

修复:新增 _is_private_or_reserved_host(),统一用标准库
ipaddress.ip_address().is_private/is_loopback/is_link_local/
is_reserved 判定,一次性准确覆盖:
- IPv4: 10/8、172.16/12、192.168/16、127/8、169.254/16、0.0.0.0
- IPv6: ::1、fc00::/7(ULA)、fe80::/10(链路本地)、保留段
删除手工字符串切片逻辑,可读性和正确性都更好。

36 个测试全部通过。
auto-approve-bot added 1 commit 2026-08-29 00:59:10 +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 3m51s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 4m22s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 4m52s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 5m21s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 5m43s
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
AI Code Review / AI Code Review (pull_request) Successful in 6m18s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m16s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 7m6s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m4s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 5m6s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 10m24s
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 / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Successful in 6m20s
CI/CD Pipeline / CI Gate (pull_request) Successful in 32s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 3m41s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 5m15s
f9d243a5af
Collaborator

【阻塞级判定】

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

📊 审查概览

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

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

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

  1. [apps/api/app/api/routes/generation_cover.py: 418, 437, 538] 性能优化:避免重复数据库查询

    • 具体内容:在 generate_cover 函数中,_repo.list_by_source_edit_plan(plan_id) 被调用了多次(步骤3、步骤4以及后续查找封面URL的步骤B)。如果该 plan 关联的任务较多,这会导致不必要的数据库 I/O 开销。建议将查询结果缓存到局部变量中,在内存中进行过滤(如区分 is_preview),以减少数据库压力。
  2. [apps/api/app/api/routes/generation_cover.py: 326, 366, 425] 敏感信息日志脱敏

    • 具体内容:代码中多处使用 url[:80] 记录日志。如果 video_urlfile_url 是包含签名(Signature)或临时 Token 的 OSS 预签名 URL,日志可能会泄露部分敏感凭证。建议在记录 URL 日志时,剔除 query 参数或仅记录 path 部分,防止敏感信息泄露到日志系统中。

良好实践

  1. SSRF 防护_is_trusted_media_url 函数实现较为严谨,结合了 ipaddress 标准库和域名白名单机制,有效防止了通过 video_url 参数发起的内网 SSRF 攻击。
  2. 权限校验:在步骤 0a 中,对 generated_video_id 的归属进行了双重校验(Video 自身的 user_id 和关联 Task 的 created_by_user_id),且在无法确认归属时选择拒绝访问(Fail-close),符合安全最佳实践。
  3. 异常处理:新增的辅助函数(如 _resolve_storage_key_to_url)均包含异常捕获,且在异常时返回 None 或记录日志,保证了主流程的健壮性,不会因非关键路径的错误导致接口崩溃。
  4. 代码重构:将重复的 storage key 转 URL 逻辑提取为 _resolve_storage_key_to_url 函数,减少了代码冗余。

🤖 由 AI 代码审查机器人自动生成 | 2026-08-28 17:05:25 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:否 - 阻塞级问题数量:0 个 ### 📊 审查概览 - 整体评价:有建议 - 建议级问题数量:2 个 ### 🔴 阻塞级问题(必须修复) 无 ### 💡 改进建议(不阻塞合并) 1. **[apps/api/app/api/routes/generation_cover.py: 418, 437, 538] 性能优化:避免重复数据库查询** - 具体内容:在 `generate_cover` 函数中,`_repo.list_by_source_edit_plan(plan_id)` 被调用了多次(步骤3、步骤4以及后续查找封面URL的步骤B)。如果该 plan 关联的任务较多,这会导致不必要的数据库 I/O 开销。建议将查询结果缓存到局部变量中,在内存中进行过滤(如区分 `is_preview`),以减少数据库压力。 2. **[apps/api/app/api/routes/generation_cover.py: 326, 366, 425] 敏感信息日志脱敏** - 具体内容:代码中多处使用 `url[:80]` 记录日志。如果 `video_url` 或 `file_url` 是包含签名(Signature)或临时 Token 的 OSS 预签名 URL,日志可能会泄露部分敏感凭证。建议在记录 URL 日志时,剔除 query 参数或仅记录 path 部分,防止敏感信息泄露到日志系统中。 ### ✅ 良好实践 1. **SSRF 防护**:`_is_trusted_media_url` 函数实现较为严谨,结合了 `ipaddress` 标准库和域名白名单机制,有效防止了通过 `video_url` 参数发起的内网 SSRF 攻击。 2. **权限校验**:在步骤 0a 中,对 `generated_video_id` 的归属进行了双重校验(Video 自身的 user_id 和关联 Task 的 created_by_user_id),且在无法确认归属时选择拒绝访问(Fail-close),符合安全最佳实践。 3. **异常处理**:新增的辅助函数(如 `_resolve_storage_key_to_url`)均包含异常捕获,且在异常时返回 `None` 或记录日志,保证了主流程的健壮性,不会因非关键路径的错误导致接口崩溃。 4. **代码重构**:将重复的 storage key 转 URL 逻辑提取为 `_resolve_storage_key_to_url` 函数,减少了代码冗余。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-28 17:05:25 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit 425a7cb623 into develop 2026-08-29 01:19:02 +08:00

🗑️ 预览环境已清理

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

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

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