mirror of
https://github.com/Hommy-master/capcut-mate.git
synced 2026-10-30 18:44:19 +08:00
两个功能都是剪映字幕面板里的文字装饰效果,用同一份 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>