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.
Files changed (88) hide show
  1. pyJianYingDraft/__init__.py +276 -0
  2. pyJianYingDraft/animation.py +140 -0
  3. pyJianYingDraft/assets/__init__.py +45 -0
  4. pyJianYingDraft/assets/draft_content_template.json +125 -0
  5. pyJianYingDraft/assets/draft_meta_info.json +67 -0
  6. pyJianYingDraft/audio_segment.py +225 -0
  7. pyJianYingDraft/draft_content_template.json +119 -0
  8. pyJianYingDraft/draft_folder.py +153 -0
  9. pyJianYingDraft/effect_segment.py +36 -0
  10. pyJianYingDraft/exceptions.py +23 -0
  11. pyJianYingDraft/jianying_controller.py +230 -0
  12. pyJianYingDraft/keyframe.py +94 -0
  13. pyJianYingDraft/local_materials.py +198 -0
  14. pyJianYingDraft/metadata/__init__.py +51 -0
  15. pyJianYingDraft/metadata/animation_meta.py +689 -0
  16. pyJianYingDraft/metadata/audio_effect_meta.py +367 -0
  17. pyJianYingDraft/metadata/audio_scene_effect.py +252 -0
  18. pyJianYingDraft/metadata/effect_meta.py +191 -0
  19. pyJianYingDraft/metadata/filter_meta.py +603 -0
  20. pyJianYingDraft/metadata/font_meta.py +341 -0
  21. pyJianYingDraft/metadata/mask_meta.py +15 -0
  22. pyJianYingDraft/metadata/speech_to_song.py +12 -0
  23. pyJianYingDraft/metadata/text_intro.py +152 -0
  24. pyJianYingDraft/metadata/text_loop.py +105 -0
  25. pyJianYingDraft/metadata/text_outro.py +105 -0
  26. pyJianYingDraft/metadata/tone_effect.py +107 -0
  27. pyJianYingDraft/metadata/transition_meta.py +733 -0
  28. pyJianYingDraft/metadata/video_character_effect.py +1913 -0
  29. pyJianYingDraft/metadata/video_effect_meta.py +9619 -0
  30. pyJianYingDraft/metadata/video_group_animation.py +131 -0
  31. pyJianYingDraft/metadata/video_intro.py +103 -0
  32. pyJianYingDraft/metadata/video_outro.py +80 -0
  33. pyJianYingDraft/metadata/video_scene_effect.py +7706 -0
  34. pyJianYingDraft/script_file.py +808 -0
  35. pyJianYingDraft/segment.py +256 -0
  36. pyJianYingDraft/template_mode.py +221 -0
  37. pyJianYingDraft/text_segment.py +436 -0
  38. pyJianYingDraft/time_util.py +99 -0
  39. pyJianYingDraft/track.py +138 -0
  40. pyJianYingDraft/util.py +58 -0
  41. pyJianYingDraft/video_segment.py +526 -0
  42. pycapcut/__init__.py +276 -0
  43. pycapcut/animation.py +140 -0
  44. pycapcut/assets/__init__.py +45 -0
  45. pycapcut/assets/draft_content_template.json +132 -0
  46. pycapcut/assets/draft_meta_info.json +73 -0
  47. pycapcut/audio_segment.py +225 -0
  48. pycapcut/draft_folder.py +153 -0
  49. pycapcut/effect_segment.py +36 -0
  50. pycapcut/exceptions.py +23 -0
  51. pycapcut/jianying_controller.py +230 -0
  52. pycapcut/keyframe.py +94 -0
  53. pycapcut/local_materials.py +198 -0
  54. pycapcut/metadata/__init__.py +51 -0
  55. pycapcut/metadata/audio_scene_effect.py +252 -0
  56. pycapcut/metadata/effect_meta.py +191 -0
  57. pycapcut/metadata/filter_meta.py +603 -0
  58. pycapcut/metadata/font_meta.py +341 -0
  59. pycapcut/metadata/mask_meta.py +15 -0
  60. pycapcut/metadata/speech_to_song.py +12 -0
  61. pycapcut/metadata/text_intro.py +152 -0
  62. pycapcut/metadata/text_loop.py +105 -0
  63. pycapcut/metadata/text_outro.py +105 -0
  64. pycapcut/metadata/tone_effect.py +107 -0
  65. pycapcut/metadata/transition_meta.py +733 -0
  66. pycapcut/metadata/video_character_effect.py +1913 -0
  67. pycapcut/metadata/video_group_animation.py +131 -0
  68. pycapcut/metadata/video_intro.py +103 -0
  69. pycapcut/metadata/video_outro.py +80 -0
  70. pycapcut/metadata/video_scene_effect.py +7706 -0
  71. pycapcut/script_file.py +808 -0
  72. pycapcut/segment.py +256 -0
  73. pycapcut/template_mode.py +221 -0
  74. pycapcut/text_segment.py +436 -0
  75. pycapcut/time_util.py +99 -0
  76. pycapcut/track.py +138 -0
  77. pycapcut/util.py +58 -0
  78. pycapcut/video_segment.py +526 -0
  79. pycapcut-0.0.1.dist-info/METADATA +77 -0
  80. pycapcut-0.0.1.dist-info/RECORD +88 -0
  81. pycapcut-0.0.1.dist-info/WHEEL +5 -0
  82. pycapcut-0.0.1.dist-info/top_level.txt +1 -0
  83. tools/__init__.py +17 -0
  84. tools/build_release.py +270 -0
  85. tools/code_generator.py +247 -0
  86. tools/extract_all.py +256 -0
  87. tools/extractor_base.py +132 -0
  88. 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