feat: #1789 标题 drawtext 滤镜渲染 — 单视频+批量生成都生效 #1792

Merged
auto-approve-bot merged 3 commits from feat/title-drawtext-1789 into develop 2026-09-08 13:14:13 +08:00
Owner

背景

#1789 标题设置中字号滑块和样式切换后,生成的视频中标题配置没有生效。

改动

packages/domain/video_filter_builder.py

  • 新增 build_title_drawtext_filter() — 从 title_config 生成 FFmpeg drawtext 滤镜
  • 支持 position(top/center/bottom/custom+pos_x/pos_y)
  • 支持 font_size / font_color / bold / stroke / shadow
  • 字段名归一化:兼容前端两套命名(content↔text、font_preset↔font、size↔font_size、color↔font_color)
  • drawtext 特殊字符转义(: ' %)
  • 字体搜索路径(Noto Sans CJK → DejaVu 降级)

apps/api/app/services/video_compose_service.py

  • build_compose_command() 从 plan.config 读取 title_config(兼容 title / title_config 两个 key)
  • drawtext 滤镜链入 filter_complex:[outv] → [composed] → drawtext → [outv]
  • 单视频和批量生成共用同一 compose 路径,标题都能生效

tests/unit/domain/test_title_drawtext_1789.py

  • 26 新测试覆盖:基本参数、位置、样式、字段归一化、特殊字符转义、输出尺寸

与 ASS 字幕路径的关系

UnifiedRenderService 使用 ASS 字幕渲染标题(已有完整实现),本 PR 新增的 drawtext 滤镜用于 VideoComposeService.build_compose_command() 路径,两条路径互补。前端 TitleSettings 的样式参数在 drawtext 路径中完整映射到 FFmpeg 参数。

## 背景 #1789 标题设置中字号滑块和样式切换后,生成的视频中标题配置没有生效。 ## 改动 ### packages/domain/video_filter_builder.py - 新增 build_title_drawtext_filter() — 从 title_config 生成 FFmpeg drawtext 滤镜 - 支持 position(top/center/bottom/custom+pos_x/pos_y) - 支持 font_size / font_color / bold / stroke / shadow - 字段名归一化:兼容前端两套命名(content↔text、font_preset↔font、size↔font_size、color↔font_color) - drawtext 特殊字符转义(: ' %) - 字体搜索路径(Noto Sans CJK → DejaVu 降级) ### apps/api/app/services/video_compose_service.py - build_compose_command() 从 plan.config 读取 title_config(兼容 title / title_config 两个 key) - drawtext 滤镜链入 filter_complex:[outv] → [composed] → drawtext → [outv] - 单视频和批量生成共用同一 compose 路径,标题都能生效 ### tests/unit/domain/test_title_drawtext_1789.py - 26 新测试覆盖:基本参数、位置、样式、字段归一化、特殊字符转义、输出尺寸 ## 与 ASS 字幕路径的关系 UnifiedRenderService 使用 ASS 字幕渲染标题(已有完整实现),本 PR 新增的 drawtext 滤镜用于 VideoComposeService.build_compose_command() 路径,两条路径互补。前端 TitleSettings 的样式参数在 drawtext 路径中完整映射到 FFmpeg 参数。
xiaoxia added 1 commit 2026-09-08 12:49:45 +08:00
feat: #1789 标题 drawtext 滤镜渲染 — 单视频+批量生成都生效
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1s
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 2s
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
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 / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped 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 / PR Build API Image (pull_request) Successful in 24s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 25s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 1m5s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m11s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m16s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 1m47s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 1m55s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m57s
AI Code Review / AI Code Review (pull_request) Successful in 6m28s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 7m23s
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 / CI Gate (pull_request) Failing after 4s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 4m37s
4513f82fb1
在 video_filter_builder.py 新增 build_title_drawtext_filter():
- 从 title_config 生成 FFmpeg drawtext 滤镜
- 支持 position(top/center/bottom/custom+pos_x/pos_y)
- 支持 font_size/font_color/bold/stroke/shadow
- 字段名归一化:兼容 content↔text、font_preset↔font、size↔font_size、color↔font_color
- 特殊字符转义(:/'%)
- 字体搜索路径(Noto Sans CJK 优先)

在 video_compose_service.py build_compose_command() 集成:
- 从 plan.config 读取 title_config(兼容 title/title_config 两个 key)
- drawtext 滤镜链入 filter_complex([composed]→drawtext→[outv])
- 单视频和批量生成共用同一 compose 路径,标题都能生效

26 新测试覆盖:基本参数/位置/样式/字段归一化/特殊字符转义/输出尺寸

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1792 | | 预览链接 | [https://pr-1792.preview.xiaoxiajianji.com](https://pr-1792.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia added 1 commit 2026-09-08 12:59:57 +08:00
test: #1789 补充 drawtext 滤镜分支覆盖率 — 40 个新测试
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 2s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
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 / 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 / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped 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 / PR Build API Image (pull_request) Successful in 34s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 35s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m8s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 1m18s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m43s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 2m9s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 2m13s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m3s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 6m8s
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 / CI Gate (pull_request) Failing after 1s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 3m20s
AI Code Review / AI Code Review (pull_request) Successful in 6m26s
53f17db0a7
- _escape_drawtext_text 直接测试(6 用例)
- _resolve_font_path mock 字体搜索/fallback/无字体(6 用例)
- build_title_drawtext_filter 全分支覆盖:font_path 存在/不存在、stroke 各类型、shadow 各类型、bold、位置各模式、字段归一化(23 用例)
- video_compose_service 标题集成测试(5 用例):drawtext 注入、title_config 回退、非 dict 容错

目标:CI diff coverage 从 17% 提升到 ≥40%
xiaoxia added 1 commit 2026-09-08 13:07:52 +08:00
test: #1789 将 drawtext 测试合并到 CI 映射的测试文件
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
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 / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped 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 / PR Build API Image (pull_request) Successful in 30s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 31s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m14s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 1m29s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 1m40s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m41s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 2m4s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m51s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 5m39s
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 / CI Gate (pull_request) Successful in 3s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 3m26s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 10s
AI Code Review / AI Code Review (pull_request) Successful in 6m36s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 39s
51b1556f8b
CI 增量测试模式只运行与变更源文件映射的测试文件:
- video_filter_builder.py → test_video_filter_builder.py
- video_compose_service.py → test_video_compose_service.py

之前独立测试文件 (test_title_drawtext_*.py) 未被映射所以被跳过,
导致 diff coverage 始终只有 17%。

本次改动:
- 37 个 drawtext 测试合并到 test_video_filter_builder.py
- 5 个 compose 标题集成测试合并到 test_video_compose_service.py
- _StubPlan 新增 config 参数支持
- 删除独立测试文件(不再需要)

共 155 个测试全部通过。
auto-approve-bot merged commit 9dec75c365 into develop 2026-09-08 13:14:13 +08:00
auto-approve-bot deleted branch feat/title-drawtext-1789 2026-09-08 13:14:14 +08:00

🗑️ 预览环境已清理

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

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

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