feat(#642): 一键生成支持自定义BGM #763

Merged
xiaoxia merged 1 commits from feat/custom-bgm-generation into develop 2026-07-23 19:45:08 +08:00
Owner

变更内容

一键生成支持用户自定义BGM配置,全链路透传并与模板配置智能合并。

核心改动

  • 领域层:GenerationTask 新增 bgm_config: dict 字段
  • 存储层:generation_tasks 表新增 bgm_config JSON 字段(migration 005)
  • 应用层:CreateGenerationTaskCommand + UseCase 透传 bgm_config
  • API层:请求/响应 Schema 新增 bgm_config 字段
  • Worker端:渲染前合并用户BGM配置与模板BGM配置

合并规则(packages/domain/bgm_utils.py)

  • 用户配置优先级 > 模板配置
  • 用户显式指定的字段覆盖模板
  • 用户未指定的字段保留模板值
  • enabled 特殊处理:用户显式传才覆盖,否则保留模板状态

测试

  • 14个 BGM 合并逻辑单测
  • 2个 领域模型单测
  • 全量 4246 passed, 8 skipped
## 变更内容 一键生成支持用户自定义BGM配置,全链路透传并与模板配置智能合并。 ### 核心改动 - **领域层**:GenerationTask 新增 `bgm_config: dict` 字段 - **存储层**:generation_tasks 表新增 `bgm_config JSON` 字段(migration 005) - **应用层**:CreateGenerationTaskCommand + UseCase 透传 bgm_config - **API层**:请求/响应 Schema 新增 bgm_config 字段 - **Worker端**:渲染前合并用户BGM配置与模板BGM配置 ### 合并规则(packages/domain/bgm_utils.py) - 用户配置优先级 > 模板配置 - 用户显式指定的字段覆盖模板 - 用户未指定的字段保留模板值 - `enabled` 特殊处理:用户显式传才覆盖,否则保留模板状态 ### 测试 - 14个 BGM 合并逻辑单测 - 2个 领域模型单测 - 全量 4246 passed, 8 skipped
xiaoxia added 1 commit 2026-07-23 18:25:36 +08:00
feat(#642): 一键生成支持自定义BGM
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 21s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 37s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 25s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m21s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m23s
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 / Validate - Code Quality (pull_request) Failing after 1m55s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 23s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 59s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 53s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
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 Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (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 / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 4m34s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m40s
AI Code Review / AI Code Review (pull_request) Successful in 4m4s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 5m49s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 10m3s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 19s
a9896e1507
- 领域模型 GenerationTask 新增 bgm_config 字段
- ORM/Repository/UseCase/API 全链路透传 bgm_config
- Worker 端新增 BGM 配置合并逻辑(用户配置 > 模板配置)
- enabled 字段特殊处理:用户显式传才覆盖模板状态
- 合并逻辑抽至 packages/domain/bgm_utils.py 纯函数
- 14个BGM合并单测 + 2个领域单测,全量4246通过
Collaborator

代码审查结果 - PR #763

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

  1. apps/worker/worker_app/tasks/generation.py 第1208行:存在可变对象引用修改风险,可能导致并发安全问题。
    • 问题描述:代码中 plan_cfg = virtual_plan.config or {} 获取了 virtual_plan.config 的引用(假设它是一个字典),随后直接修改 plan_cfg["bgm"] = merged_bgm。如果 virtual_plan 对象是被缓存的单例(例如模板对象在多个任务间复用),这个修改会污染共享对象,导致其他并发任务使用了错误的 BGM 配置。
    • 修改建议:确保在修改前进行深拷贝,或者确认 virtual_plan 在每次任务执行时都是全新创建的实例。建议修改为 plan_cfg = copy.deepcopy(virtual_plan.config) if virtual_plan.config else {},或者确保 virtual_plan 的来源是线程安全的独立副本。

💡 建议(2个可选)

  1. apps/api/app/schemas/generation_task.py 第56行:建议使用更严格的 Pydantic 模型进行字段校验。

    • 具体内容:当前 bgm_config 定义为 dict,允许任意 JSON 结构通过。建议定义一个具体的 BgmConfig 模型(包含 enabled: bool, volume: float 等字段),以便在 API 入口处就拦截非法数据(如 volume 超出 0-1 范围),避免错误传递到 Worker 环节。
  2. packages/domain/bgm_utils.py 第13-32行:建议在文档中明确“空字典”的合并行为。

    • 具体内容:当前逻辑中,如果 user_bgm 为空字典 {},函数会直接返回模板配置的副本。这符合“稀疏更新”的语义,但建议在 Docstring 中显式说明“传入空字典视为无更新,不会清空模板配置”,防止调用者误以为可以通过传 {} 来清空 BGM。

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


🤖 由 AI 代码审查机器人自动生成 | 2026-07-23 10:31:05 | 模型:

## 代码审查结果 - PR #763 ### ⚠️ 问题(1个需要修改) 1. **apps/worker/worker_app/tasks/generation.py 第1208行**:存在可变对象引用修改风险,可能导致并发安全问题。 - **问题描述**:代码中 `plan_cfg = virtual_plan.config or {}` 获取了 `virtual_plan.config` 的引用(假设它是一个字典),随后直接修改 `plan_cfg["bgm"] = merged_bgm`。如果 `virtual_plan` 对象是被缓存的单例(例如模板对象在多个任务间复用),这个修改会污染共享对象,导致其他并发任务使用了错误的 BGM 配置。 - **修改建议**:确保在修改前进行深拷贝,或者确认 `virtual_plan` 在每次任务执行时都是全新创建的实例。建议修改为 `plan_cfg = copy.deepcopy(virtual_plan.config) if virtual_plan.config else {}`,或者确保 `virtual_plan` 的来源是线程安全的独立副本。 ### 💡 建议(2个可选) 1. **apps/api/app/schemas/generation_task.py 第56行**:建议使用更严格的 Pydantic 模型进行字段校验。 - **具体内容**:当前 `bgm_config` 定义为 `dict`,允许任意 JSON 结构通过。建议定义一个具体的 `BgmConfig` 模型(包含 `enabled: bool`, `volume: float` 等字段),以便在 API 入口处就拦截非法数据(如 volume 超出 0-1 范围),避免错误传递到 Worker 环节。 2. **packages/domain/bgm_utils.py 第13-32行**:建议在文档中明确“空字典”的合并行为。 - **具体内容**:当前逻辑中,如果 `user_bgm` 为空字典 `{}`,函数会直接返回模板配置的副本。这符合“稀疏更新”的语义,但建议在 Docstring 中显式说明“传入空字典视为无更新,不会清空模板配置”,防止调用者误以为可以通过传 `{}` 来清空 BGM。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能无明显问题 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-23 10:31:05 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit 7d92f82900 into develop 2026-07-23 19:45:08 +08:00
xiaoxia deleted branch feat/custom-bgm-generation 2026-07-23 19:45:09 +08:00

🗑️ 预览环境已清理

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

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

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