Files
capcut-mate/config
HommyandClaude Code b772987d29 add_captions 新增文字背景与文字发光支持,均照剪映草稿实证实现。
两个功能都是剪映字幕面板里的文字装饰效果,用同一份 add_captions 接口暴露,
且都只做接口级(不做逐条覆盖)。

has_background / background_info:文字底下的一层纯色底板。草稿中表现为文本素材
自己的 background_* 字段,同时 check_flag 置第 16 位(7 → 23)。字段名与取值与草稿
一一对应,无需单位换算;唯一例外是偏移量用草稿坐标 [-1, 1](0 居中),而库的构造
函数收 UI 坐标 [0.5 居中],故构造后直接赋值,避免 *2-1 往返引入浮点噪声。背景色
不经 hex_to_rgb——草稿里存的就是 "#RRGGBB" 字符串,非法值会原样落进草稿,故新增
_normalize_hex_color 做宽松校验,非法时回退黑色并告警(而非像 text_color 回退白色)。

text_glow:剪映发光面板的预设(外发光 / 轮廓光)。草稿中表现为 materials.effects 里
一条 type="bloom" 的素材,由片段 extra_material_refs 引用(追加在 sticker_animation
之后),check_flag 置第 64 位(7 → 71)。除 check_flag 外,带发光的文本素材与普通
字幕逐字段完全相同。发光不做优先级:它既不掌管片段的素材身份(那是文字模板的事),
也不改动文字样式(那是花字的事),只是再挂一条素材,故与花字 / 文字模板 / 气泡都
可以叠加,花字叠加时记告警。

pyJianYingDraft 侧改动(文字背景那次库已支持,是纯穿参;发光这次必须动库):
- 新增 TextGlow 素材类与 TextSegment.add_glow(),check_flag 增加第 64 位。
  export_json 写出草稿实证的整套字段,只去掉依赖创建者本机剪映缓存的 path
  (与气泡一致,由剪映按 resource_id 自行拉取)。
- create_from_template 同步携带 glow,否则模板派生的片段会静默丢发光。
- script_file 的 filters 类型提示、add_segment 收集、inspect_material 新增 bloom
  分支(用 .get 兜底,避免第三条 effect["type"] KeyError)。
- __init__ 导出 TextGlow,顺带补上一直漏在 __all__ 外的 TextBubble。

新增 config/glow.json 与 get_text_glows 解析器,结构照抄气泡那套:effect_id 与
resource_id 不是同一个值,故四种写法(名称 / resource_id / effect_id /
"effect_id:resource_id" 显式 ID 对),且不做纯数字透传。清单外发光的 bloom_params
无实证取值,落到默认值并告警——剪映不会按 resource_id 重新推导这些数值。

逐字段对拍参照草稿:背景的 8 个 background_* 字段与 check_flag 与草稿全等;发光的
bloom 素材只有 id(重新生成)与 path(刻意不导出)两个键不同,bloom_params 精确
相等,check_flag 同为 71。文本素材与草稿的 font_path / force_apply_line_max_width /
shadow_point 差异普通字幕也有,与本次改动无关。请求 → schema → router → service →
落盘草稿的全链路实跑通过;字幕相关测试 121 项通过,全量回归与改动前的失败基线
逐行相同(仓库本就有 51 项环境性失败)。

已知事项:两者的渲染效果均未在剪映里实测,文档已按仓库习惯标注;发光草稿里两条
字幕用了不同预设,接口级参数下复刻需调用两次 add_captions。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-14 19:49:18 +08:00
..
2026-04-01 18:50:39 +08:00