fix: 统一前后端标题渲染参数,修复描边/阴影样式丢失 #1393

Merged
auto-approve-bot merged 3 commits from fix/title-render-consistency into develop 2026-08-16 19:01:05 +08:00
Owner

问题

预览标题(前端Canvas)与生成视频标题(后端ASS)渲染效果不一致。

根因

  1. stroke/shadow 类型不匹配:前端发送 boolean (true/false),后端期望 dict ({enabled,color,width}) → 样式被丢弃
  2. 字号不一致:前端上限 36px,后端默认 48px
  3. 描边宽度不一致:前端 2px,后端默认 1px

修复

  • packages/domain/ass_subtitle_builder.py:
    • boolean stroke/shadow 自动转换为标准 dict(与前端参数对齐)
    • stroke=true → {enabled:true, color:#000, width:2}
    • shadow=true → {enabled:true, color:#000, blur:4, offset:2}
    • 字号上限 48→36(与前端一致)
    • 描边宽度默认 1→2(与前端一致)
  • tests/unit/test_title_render_consistency.py — 11个新测试验证一致性

改动文件

  • packages/domain/ass_subtitle_builder.py — boolean→dict 标准化 + 默认值修正 (+24 -3)
  • tests/unit/test_title_render_consistency.py — 11个新测试 (+181)
## 问题 预览标题(前端Canvas)与生成视频标题(后端ASS)渲染效果不一致。 ## 根因 1. stroke/shadow 类型不匹配:前端发送 boolean (true/false),后端期望 dict ({enabled,color,width}) → 样式被丢弃 2. 字号不一致:前端上限 36px,后端默认 48px 3. 描边宽度不一致:前端 2px,后端默认 1px ## 修复 - packages/domain/ass_subtitle_builder.py: - boolean stroke/shadow 自动转换为标准 dict(与前端参数对齐) - stroke=true → {enabled:true, color:#000, width:2} - shadow=true → {enabled:true, color:#000, blur:4, offset:2} - 字号上限 48→36(与前端一致) - 描边宽度默认 1→2(与前端一致) - tests/unit/test_title_render_consistency.py — 11个新测试验证一致性 ## 改动文件 - packages/domain/ass_subtitle_builder.py — boolean→dict 标准化 + 默认值修正 (+24 -3) - tests/unit/test_title_render_consistency.py — 11个新测试 (+181)
xiaoxia added 1 commit 2026-08-16 18:39:28 +08:00
fix: 统一前后端标题渲染参数,修复描边/阴影样式丢失
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Failing after 0s
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
AI Code Review / AI Code Review (pull_request) Failing after 0s
PR Automation / Auto Approve on CI Green (pull_request) Failing after 0s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Failing after 0s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 0s
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 1m13s
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 / Unit Tests (pull_request) Failing after 7s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m10s
CI/CD Pipeline / Validate - Code Quality (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
a9b93cc220
根因:
1. 前端 TitleSettings 发送 stroke/shadow 为 boolean (true/false),
   后端 build_ass_content 期望 stroke={enabled,color,width} dict 格式
   → 类型不匹配导致描边/阴影样式被丢弃
2. 前端字号上限 Math.min(size,36),后端默认48 → 字号不一致
3. 前端描边宽度2px,后端默认1px

修复:
- ass_subtitle_builder.py: boolean stroke/shadow 自动转换为标准dict
  stroke=true → {enabled:true, color:#000, width:2}
  shadow=true → {enabled:true, color:#000, blur:4, offset:2}
- 字号上限从48改为36(与前端一致)
- 描边宽度默认从1改为2(与前端一致)
- 11个新测试验证前后端样式一致性
auto-approve-bot added 1 commit 2026-08-16 18:43:53 +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
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 1s
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 38s
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 / PR Build Worker Image (pull_request) Failing after 1s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m35s
AI Code Review / AI Code Review (pull_request) Successful in 1m44s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m45s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 2m5s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 2m15s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 2m43s
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 / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m18s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m21s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 4m11s
CI/CD Pipeline / CI Gate (pull_request) Failing after 19s
02d2c7ea65
Collaborator

【阻塞级判定】

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

📊 审查概览

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

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

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

  1. [packages/domain/ass_subtitle_builder.py: 254, 262] 避免直接修改传入的可变参数
    • 具体内容:代码中直接对 title_config 字典进行了修改(如 title_config["stroke"] = ...)。虽然在当前上下文中可能不会导致问题,但直接修改函数传入的可变参数(字典)会产生副作用,如果调用方在函数调用后继续使用该配置对象,可能会遇到意外的数据结构变化。建议在函数开始时使用 copy.deepcopy(title_config) 创建副本,或者在修改前明确知晓此副作用并添加注释说明。

良好实践

  1. 测试覆盖全面:新增的测试文件 test_title_render_consistency.py 很好地覆盖了新旧格式兼容、边界值(如字号上限)以及默认值逻辑,确保了前后端行为的一致性。
  2. 逻辑清晰:布尔值到字典的转换逻辑使用了三元表达式,简洁明了,正确处理了 True(填充默认值)和 False(仅保留 enabled 键)两种情况。
  3. 默认值统一:将字号的默认值从 48 调整为 36 并设置上限,与前端逻辑保持一致,避免了渲染效果不匹配的问题。

🤖 由 AI 代码审查机器人自动生成 | 2026-08-16 10:45:37 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:否 - 阻塞级问题数量:0 个 ### 📊 审查概览 - 整体评价:通过 - 建议级问题数量:1 个 ### 🔴 阻塞级问题(必须修复) 无 ### 💡 改进建议(不阻塞合并) 1. **[packages/domain/ass_subtitle_builder.py: 254, 262] 避免直接修改传入的可变参数** - 具体内容:代码中直接对 `title_config` 字典进行了修改(如 `title_config["stroke"] = ...`)。虽然在当前上下文中可能不会导致问题,但直接修改函数传入的可变参数(字典)会产生副作用,如果调用方在函数调用后继续使用该配置对象,可能会遇到意外的数据结构变化。建议在函数开始时使用 `copy.deepcopy(title_config)` 创建副本,或者在修改前明确知晓此副作用并添加注释说明。 ### ✅ 良好实践 1. **测试覆盖全面**:新增的测试文件 `test_title_render_consistency.py` 很好地覆盖了新旧格式兼容、边界值(如字号上限)以及默认值逻辑,确保了前后端行为的一致性。 2. **逻辑清晰**:布尔值到字典的转换逻辑使用了三元表达式,简洁明了,正确处理了 `True`(填充默认值)和 `False`(仅保留 enabled 键)两种情况。 3. **默认值统一**:将字号的默认值从 48 调整为 36 并设置上限,与前端逻辑保持一致,避免了渲染效果不匹配的问题。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-16 10:45:37 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia added 1 commit 2026-08-16 18:52:05 +08:00
fix: rename ambiguous variable 'l' to 'line' in tests (E741)
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 26s
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 1m43s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m51s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m58s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m39s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m59s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 3m1s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 3m9s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m42s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m52s
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 / Canary Release to Production (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
AI Code Review / AI Code Review (pull_request) Successful in 6m52s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 3m11s
CI/CD Pipeline / CI Gate (pull_request) Successful in 19s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 37s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 51s
2f7789f10b
Fix 8 flake8 E741 errors in test_title_render_consistency.py
where list comprehension used 'l' as variable name.

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1393 | | 预览链接 | [https://pr-1393.preview.xiaoxiajianji.com](https://pr-1393.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot approved these changes 2026-08-16 19:00:34 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

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

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit 16767f675b into develop 2026-08-16 19:01:05 +08:00
auto-approve-bot deleted branch fix/title-render-consistency 2026-08-16 19:01:05 +08:00

🗑️ 预览环境已清理

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

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

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