合入main分支的代码。

This commit is contained in:
Hommy
2026-08-06 20:43:24 +08:00
parent c0986b765a
commit 8a2c30dc87
4 changed files with 26 additions and 18 deletions
+4 -4
View File
@@ -57,8 +57,8 @@ Batch-add captions to an existing CapCut/Jianying draft. Supports text color, bo
| keyword | string | ❌ | `null` | Keywords separated by `\|`, e.g. `"Hello\|World"` |
| keyword_color | string | ❌ | `"#ff7100"` | Keyword fill color (hex) |
| keyword_border_color | string | ❌ | `null` | Keyword stroke color; falls back to top-level `border_color` |
| keyword_font | string | ❌ | `null` | Keyword font (display/enum/alias from Supported Fonts); falls back to top-level `font` |
| keyword_font_size | integer | ❌ | `15` | Keyword font size, must be `> 0` |
| keyword_font | string | ❌ | `null` | Keyword font (display/enum/alias from Supported Fonts); falls back to body caption `font` |
| keyword_font_size | integer | ❌ | `null` | Keyword font size, must be `> 0`; falls back to body size (item `font_size`, else top-level `font_size`) |
| keyword_has_shadow | boolean | ❌ | `false` | Enable **keyword-range** shadow |
| keyword_shadow_info | object | ❌ | `null` | Keyword shadow params (same fields as `shadow_info`) |
| font_size | integer | ❌ | `null` | Per-caption normal text size; falls back to top-level `font_size` |
@@ -1292,8 +1292,8 @@ VHS
"keyword": "CapCut|captions", // [Optional] keywords separated by |
"keyword_color": "#ff7100", // [Optional] keyword color
"keyword_border_color": "#000000", // [Optional] keyword stroke color
"keyword_font": "思源中宋", // [Optional] keyword font; falls back to top-level font
"keyword_font_size": 22, // [Optional] keyword font size
"keyword_font": "思源中宋", // [Optional] keyword font; falls back to body caption font
"keyword_font_size": 22, // [Optional] keyword font size; falls back to body size
"keyword_has_shadow": true, // [Optional] enable keyword shadow
"keyword_shadow_info": { // [Optional] keyword shadow params
"shadow_alpha": 0.85,
+4 -4
View File
@@ -57,8 +57,8 @@ POST /openapi/capcut-mate/v1/add_captions
| keyword | string | ❌ | `null` | 关键词,多个用 `\|` 分隔,如 `"剪映\|字幕"` |
| keyword_color | string | ❌ | `"#ff7100"` | 关键词填充颜色(十六进制) |
| keyword_border_color | string | ❌ | `null` | 关键词描边颜色;未指定时回退使用接口级 `border_color` |
| keyword_font | string | ❌ | `null` | 关键词字体(展示名/枚举名/别名,见下方「支持的字体」);未指定则与接口级 `font` 一致 |
| keyword_font_size | integer | ❌ | `15` | 关键词字号,须 `> 0` |
| keyword_font | string | ❌ | `null` | 关键词字体(展示名/枚举名/别名,见下方「支持的字体」);未指定则与主体字幕 `font` 一致 |
| keyword_font_size | integer | ❌ | `null` | 关键词字号,须 `> 0`;未指定则与主体字幕字号一致(本条 `font_size`,否则接口级 `font_size` |
| keyword_has_shadow | boolean | ❌ | `false` | 是否启用**关键词范围**阴影 |
| keyword_shadow_info | object | ❌ | `null` | 关键词阴影参数,字段同 `shadow_info`;未提供时用默认阴影 |
| font_size | integer | ❌ | `null` | 本条字幕普通文本字号;未指定则使用接口级 `font_size` |
@@ -1305,8 +1305,8 @@ VHS
"keyword": "剪映|字幕", // 【可选】关键词,多个用 | 分隔
"keyword_color": "#ff7100", // 【可选】关键词颜色
"keyword_border_color": "#000000", // 【可选】关键词描边颜色
"keyword_font": "思源中宋", // 【可选】关键词字体;未指定则同接口级 font
"keyword_font_size": 22, // 【可选】关键词字号
"keyword_font": "思源中宋", // 【可选】关键词字体;未指定则同主体字幕 font
"keyword_font_size": 22, // 【可选】关键词字号;未指定则同主体字幕字号
"keyword_has_shadow": true, // 【可选】是否启用关键词阴影
"keyword_shadow_info": { // 【可选】关键词阴影参数
"shadow_alpha": 0.85, // 阴影不透明度 [0,1]
+1 -1
View File
@@ -45,7 +45,7 @@ class CaptionItem(BaseModel):
keyword_color: str = Field(default="#ff7100", description="关键词颜色")
keyword_border_color: Optional[str] = Field(default=None, description="关键词边框颜色")
keyword_font: Optional[str] = Field(default=None, description="关键词字体名称(展示名/枚举名/别名);未指定则与整段字幕 font 一致")
keyword_font_size: int = Field(default=15, ge=1, description="关键词字体大小")
keyword_font_size: Optional[int] = Field(default=None, ge=1, description="关键词字体大小;未指定则与本条普通文本字号一致")
keyword_has_shadow: bool = Field(default=False, description="是否启用关键词阴影")
keyword_shadow_info: Optional[ShadowInfo] = Field(default=None, description="关键词阴影参数")
font_size: int = Field(default=15, ge=1, description="文本字体大小")
+17 -9
View File
@@ -141,8 +141,8 @@ def add_captions(
"keyword": "", # 关键词(用 | 分隔多个关键词),可选参数
"keyword_color": "#457616", # 关键词颜色,可选参数
"keyword_border_color": "#000000", # 关键词边框颜色,可选参数
"keyword_font": None, # 关键词字体,可选参数
"keyword_font_size": 15, # 关键词字体大小,可选参数
"keyword_font": None, # 关键词字体,可选参数;未指定则与整段 font 一致
"keyword_font_size": None, # 关键词字体大小,可选参数;未指定则与正文 size 一致
"keyword_has_shadow": False, # 是否启用关键词阴影,可选参数
"keyword_shadow_info": None, # 关键词阴影参数,可选参数
"font_size": 15, # 文本字体大小,可选参数
@@ -435,7 +435,7 @@ def add_caption_to_draft(
keyword_color: 关键词颜色,可选
keyword_border_color: 关键词边框颜色,可选
keyword_font: 关键词字体名称,可选(未指定则与整段 font 一致)
keyword_font_size: 关键词字体大小,可选
keyword_font_size: 关键词字体大小,可选(未指定则与本条普通文本字号一致)
keyword_has_shadow: 是否启用关键词阴影,可选
keyword_shadow_info: 关键词阴影参数,可选
font_size: 文本字体大小,可选
@@ -1002,6 +1002,11 @@ def apply_keyword_highlight(
if keyword_font_json is not None:
highlight_style["font"] = dict(keyword_font_json)
else:
# 未指定 keyword_font 时显式沿用主体字幕字体,避免仅改字号时丢字体
body_font_json = _font_style_json(text_segment.font)
if body_font_json is not None:
highlight_style["font"] = dict(body_font_json)
text_segment.extra_styles.append(highlight_style)
start_pos = end_pos
@@ -1022,7 +1027,7 @@ def parse_captions_data(json_str: str) -> List[Dict[str, Any]]:
"keyword_color": "#457616", # [可选] 关键词颜色,默认"#ff7100"
"keyword_border_color": "#000000", # [可选] 关键词边框颜色,默认None
"keyword_font": None, # [可选] 关键词字体,默认与整段 font 一致
"keyword_font_size": 15, # [可选] 关键词字体大小,默认15
"keyword_font_size": None, # [可选] 关键词字体大小,默认与正文 size 一致
"keyword_has_shadow": False, # [可选] 是否启用关键词阴影,默认False
"keyword_shadow_info": None, # [可选] 关键词阴影参数,默认None
"font_size": 15, # [可选] 文本字体大小,默认15
@@ -1078,7 +1083,7 @@ def parse_captions_data(json_str: str) -> List[Dict[str, Any]]:
"keyword_color": item.get("keyword_color", "#ff7100"),
"keyword_border_color": item.get("keyword_border_color", None),
"keyword_font": item.get("keyword_font", None),
"keyword_font_size": item.get("keyword_font_size", 15),
"keyword_font_size": item.get("keyword_font_size", None),
"keyword_has_shadow": bool(item.get("keyword_has_shadow", False)),
"keyword_shadow_info": _normalize_keyword_shadow_info(item.get("keyword_shadow_info")),
"font_size": item.get("font_size", None),
@@ -1113,12 +1118,15 @@ def parse_captions_data(json_str: str) -> List[Dict[str, Any]]:
logger.error(f"the {i}th item has invalid text: {processed_item['text']}")
raise CustomException(CustomError.INVALID_CAPTION_INFO, f"the {i}th item has invalid text")
# 验证keyword_font_size参数
# 验证keyword_font_size参数;未传或非法时置为 None,应用时回退正文 size
if processed_item["keyword_font_size"] is not None and (
not isinstance(processed_item["keyword_font_size"], (int, float)) or
not isinstance(processed_item["keyword_font_size"], (int, float)) or
processed_item["keyword_font_size"] <= 0):
logger.warning(f"the {i}th item has invalid keyword_font_size: {processed_item['keyword_font_size']}, using default value 15")
processed_item["keyword_font_size"] = 15
logger.warning(
f"the {i}th item has invalid keyword_font_size: {processed_item['keyword_font_size']}, "
f"falling back to caption font size"
)
processed_item["keyword_font_size"] = None
if processed_item["keyword_font"] is not None:
if not isinstance(processed_item["keyword_font"], str) or not processed_item["keyword_font"].strip():