Files
CapCutAPI/pyJianYingDraft/metadata/effect_meta.py

110 lines
3.4 KiB
Python

from enum import Enum
from typing import List, Dict, Any
from typing import TypeVar, Optional
class Effect_param:
"""特效参数信息"""
name: str
"""参数名称"""
default_value: float
"""默认值"""
min_value: float
"""最小值"""
max_value: float
"""最大值"""
def __init__(self, name: str, default_value: float, min_value: float, max_value: float):
self.name = name
self.default_value = default_value
self.min_value = min_value
self.max_value = max_value
class Effect_param_instance(Effect_param):
"""特效参数实例"""
index: int
"""参数索引"""
value: float
"""当前值"""
def __init__(self, meta: Effect_param, index: int, value: float):
super().__init__(meta.name, meta.default_value, meta.min_value, meta.max_value)
self.index = index
self.value = value
def export_json(self) -> Dict[str, Any]:
return {
"default_value": self.default_value,
"max_value": self.max_value,
"min_value": self.min_value,
"name": self.name,
"parameterIndex": self.index,
"portIndex": 0,
"value": self.value
}
class Effect_meta:
"""特效元数据"""
name: str
"""效果名称"""
is_vip: bool
"""是否为VIP特权"""
resource_id: str
"""资源ID"""
effect_id: str
"""效果ID"""
md5: str
params: List[Effect_param]
"""效果的参数信息"""
def __init__(self, name: str, is_vip: bool, resource_id: str, effect_id: str, md5: str, params: List[Effect_param] = []):
self.name = name
self.is_vip = is_vip
self.resource_id = resource_id
self.effect_id = effect_id
self.md5 = md5
self.params = params
def parse_params(self, params: Optional[List[Optional[float]]]) -> List[Effect_param_instance]:
"""解析参数列表(范围0~100), 返回参数实例列表"""
ret: List[Effect_param_instance] = []
if params is None: params = []
for i, param in enumerate(self.params):
val = param.default_value
if i < len(params):
input_v = params[i]
if input_v is not None:
if input_v < 0 or input_v > 100:
raise ValueError("Invalid parameter value %f within %s" % (input_v, str(param)))
val = param.min_value + (param.max_value - param.min_value) * input_v / 100.0 # 从0~100映射到实际值
ret.append(Effect_param_instance(param, i, val))
return ret
Effect_enum_subclass = TypeVar("Effect_enum_subclass", bound="Effect_enum")
class Effect_enum(Enum):
"""特效枚举基类, 提供一个`from_name`方法用于根据名称获取特效元数据"""
@classmethod
def from_name(cls: "type[Effect_enum_subclass]", name: str) -> Effect_enum_subclass:
"""根据名称获取特效元数据, 忽略大小写、空格和下划线
Args:
name (str): 特效名称
Raises:
`ValueError`: 特效名称不存在
"""
name = name.lower().replace(" ", "").replace("_", "")
for effect in cls:
if effect.name.lower().replace(" ", "").replace("_", "") == name:
return effect
raise ValueError(f"Effect named '{name}' not found")