feat: 预览生成支持随机选素材 + 随机截取片段 (#1256) #1268

Merged
xiaoxia merged 2 commits from feature/1256-random-asset-selection-preview into develop 2026-08-07 19:50:02 +08:00
Owner

改动概述

实现 #1256 后端部分:预览生成时支持随机选择素材组合 + 在素材时长范围内随机截取片段。

具体改动

1. EditPlanClip.assign_asset()

  • 新增可选参数 start_time: float | None = None
  • 向后兼容:不传 start_time 时行为不变

2. distribute_assets()

  • 新增 random_selection: bool = False — 打乱素材顺序后分配
  • 新增 asset_durations: dict[str, float] | None = None — 用于计算随机 start_time
  • 所有 4 种 editing_mode (ONE_TAKE/PIP/VOICE_OVER/VOICE_PIP) 均支持

3. _calc_random_start_time()

  • 新增纯函数:根据素材总时长和片段时长计算随机起始点
  • 公式:random.uniform(0, max(0, asset_duration - clip_duration))

4. PlanGeneratorService

  • 新增 random_preview: bool = False 参数
  • 开启时自动从 DB 获取素材时长,传入 distribute_assets

测试

  • 新增 18 个单元测试
  • 全量 13617 个测试通过

使用方式

# 普通模式(不变)
generator.generate_from_template(template, clip_configs, asset_ids)

# 随机预览模式
generator = PlanGeneratorService(db, asset_repo=asset_repo)
generator.generate_from_template(template, clip_configs, asset_ids, random_preview=True)
## 改动概述 实现 #1256 后端部分:预览生成时支持随机选择素材组合 + 在素材时长范围内随机截取片段。 ## 具体改动 ### 1. EditPlanClip.assign_asset() - 新增可选参数 `start_time: float | None = None` - 向后兼容:不传 start_time 时行为不变 ### 2. distribute_assets() - 新增 `random_selection: bool = False` — 打乱素材顺序后分配 - 新增 `asset_durations: dict[str, float] | None = None` — 用于计算随机 start_time - 所有 4 种 editing_mode (ONE_TAKE/PIP/VOICE_OVER/VOICE_PIP) 均支持 ### 3. _calc_random_start_time() - 新增纯函数:根据素材总时长和片段时长计算随机起始点 - 公式:`random.uniform(0, max(0, asset_duration - clip_duration))` ### 4. PlanGeneratorService - 新增 `random_preview: bool = False` 参数 - 开启时自动从 DB 获取素材时长,传入 distribute_assets ## 测试 - 新增 18 个单元测试 - 全量 13617 个测试通过 ## 使用方式 ```python # 普通模式(不变) generator.generate_from_template(template, clip_configs, asset_ids) # 随机预览模式 generator = PlanGeneratorService(db, asset_repo=asset_repo) generator.generate_from_template(template, clip_configs, asset_ids, random_preview=True) ```
xiaoxia force-pushed feature/1256-random-asset-selection-preview from c9d3c62aea to c9afa34370 2026-08-07 19:08:17 +08:00 Compare
xiaoxia added 1 commit 2026-08-07 19:30:41 +08:00
feat: 预览生成支持随机选素材 + 随机截取片段 (#1256)
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 39s
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 / Validate - Migration (alembic) (pull_request) Successful in 49s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m3s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m37s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m55s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m54s
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
Preview Deploy / Deploy Preview Environment (pull_request) Has been cancelled
33e977cc2a
- EditPlanClip.assign_asset() 新增可选 start_time 参数
- distribute_assets() 新增 random_selection 和 asset_durations 参数
- 新增 _calc_random_start_time() 计算随机起始点
- PlanGeneratorService 支持 random_preview 模式,自动获取素材时长
- 所有 4 种 editing_mode (ONE_TAKE/PIP/VOICE_OVER/VOICE_PIP) 均支持
- 完全向后兼容,不传新参数时行为不变
- 新增 18 个单元测试覆盖所有场景
xiaoxia force-pushed feature/1256-random-asset-selection-preview from b55664ce09 to 33e977cc2a 2026-08-07 19:30:41 +08:00 Compare
auto-approve-bot added 1 commit 2026-08-07 19:33:44 +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 37s
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 / Validate - Migration (alembic) (pull_request) Successful in 48s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m11s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m44s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m58s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m58s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m27s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 3m42s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m37s
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
AI Code Review / AI Code Review (pull_request) Successful in 5m44s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m53s
CI/CD Pipeline / CI Gate (pull_request) Successful in 6s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 11m47s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 15s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 29s
04b1e9522e
Collaborator

代码审查结果 - PR #1268

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

  1. apps/api/app/services/plan_generator_service.py 第236行:存在 N+1 查询性能隐患,_fetch_asset_durations 方法在循环中逐个调用 self._asset_repo.get(asset_id)。当传入的素材列表较长时(如 50 个素材),将触发 50 次数据库查询,严重影响接口响应速度。
    • 修改建议:请在 asset_repo 中实现批量查询方法(如 get_durations_mapget_by_ids),一次性获取所有素材的时长信息,避免循环查询数据库。

💡 建议(2个可选)

  1. apps/api/app/services/plan_generator_service.py 第118行:当 random_preview=Trueself._asset_repo 为 None 时,代码会静默降级(素材会被随机打乱,但 start_time 不会被随机设置)。建议在 random_preview 为 True 时强制要求注入 asset_repo,或者在日志中记录警告,以免产生不符合预期的“半随机”结果。
  2. packages/domain/edit_plan_clip.py 第130行assign_asset 方法的文档注释描述“否则保持默认 0.0”,但实际代码逻辑是“如果 start_time 无效(负数),则保持原对象的 start_time 不变”。建议修正文档注释以匹配实际行为,或者修改代码逻辑使其在传入无效值时重置为 0.0。

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


🤖 由 AI 代码审查机器人自动生成 | 2026-08-07 11:39:29 | 模型:

## 代码审查结果 - PR #1268 ### ⚠️ 问题(1个需要修改) 1. **apps/api/app/services/plan_generator_service.py 第236行**:存在 N+1 查询性能隐患,`_fetch_asset_durations` 方法在循环中逐个调用 `self._asset_repo.get(asset_id)`。当传入的素材列表较长时(如 50 个素材),将触发 50 次数据库查询,严重影响接口响应速度。 - **修改建议**:请在 `asset_repo` 中实现批量查询方法(如 `get_durations_map` 或 `get_by_ids`),一次性获取所有素材的时长信息,避免循环查询数据库。 ### 💡 建议(2个可选) 1. **apps/api/app/services/plan_generator_service.py 第118行**:当 `random_preview=True` 但 `self._asset_repo` 为 None 时,代码会静默降级(素材会被随机打乱,但 `start_time` 不会被随机设置)。建议在 `random_preview` 为 True 时强制要求注入 `asset_repo`,或者在日志中记录警告,以免产生不符合预期的“半随机”结果。 2. **packages/domain/edit_plan_clip.py 第130行**:`assign_asset` 方法的文档注释描述“否则保持默认 0.0”,但实际代码逻辑是“如果 `start_time` 无效(负数),则保持原对象的 `start_time` 不变”。建议修正文档注释以匹配实际行为,或者修改代码逻辑使其在传入无效值时重置为 0.0。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-07 11:39:29 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit 316f01b3f0 into develop 2026-08-07 19:50:02 +08:00

🗑️ 预览环境已清理

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

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

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