fix(render): 画中画模式全面下线 + 标题ASS自动换行 #1239

Merged
xiaoxia merged 3 commits from fix/pip-removal-and-title-wrap into develop 2026-08-04 18:36:19 +08:00
Owner

Q1 — 画中画(PiP)模式全面下线

产品已确认全面下线画中画,pip/voice_pip 统一走 one_take(顺序拼接)。

改动:

  • apps/worker/worker_app/tasks/generation.py_build_plan_and_clips_from_task 移除 pip/voice_pip 分支,入口处强制映射为 one_take
  • apps/api/app/api/routes/generation_preview.py_resolve_strategy_id_from_template 返回前做 pip→one_take 映射
  • apps/api/app/api/routes/generation_tasks.py:strategy_id 中的 pip/voice_pip 统一映射

Q2 — 标题 ASS 自动换行

标题超出画面宽度时自动换行,防止溢出。

改动:

  • packages/domain/ass_subtitle_builder.py:新增 _wrap_title_text 函数
    • 根据视频宽度(PlayResX)、字号、边距估算可用宽度
    • CJK 字符按全角(font_size)、英文/数字按半角(font_size×0.55)估算
    • 超出可用宽度时插入 \N (ASS 硬换行)

测试

  • 75 个 ASS 字幕单测全绿(含 7 个新增换行测试)
  • 10 个四模式集成测试全绿(pip/voice_pip 改为验证 one_take 行为)
## Q1 — 画中画(PiP)模式全面下线 产品已确认全面下线画中画,pip/voice_pip 统一走 one_take(顺序拼接)。 **改动:** - `apps/worker/worker_app/tasks/generation.py`:`_build_plan_and_clips_from_task` 移除 pip/voice_pip 分支,入口处强制映射为 one_take - `apps/api/app/api/routes/generation_preview.py`:`_resolve_strategy_id_from_template` 返回前做 pip→one_take 映射 - `apps/api/app/api/routes/generation_tasks.py`:strategy_id 中的 pip/voice_pip 统一映射 ## Q2 — 标题 ASS 自动换行 标题超出画面宽度时自动换行,防止溢出。 **改动:** - `packages/domain/ass_subtitle_builder.py`:新增 `_wrap_title_text` 函数 - 根据视频宽度(PlayResX)、字号、边距估算可用宽度 - CJK 字符按全角(font_size)、英文/数字按半角(font_size×0.55)估算 - 超出可用宽度时插入 `\N` (ASS 硬换行) ## 测试 - 75 个 ASS 字幕单测全绿(含 7 个新增换行测试) - 10 个四模式集成测试全绿(pip/voice_pip 改为验证 one_take 行为)
xiaoxia added 1 commit 2026-08-04 17:48:04 +08:00
fix(render): 画中画模式全面下线 + 标题ASS自动换行
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 35s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 48s
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 - Type Check (mypy) (pull_request) Successful in 1m9s
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
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m26s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m52s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m5s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m53s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m57s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 3m39s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 5m39s
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production API 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
AI Code Review / AI Code Review (pull_request) Successful in 6m51s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m12s
CI/CD Pipeline / CI Gate (pull_request) Failing after 13s
c6a28ea7cd
Q1 — 画中画(PiP)下线:
- worker: _build_plan_and_clips_from_task 移除pip/voice_pip分支,
  入口处强制映射为one_take(顺序拼接)
- api preview: _resolve_strategy_id_from_template 返回前做pip→one_take映射
- api generation_tasks: strategy_id中的pip/voice_pip统一映射为one_take
- 更新集成测试:pip/voice_pip测试改为验证one_take行为

Q2 — 标题自动换行:
- packages/domain/ass_subtitle_builder.py: 新增_wrap_title_text函数
  根据视频宽度、字号、边距估算每行最大字符数,CJK全角+英文半角
  超出可用宽度时插入\N硬换行
- build_ass_content中title Dialogue生成前调用自动换行

