pycapcut 0.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyJianYingDraft/__init__.py +276 -0
- pyJianYingDraft/animation.py +140 -0
- pyJianYingDraft/assets/__init__.py +45 -0
- pyJianYingDraft/assets/draft_content_template.json +125 -0
- pyJianYingDraft/assets/draft_meta_info.json +67 -0
- pyJianYingDraft/audio_segment.py +225 -0
- pyJianYingDraft/draft_content_template.json +119 -0
- pyJianYingDraft/draft_folder.py +153 -0
- pyJianYingDraft/effect_segment.py +36 -0
- pyJianYingDraft/exceptions.py +23 -0
- pyJianYingDraft/jianying_controller.py +230 -0
- pyJianYingDraft/keyframe.py +94 -0
- pyJianYingDraft/local_materials.py +198 -0
- pyJianYingDraft/metadata/__init__.py +51 -0
- pyJianYingDraft/metadata/animation_meta.py +689 -0
- pyJianYingDraft/metadata/audio_effect_meta.py +367 -0
- pyJianYingDraft/metadata/audio_scene_effect.py +252 -0
- pyJianYingDraft/metadata/effect_meta.py +191 -0
- pyJianYingDraft/metadata/filter_meta.py +603 -0
- pyJianYingDraft/metadata/font_meta.py +341 -0
- pyJianYingDraft/metadata/mask_meta.py +15 -0
- pyJianYingDraft/metadata/speech_to_song.py +12 -0
- pyJianYingDraft/metadata/text_intro.py +152 -0
- pyJianYingDraft/metadata/text_loop.py +105 -0
- pyJianYingDraft/metadata/text_outro.py +105 -0
- pyJianYingDraft/metadata/tone_effect.py +107 -0
- pyJianYingDraft/metadata/transition_meta.py +733 -0
- pyJianYingDraft/metadata/video_character_effect.py +1913 -0
- pyJianYingDraft/metadata/video_effect_meta.py +9619 -0
- pyJianYingDraft/metadata/video_group_animation.py +131 -0
- pyJianYingDraft/metadata/video_intro.py +103 -0
- pyJianYingDraft/metadata/video_outro.py +80 -0
- pyJianYingDraft/metadata/video_scene_effect.py +7706 -0
- pyJianYingDraft/script_file.py +808 -0
- pyJianYingDraft/segment.py +256 -0
- pyJianYingDraft/template_mode.py +221 -0
- pyJianYingDraft/text_segment.py +436 -0
- pyJianYingDraft/time_util.py +99 -0
- pyJianYingDraft/track.py +138 -0
- pyJianYingDraft/util.py +58 -0
- pyJianYingDraft/video_segment.py +526 -0
- pycapcut/__init__.py +276 -0
- pycapcut/animation.py +140 -0
- pycapcut/assets/__init__.py +45 -0
- pycapcut/assets/draft_content_template.json +132 -0
- pycapcut/assets/draft_meta_info.json +73 -0
- pycapcut/audio_segment.py +225 -0
- pycapcut/draft_folder.py +153 -0
- pycapcut/effect_segment.py +36 -0
- pycapcut/exceptions.py +23 -0
- pycapcut/jianying_controller.py +230 -0
- pycapcut/keyframe.py +94 -0
- pycapcut/local_materials.py +198 -0
- pycapcut/metadata/__init__.py +51 -0
- pycapcut/metadata/audio_scene_effect.py +252 -0
- pycapcut/metadata/effect_meta.py +191 -0
- pycapcut/metadata/filter_meta.py +603 -0
- pycapcut/metadata/font_meta.py +341 -0
- pycapcut/metadata/mask_meta.py +15 -0
- pycapcut/metadata/speech_to_song.py +12 -0
- pycapcut/metadata/text_intro.py +152 -0
- pycapcut/metadata/text_loop.py +105 -0
- pycapcut/metadata/text_outro.py +105 -0
- pycapcut/metadata/tone_effect.py +107 -0
- pycapcut/metadata/transition_meta.py +733 -0
- pycapcut/metadata/video_character_effect.py +1913 -0
- pycapcut/metadata/video_group_animation.py +131 -0
- pycapcut/metadata/video_intro.py +103 -0
- pycapcut/metadata/video_outro.py +80 -0
- pycapcut/metadata/video_scene_effect.py +7706 -0
- pycapcut/script_file.py +808 -0
- pycapcut/segment.py +256 -0
- pycapcut/template_mode.py +221 -0
- pycapcut/text_segment.py +436 -0
- pycapcut/time_util.py +99 -0
- pycapcut/track.py +138 -0
- pycapcut/util.py +58 -0
- pycapcut/video_segment.py +526 -0
- pycapcut-0.0.1.dist-info/METADATA +77 -0
- pycapcut-0.0.1.dist-info/RECORD +88 -0
- pycapcut-0.0.1.dist-info/WHEEL +5 -0
- pycapcut-0.0.1.dist-info/top_level.txt +1 -0
- tools/__init__.py +17 -0
- tools/build_release.py +270 -0
- tools/code_generator.py +247 -0
- tools/extract_all.py +256 -0
- tools/extractor_base.py +132 -0
- tools/jianying_extractor.py +262 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"""元数据类型定义"""
|
|
2
|
+
|
|
3
|
+
from enum import Enum
|
|
4
|
+
|
|
5
|
+
from typing import List, Dict, Any
|
|
6
|
+
from typing import TypeVar, Optional
|
|
7
|
+
|
|
8
|
+
class EffectParam:
|
|
9
|
+
"""特效参数信息"""
|
|
10
|
+
|
|
11
|
+
name: str
|
|
12
|
+
"""参数名称"""
|
|
13
|
+
default_value: float
|
|
14
|
+
"""默认值"""
|
|
15
|
+
min_value: float
|
|
16
|
+
"""最小值"""
|
|
17
|
+
max_value: float
|
|
18
|
+
"""最大值"""
|
|
19
|
+
|
|
20
|
+
def __init__(self, name: str, default_value: float, min_value: float, max_value: float):
|
|
21
|
+
self.name = name
|
|
22
|
+
self.default_value = default_value
|
|
23
|
+
self.min_value = min_value
|
|
24
|
+
self.max_value = max_value
|
|
25
|
+
|
|
26
|
+
class EffectParamInstance(EffectParam):
|
|
27
|
+
"""特效参数实例"""
|
|
28
|
+
|
|
29
|
+
index: int
|
|
30
|
+
"""参数索引"""
|
|
31
|
+
value: float
|
|
32
|
+
"""当前值"""
|
|
33
|
+
|
|
34
|
+
def __init__(self, meta: EffectParam, index: int, value: float):
|
|
35
|
+
super().__init__(meta.name, meta.default_value, meta.min_value, meta.max_value)
|
|
36
|
+
self.index = index
|
|
37
|
+
self.value = value
|
|
38
|
+
|
|
39
|
+
def export_json(self) -> Dict[str, Any]:
|
|
40
|
+
return {
|
|
41
|
+
"default_value": self.default_value,
|
|
42
|
+
"max_value": self.max_value,
|
|
43
|
+
"min_value": self.min_value,
|
|
44
|
+
"name": self.name,
|
|
45
|
+
"parameterIndex": self.index,
|
|
46
|
+
"portIndex": 0,
|
|
47
|
+
"value": self.value
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
# 基础特效元数据, 直接用于滤镜/文字/视频特效
|
|
51
|
+
class EffectMeta:
|
|
52
|
+
"""特效元数据, 直接用于滤镜/文字/视频特效"""
|
|
53
|
+
|
|
54
|
+
name: str
|
|
55
|
+
"""效果名称"""
|
|
56
|
+
is_vip: bool
|
|
57
|
+
"""是否为VIP特权"""
|
|
58
|
+
|
|
59
|
+
resource_id: str
|
|
60
|
+
"""资源ID"""
|
|
61
|
+
effect_id: str
|
|
62
|
+
"""效果ID"""
|
|
63
|
+
md5: str
|
|
64
|
+
|
|
65
|
+
params: List[EffectParam]
|
|
66
|
+
"""效果的参数信息"""
|
|
67
|
+
|
|
68
|
+
def __init__(self, name: str, is_vip: bool, resource_id: str, effect_id: str, md5: str, params: List[EffectParam] = []):
|
|
69
|
+
self.name = name
|
|
70
|
+
self.is_vip = is_vip
|
|
71
|
+
self.resource_id = resource_id
|
|
72
|
+
self.effect_id = effect_id
|
|
73
|
+
self.md5 = md5
|
|
74
|
+
self.params = params
|
|
75
|
+
|
|
76
|
+
def parse_params(self, params: Optional[List[Optional[float]]]) -> List[EffectParamInstance]:
|
|
77
|
+
"""解析参数列表(范围0~100), 返回参数实例列表"""
|
|
78
|
+
ret: List[EffectParamInstance] = []
|
|
79
|
+
|
|
80
|
+
if params is None: params = []
|
|
81
|
+
for i, param in enumerate(self.params):
|
|
82
|
+
val = param.default_value
|
|
83
|
+
if i < len(params):
|
|
84
|
+
input_v = params[i]
|
|
85
|
+
if input_v is not None:
|
|
86
|
+
if input_v < 0 or input_v > 100:
|
|
87
|
+
raise ValueError("Invalid parameter value %f within %s" % (input_v, str(param)))
|
|
88
|
+
val = param.min_value + (param.max_value - param.min_value) * input_v / 100.0 # 从0~100映射到实际值
|
|
89
|
+
ret.append(EffectParamInstance(param, i, val))
|
|
90
|
+
return ret
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
EffectEnumSubclass = TypeVar("EffectEnumSubclass", bound="EffectEnum")
|
|
94
|
+
|
|
95
|
+
class EffectEnum(Enum):
|
|
96
|
+
"""特效枚举基类, 提供一个`from_name`方法用于根据名称获取特效元数据"""
|
|
97
|
+
|
|
98
|
+
@classmethod
|
|
99
|
+
def from_name(cls: "type[EffectEnumSubclass]", name: str) -> EffectEnumSubclass:
|
|
100
|
+
"""根据名称获取特效元数据, 忽略大小写、空格和下划线
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
name (str): 特效名称
|
|
104
|
+
|
|
105
|
+
Raises:
|
|
106
|
+
`ValueError`: 特效名称不存在
|
|
107
|
+
"""
|
|
108
|
+
name = name.lower().replace(" ", "").replace("_", "")
|
|
109
|
+
for effect in cls:
|
|
110
|
+
if effect.name.lower().replace(" ", "").replace("_", "") == name:
|
|
111
|
+
return effect
|
|
112
|
+
raise ValueError(f"Effect named '{name}' not found")
|
|
113
|
+
|
|
114
|
+
# 动画元数据
|
|
115
|
+
class AnimationMeta:
|
|
116
|
+
"""动画元数据, 用于视频/文字片段的入场/出场/组合动画"""
|
|
117
|
+
|
|
118
|
+
title: str
|
|
119
|
+
is_vip: bool
|
|
120
|
+
duration: int
|
|
121
|
+
"""效果默认时长, 单位为微秒"""
|
|
122
|
+
|
|
123
|
+
resource_id: str
|
|
124
|
+
effect_id: str
|
|
125
|
+
md5: str
|
|
126
|
+
|
|
127
|
+
def __init__(self, title: str, is_vip: bool, duration: float, resource_id: str, effect_id: str, md5: str):
|
|
128
|
+
self.title = title
|
|
129
|
+
self.is_vip = is_vip
|
|
130
|
+
self.duration = int(round(duration * 1e6))
|
|
131
|
+
self.resource_id = resource_id
|
|
132
|
+
self.effect_id = effect_id
|
|
133
|
+
self.md5 = md5
|
|
134
|
+
|
|
135
|
+
# 蒙版元数据
|
|
136
|
+
class MaskMeta:
|
|
137
|
+
"""蒙版元数据"""
|
|
138
|
+
|
|
139
|
+
name: str
|
|
140
|
+
"""转场名称"""
|
|
141
|
+
|
|
142
|
+
resource_type: str
|
|
143
|
+
"""资源类型, 与蒙版形状相关"""
|
|
144
|
+
|
|
145
|
+
resource_id: str
|
|
146
|
+
"""资源ID"""
|
|
147
|
+
effect_id: str
|
|
148
|
+
"""效果ID"""
|
|
149
|
+
md5: str
|
|
150
|
+
|
|
151
|
+
default_aspect_ratio: float
|
|
152
|
+
"""默认宽高比(宽高都是相对素材的比例)"""
|
|
153
|
+
|
|
154
|
+
def __init__(self, name: str, resource_type: str, resource_id: str, effect_id: str, md5: str, default_aspect_ratio: float):
|
|
155
|
+
self.name = name
|
|
156
|
+
self.resource_type = resource_type
|
|
157
|
+
self.resource_id = resource_id
|
|
158
|
+
self.effect_id = effect_id
|
|
159
|
+
self.md5 = md5
|
|
160
|
+
|
|
161
|
+
self.default_aspect_ratio = default_aspect_ratio
|
|
162
|
+
|
|
163
|
+
# 转场元数据
|
|
164
|
+
class TransitionMeta:
|
|
165
|
+
"""转场元数据"""
|
|
166
|
+
|
|
167
|
+
name: str
|
|
168
|
+
"""转场名称"""
|
|
169
|
+
is_vip: bool
|
|
170
|
+
"""是否为VIP特权"""
|
|
171
|
+
|
|
172
|
+
resource_id: str
|
|
173
|
+
"""资源ID"""
|
|
174
|
+
effect_id: str
|
|
175
|
+
"""效果ID"""
|
|
176
|
+
md5: str
|
|
177
|
+
|
|
178
|
+
default_duration: int
|
|
179
|
+
"""默认持续时间, 单位为微秒"""
|
|
180
|
+
is_overlap: bool
|
|
181
|
+
"""是否允许重叠(?)"""
|
|
182
|
+
|
|
183
|
+
def __init__(self, name: str, is_vip: bool, resource_id: str, effect_id: str, md5: str, default_duration: float, is_overlap: bool):
|
|
184
|
+
self.name = name
|
|
185
|
+
self.is_vip = is_vip
|
|
186
|
+
self.resource_id = resource_id
|
|
187
|
+
self.effect_id = effect_id
|
|
188
|
+
self.md5 = md5
|
|
189
|
+
|
|
190
|
+
self.default_duration = int(round(default_duration * 1e6))
|
|
191
|
+
self.is_overlap = is_overlap
|