测试:75个ASS单测全绿 + 10个四模式测试全绿

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1239 | | 预览链接 | [https://pr-1239.preview.xiaoxiajianji.com](https://pr-1239.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia added 1 commit 2026-08-04 18:00:03 +08:00
test: update generation_preview tests for pip→one_take mapping
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 / ACR Image Cleanup (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 / Check if frontend-only change (pull_request) Successful in 49s
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 1m0s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m14s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m32s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m33s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m52s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m51s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m23s
AI Code Review / AI Code Review (pull_request) Failing after 3m55s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 3m57s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 3m56s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web 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 3m47s
CI/CD Pipeline / CI Gate (pull_request) Successful in 13s
4f5a1d8eff
- test_new_template_found_returns_editing_mode: use 'standard' mode
- test_voice_pip_mode: expect 'one_take' (pip removed, mapped to one_take)
- test_strategy_id_from_new_template: use 'standard' mode
xiaoxia added 1 commit 2026-08-04 18:27:48 +08:00
fix: swap escape_ass_text and _wrap_title_text order
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 API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (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 - Type Check (mypy) (pull_request) Successful in 49s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 49s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m24s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m44s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m46s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m48s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 3m21s
AI Code Review / AI Code Review (pull_request) Successful in 4m11s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m23s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m41s
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 2m8s
CI/CD Pipeline / CI Gate (pull_request) Successful in 14s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 26s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 30s
32bc11e2c1
先 escape 特殊字符再插入 ASS 换行符 \N,消除 AI Code Review
对 \N 被转义为 \\N 的顾虑(虽然当前 escape_ass_text 不转义
反斜杠,但调换顺序后逻辑更安全清晰)。
Collaborator

【阻塞级判定】

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

📊 审查概览

  • 整体评价:通过
  • 建议级问题数量:0 个

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

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

良好实践

  1. 防御性编程:在 generation_tasks.pygeneration_preview.py 中,对已下线的 pip/voice_pip 模式进行了统一映射处理,确保了向后兼容性,避免了因旧数据或旧客户端请求导致的系统错误。
  2. 逻辑一致性:Worker 端 (generation.py) 和 API 端同时处理了模式映射,确保了整个链路的数据一致性。
  3. 安全性:在 ass_subtitle_builder.py 中,正确处理了转义与换行符插入的顺序(先转义特殊字符,再插入 \N),有效防止了 ASS 注入风险,同时保证了换行功能正常。
  4. 测试覆盖:不仅更新了单元测试以反映新的逻辑行为,还保留了针对旧模式映射的测试用例(如 test_pip_mode_maps_to_one_take),确保了代码变更的可靠性。
  5. 代码整洁:移除了 generation.py 中不再需要的 pipvoice_pip 分支逻辑,简化了代码结构,降低了维护成本。

格式检查通过 | 逻辑审查通过 | 性能良好


🤖 由 AI 代码审查机器人自动生成 | 2026-08-04 10:31:56 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:否 - 阻塞级问题数量:0 个 ### 📊 审查概览 - 整体评价:通过 - 建议级问题数量:0 个 ### 🔴 阻塞级问题(必须修复) 无 ### 💡 改进建议(不阻塞合并) 无 ### ✅ 良好实践 1. **防御性编程**:在 `generation_tasks.py` 和 `generation_preview.py` 中,对已下线的 `pip/voice_pip` 模式进行了统一映射处理,确保了向后兼容性,避免了因旧数据或旧客户端请求导致的系统错误。 2. **逻辑一致性**:Worker 端 (`generation.py`) 和 API 端同时处理了模式映射,确保了整个链路的数据一致性。 3. **安全性**:在 `ass_subtitle_builder.py` 中,正确处理了转义与换行符插入的顺序(先转义特殊字符,再插入 `\N`),有效防止了 ASS 注入风险,同时保证了换行功能正常。 4. **测试覆盖**:不仅更新了单元测试以反映新的逻辑行为,还保留了针对旧模式映射的测试用例(如 `test_pip_mode_maps_to_one_take`),确保了代码变更的可靠性。 5. **代码整洁**:移除了 `generation.py` 中不再需要的 `pip` 和 `voice_pip` 分支逻辑,简化了代码结构,降低了维护成本。 --- ✅ 格式检查通过 | ✅ 逻辑审查通过 | ✅ 性能良好 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-04 10:31:56 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit 004de97394 into develop 2026-08-04 18:36:19 +08:00

🗑️ 预览环境已清理

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

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

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