@lalalic/markcut 1.0.0

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 (98) hide show
  1. package/.env.example +27 -0
  2. package/.github/user-steer.md +9 -0
  3. package/.vscode/settings.json +3 -0
  4. package/AGENTS.md +271 -0
  5. package/README.md +219 -0
  6. package/SKILL.md +209 -0
  7. package/docs/dynamic-components.md +191 -0
  8. package/docs/edit-mode.md +220 -0
  9. package/docs/json-descriptive.md +539 -0
  10. package/docs/label-mode.md +110 -0
  11. package/docs/markdown-descriptive.md +751 -0
  12. package/docs/templates.md +52 -0
  13. package/package.json +64 -0
  14. package/remotion.config.ts +5 -0
  15. package/scripts/artlist-dl.mjs +190 -0
  16. package/scripts/build-pipeline.sh +19 -0
  17. package/scripts/build-player.sh +20 -0
  18. package/src/Root.tsx +55 -0
  19. package/src/config.mjs +88 -0
  20. package/src/context/EventContext.tsx +168 -0
  21. package/src/context/index.tsx +42 -0
  22. package/src/descriptive/compiler.test.ts +1135 -0
  23. package/src/descriptive/compiler.ts +1230 -0
  24. package/src/descriptive/dsl.ts +455 -0
  25. package/src/descriptive/markdown.test.ts +866 -0
  26. package/src/descriptive/markdown.ts +674 -0
  27. package/src/descriptive/resolve.test.ts +951 -0
  28. package/src/descriptive/resolve.ts +891 -0
  29. package/src/entry.tsx +163 -0
  30. package/src/index.ts +4 -0
  31. package/src/player/browser.tsx +356 -0
  32. package/src/player/bundle/player.js +60259 -0
  33. package/src/player/bundler.mjs +269 -0
  34. package/src/player/label-server.mjs +599 -0
  35. package/src/player/pipeline.mjs +11123 -0
  36. package/src/player/pipeline.ts +117 -0
  37. package/src/player/server-shared.mjs +144 -0
  38. package/src/player/server.mjs +1006 -0
  39. package/src/render/cli-tools.ts +177 -0
  40. package/src/render/cli.mjs +628 -0
  41. package/src/schema/index.ts +259 -0
  42. package/src/types/Audio.tsx +56 -0
  43. package/src/types/Component.tsx +135 -0
  44. package/src/types/Effect.tsx +88 -0
  45. package/src/types/Folder.tsx +180 -0
  46. package/src/types/FrameSyncStyle.tsx +51 -0
  47. package/src/types/Image.tsx +51 -0
  48. package/src/types/Include.tsx +394 -0
  49. package/src/types/Map.tsx +252 -0
  50. package/src/types/Rhythm.tsx +58 -0
  51. package/src/types/Scene.tsx +42 -0
  52. package/src/types/Subtitle.tsx +218 -0
  53. package/src/types/Video.tsx +70 -0
  54. package/src/types/keyframes.ts +454 -0
  55. package/src/utils/__tests__/vtt.test.ts +129 -0
  56. package/src/utils/index.ts +168 -0
  57. package/src/utils/tween.ts +118 -0
  58. package/src/vision/cli.mjs +1187 -0
  59. package/src/vision/vision_prompts.md +67 -0
  60. package/tests/dsl.test.ts +317 -0
  61. package/tests/fixtures/audio.json +25 -0
  62. package/tests/fixtures/basic.json +27 -0
  63. package/tests/fixtures/component-all.json +38 -0
  64. package/tests/fixtures/components.json +38 -0
  65. package/tests/fixtures/effects.json +64 -0
  66. package/tests/fixtures/full.json +51 -0
  67. package/tests/fixtures/map.json +23 -0
  68. package/tests/fixtures/md/all-nodes.md +28 -0
  69. package/tests/fixtures/md/basic.md +6 -0
  70. package/tests/fixtures/md/component-imports.md +20 -0
  71. package/tests/fixtures/md/edge-cases.md +33 -0
  72. package/tests/fixtures/md/effects.md +17 -0
  73. package/tests/fixtures/md/frontmatter.md +20 -0
  74. package/tests/fixtures/md/full-feature.md +58 -0
  75. package/tests/fixtures/md/imports-block.md +19 -0
  76. package/tests/fixtures/md/include-main.md +11 -0
  77. package/tests/fixtures/md/include-sub.md +25 -0
  78. package/tests/fixtures/md/jsx-code-fence.md +21 -0
  79. package/tests/fixtures/md/map.md +11 -0
  80. package/tests/fixtures/md/nested-scenes.md +25 -0
  81. package/tests/fixtures/md/rhythm.md +17 -0
  82. package/tests/fixtures/md/scenes.md +16 -0
  83. package/tests/fixtures/md/tween.md +11 -0
  84. package/tests/fixtures/md/vars-test.md +6 -0
  85. package/tests/fixtures/scenes.json +40 -0
  86. package/tests/fixtures/subtitle.json +59 -0
  87. package/tests/fixtures/subvideo.json +59 -0
  88. package/tests/fixtures/templates/courseware.md +351 -0
  89. package/tests/fixtures/tween-visual.json +28 -0
  90. package/tests/fixtures/video-series.json +54 -0
  91. package/tests/md-descriptive.test.ts +742 -0
  92. package/tests/render.test.ts +985 -0
  93. package/tests/schema.test.ts +68 -0
  94. package/tests/server.test.ts +308 -0
  95. package/tests/utils.ts +391 -0
  96. package/tests/vitest.config.ts +18 -0
  97. package/tests/vitest.integration.config.ts +16 -0
  98. package/tsconfig.json +20 -0
@@ -0,0 +1,351 @@
1
+ ---
2
+ title: Introduction to AI
3
+ description: A beginner's course on artificial intelligence
4
+ version: 1.0
5
+ ---
6
+ # video
7
+ layout:series subtitle:{fontSize:"20px"} width:1920 height:1080 fps:30 tts:"edge-tts --voice 'en-US-GuyNeural' --text '{input}' --write-media '{output}'"
8
+ ~~~js imports
9
+ import ReactMarkdown from 'react-markdown';
10
+ import remarkGfm from 'remark-gfm'
11
+
12
+ export function Slide({ current = 0, children }) {
13
+ let idx = 1;
14
+ return (
15
+ <div className="slide">
16
+ <ReactMarkdown remarkPlugins={[remarkGfm]}
17
+ components={{
18
+ li: ({ children }) => {
19
+ const highlight = idx === current; idx++;
20
+ return <li className={highlight ? 'highlight' : ''}>{children}</li>;
21
+ }
22
+ }}>{children}</ReactMarkdown>
23
+ </div>
24
+ )
25
+ }
26
+ ~~~
27
+ ~~~css stylesheet
28
+ /* Container sizing for a perfect 16:9 widescreen presentation slide */
29
+ .slide {
30
+ color: #f5f5f7;
31
+ padding: 40px;
32
+ display: flex;
33
+ flex-direction: column;
34
+ justify-content: center;
35
+ align-items: flex-start;
36
+ font-family: 'Helvetica Neue', Arial, sans-serif;
37
+ font-size: 30px;
38
+
39
+ /* Typography rules optimized for visibility from a distance */
40
+ h1 {
41
+ font-size: 2.8em;
42
+ color: #61dafb;
43
+ margin-top: 0;
44
+ margin-bottom: 20px;
45
+ line-height: 1.2;
46
+ }
47
+
48
+ h2 {
49
+ font-size: 2em;
50
+ color: #a8dadc;
51
+ margin-top: 0;
52
+ margin-bottom: 15px;
53
+ }
54
+
55
+ p {
56
+ font-size: 1.3em;
57
+ line-height: 1.6;
58
+ color: #e0e0e6;
59
+ margin-bottom: 15px;
60
+ }
61
+
62
+ /* List styling specific to presentation bullet points */
63
+ ul, ol {
64
+ margin-left: 25px;
65
+ margin-bottom: 20px;
66
+ }
67
+
68
+ li {
69
+ font-size: 1.3em;
70
+ line-height: 1.8;
71
+ margin-bottom: 10px;
72
+ color: #e0e0e6;
73
+ list-style-type: none; /* Remove default bullets for custom styling */
74
+
75
+ /* Highlighted list item for event-driven bullet reveal */
76
+ &.highlight {
77
+ color: red;
78
+ font-weight: 700;
79
+ }
80
+ }
81
+
82
+ /* Code block handling inside slides */
83
+ pre {
84
+ background-color: #2d2d34;
85
+ padding: 15px;
86
+ border-radius: 6px;
87
+ width: 100%;
88
+ box-sizing: border-box;
89
+ overflow-x: auto;
90
+ }
91
+
92
+ code {
93
+ font-family: 'Courier New', Courier, monospace;
94
+ font-size: 1.1em;
95
+ color: #ffb703;
96
+ }
97
+
98
+ table {
99
+ width: 100%;
100
+ border-collapse: collapse;
101
+ margin-bottom: 20px;
102
+
103
+ th, td {
104
+ border: 1px solid #444;
105
+ padding: 10px;
106
+ text-align: left;
107
+ }
108
+ }
109
+ }
110
+
111
+ ~~~
112
+
113
+ ## Hook
114
+ - image duration:3
115
+ prompt:"On a barren hilltop, with desert in the distance and a ruined city skyline. An animated Minion shakes its head and says to the wallet robot, 'Look at this world — it's all AI's fault'. /${variant}"
116
+
117
+ ## Slides
118
+ layout:transitionSeries transition:fade(0.5)
119
+
120
+ ### TitleSlide
121
+ layout:parallel
122
+ - script "Welcome to the Introduction to Machine Learning course. Today we'll dive into the three major paradigms of machine learning and understand the core ideas of each method through concrete examples. Let's get started."
123
+ zh:"欢迎来到机器学习入门课程。今天我们将深入探讨机器学习的三大范式,通过具体案例理解每种方法的核心思想。让我们开始吧。"
124
+ - component isBackground:true jsx:"<Slide>{source}</Slide>"
125
+ ~~~md source
126
+ # Introduction to Machine Learning
127
+
128
+ Introduction to Machine Learning
129
+
130
+ **Dr. AI** | AI Introductory Course
131
+ ~~~
132
+ ~~~md zh-source
133
+ # 机器学习导论
134
+
135
+ 机器学习导论
136
+
137
+ **AI博士** | AI入门课程
138
+ ~~~
139
+
140
+ ### WhatIsML
141
+ layout:transitionSeries transition:fade(0.5)
142
+ - component id:slide1 isBackground:true jsx:"<Slide current={current}>{source}</Slide>"
143
+ ~~~md source
144
+ ## What is Machine Learning?
145
+
146
+ - 🤖 **Learning patterns from data** — No manual rules needed
147
+ - 📊 **Data-driven** — Automatically summarize patterns from samples
148
+ - 🔄 **Continuous improvement** — More data = Better performance
149
+
150
+ > Traditional programming: Rules + Data = Answers
151
+ > Machine Learning: Answers + Data = Rules
152
+ ~~~
153
+ ~~~md zh-source
154
+ ## 什么是机器学习?
155
+
156
+ - 🤖 **从数据中学习模式** — 无需人工规则
157
+ - 📊 **数据驱动** — 自动从样本中总结规律
158
+ - 🔄 **持续改进** — 更多数据 = 更好性能
159
+
160
+ > 传统编程:规则 + 数据 = 答案
161
+ > 机器学习:答案 + 数据 = 规则
162
+ ~~~
163
+ - script "In machine learning, we typically split data into training, validation, and test sets. The training set is used for model learning, the validation set for tuning parameters, and the test set for evaluating final performance. This way, we ensure the model performs well not only on known data but also maintains accuracy on unseen data." on:(start, slide1.current=1)
164
+ zh:"在机器学习中,我们通常将数据分为训练集、验证集和测试集。训练集用于模型学习,验证集用于调参,测试集用于评估最终性能。这样,我们确保模型不仅在已知数据上表现良好,也能在未知数据上保持准确性。"
165
+
166
+ - script "The core goal of machine learning is to enable computers to extract useful information from data and make reasonable predictions or decisions when faced with new situations. This capability is widely applied across various fields, from image recognition to natural language processing, recommendation systems, and autonomous driving." on:(start, slide1.current=2)
167
+ zh:"机器学习的核心目标是让计算机能够从数据中提取有用信息,并在面对新情况时做出合理的预测或决策。这一能力广泛应用于各个领域,从图像识别到自然语言处理,从推荐系统到自动驾驶。"
168
+
169
+ ### SupervisedLearning
170
+ layout:parallel
171
+ - component isBackground:true jsx:"<Slide>{source}</Slide>"
172
+ ~~~md source
173
+ ## Supervised Learning
174
+
175
+ Supervised Learning
176
+
177
+ - 🏷️ **Labeled data training** — Each sample has a correct answer
178
+ - 🔗 **Input → Output mapping** — Learning the function from features to labels
179
+ - 📋 **Typical Applications**:
180
+
181
+ | Application | Input | Output |
182
+ |-------------|-------|--------|
183
+ | Spam Detection | Email content | Spam / Normal |
184
+ | House Price Prediction | House features | Price |
185
+ | Medical Diagnosis | Medical images | Disease category |
186
+
187
+ - ⚡ **Core Algorithms**: Linear Regression, Decision Trees, SVM, Neural Networks
188
+ ~~~
189
+ ~~~md zh-source
190
+ ## 监督学习
191
+
192
+ 监督学习
193
+
194
+ - 🏷️ **有标签数据训练** — 每个样本都有正确答案
195
+ - 🔗 **输入→输出映射** — 学习从特征到标签的函数
196
+ - 📋 **典型应用**:
197
+
198
+ | 应用 | 输入 | 输出 |
199
+ |------|------|------|
200
+ | 垃圾邮件检测 | 邮件内容 | 垃圾/正常 |
201
+ | 房价预测 | 房屋特征 | 价格 |
202
+ | 医学诊断 | 医学影像 | 疾病类别 |
203
+
204
+ - ⚡ **核心算法**: 线性回归、决策树、SVM、神经网络
205
+ ~~~
206
+ - script "Supervised learning is the most commonly used paradigm in machine learning. Its core is training with labeled data — each training sample comes with a correct answer. The model learns a mapping function from input features to output labels. For example, in spam detection, the input is email content and the output is 'spam' or 'not spam'. After training on tens of thousands of labeled samples, the model can accurately classify never-before-seen emails. Supervised learning is also widely used in image recognition, housing price prediction, and medical diagnosis."
207
+ zh:"监督学习是机器学习中最常用的范式。其核心是使用有标签数据进行训练——每个训练样本都有正确答案。模型学习从输入特征到输出标签的映射函数。例如,在垃圾邮件检测中,输入是邮件内容,输出是'垃圾邮件'或'正常邮件'。经过数万有标签样本的训练后,模型可以准确分类从未见过的邮件。监督学习还广泛应用于图像识别、房价预测和医学诊断等领域。"
208
+
209
+ ### UnsupervisedLearning
210
+ layout:parallel
211
+ - script "Unsupervised learning is completely different — it deals with unlabeled data, and the model autonomously explores structures and patterns in the data. A classic example is customer segmentation: e-commerce platforms analyze users' purchase history and browsing behavior to automatically group users into categories like 'price-sensitive' or 'brand-loyal' without predefining these groups. Unsupervised learning is also widely used in anomaly detection, such as identifying credit card fraud, and collaborative filtering in recommendation systems."
212
+ zh:"无监督学习则完全不同——它处理的是无标签数据,模型自主探索数据中的结构和模式。一个典型例子是客户分群:电商平台分析用户的购买历史和浏览行为,自动将用户分为'价格敏感型'或'品牌忠诚型'等类别,而无需预先定义这些群体。无监督学习还广泛应用于异常检测(如识别信用卡欺诈)和推荐系统中的协同过滤。"
213
+ - component isBackground:true jsx:"<Slide>{source}</Slide>"
214
+ ~~~md source
215
+ ## Unsupervised Learning
216
+
217
+ Unsupervised Learning
218
+
219
+ - 🧩 **Unlabeled data** — Let the data speak for itself
220
+ - 🔍 **Discover hidden structures** — Patterns, groups, association rules
221
+ - 📋 **Typical Applications**:
222
+
223
+ | Application | Method | Purpose |
224
+ |-------------|--------|---------|
225
+ | Customer Segmentation | K-Means Clustering | Market Segmentation |
226
+ | Anomaly Detection | Isolation Forest | Fraud Detection |
227
+ | Recommendation Systems | Collaborative Filtering | Personalized Recommendations |
228
+
229
+ - 💡 **Core Idea**: Finding order from chaos
230
+ ~~~
231
+ ~~~md zh-source
232
+ ## 无监督学习
233
+
234
+ 无监督学习
235
+
236
+ - 🧩 **无标签数据** — 让数据自己说话
237
+ - 🔍 **发现隐藏结构** — 模式、群组、关联规则
238
+ - 📋 **典型应用**:
239
+
240
+ | 应用 | 方法 | 目的 |
241
+ |------|------|------|
242
+ | 客户分群 | K-Means聚类 | 市场细分 |
243
+ | 异常检测 | 孤立森林 | 欺诈检测 |
244
+ | 推荐系统 | 协同过滤 | 个性化推荐 |
245
+
246
+ - 💡 **核心思想**: 从混沌中找到秩序
247
+ ~~~
248
+
249
+ ### ReinforcementLearning
250
+ layout:parallel
251
+ - script "Reinforcement learning is a method of learning through trial and error. An agent explores its environment, takes actions, and receives rewards or penalties as feedback. Through continuous trial and error, the agent learns which actions yield the greatest cumulative reward. AlphaGo defeating Go world champion Lee Sedol was a milestone for reinforcement learning. During training, AlphaGo played millions of games against itself, receiving feedback at every move, and ultimately surpassed human top-level play. Reinforcement learning is also widely used in robot control, autonomous driving, and game AI."
252
+ zh:"强化学习是一种通过试错来学习的方法。智能体探索环境、采取行动,并通过奖励或惩罚获得反馈。通过不断试错,智能体学会哪些行动能获得最大累计奖励。AlphaGo击败围棋世界冠军李世石是强化学习的里程碑。在训练过程中,AlphaGo与自己下了数百万盘棋,每一步都获得反馈,最终超越了人类顶尖水平。强化学习还广泛应用于机器人控制、自动驾驶和游戏AI等领域。"
253
+ - component isBackground:true jsx:"<Slide>{source}</Slide>"
254
+ ~~~md source
255
+ ## Reinforcement Learning
256
+
257
+ Reinforcement Learning
258
+
259
+ - 🎮 **Agent + Environment + Reward** — The Trinity
260
+ - 🔄 **Trial-and-error learning** — Continuously optimize strategy from feedback
261
+ - 🏆 **Milestone Achievements**:
262
+
263
+ | Achievement | Year | Significance |
264
+ |-------------|------|-------------|
265
+ | AlphaGo beats Lee Sedol | 2016 | AI masters Go |
266
+ | OpenAI Five beats Dota 2 pros | 2019 | Team collaboration |
267
+ | ChatGPT RL alignment | 2022 | Human preference learning |
268
+
269
+ - 🔬 **Core Elements**: Policy network, value function, reward signal
270
+ ~~~
271
+ ~~~md zh-source
272
+ ## 强化学习
273
+
274
+ 强化学习
275
+
276
+ - 🎮 **智能体+环境+奖励** — 三位一体
277
+ - 🔄 **试错学习** — 从反馈中不断优化策略
278
+ - 🏆 **里程碑成就**:
279
+
280
+ | 成就 | 年份 | 意义 |
281
+ |------|------|------|
282
+ | AlphaGo击败李世石 | 2016 | AI掌握围棋 |
283
+ | OpenAI Five击败Dota 2职业选手 | 2019 | 团队协作 |
284
+ | ChatGPT RL对齐 | 2022 | 人类偏好学习 |
285
+
286
+ - 🔬 **核心要素**: 策略网络、价值函数、奖励信号
287
+ ~~~
288
+ - video start:5 volume:0
289
+ prompt:"animation of AI playing a strategy board game like Go or chess, pieces moving on board, strategic gameplay visualization, cinematic lighting"
290
+
291
+ ### Summary
292
+ layout:parallel
293
+ - script "Let's review what we covered today. Supervised learning is suitable for prediction tasks with labeled data, from spam detection to medical diagnosis. Unsupervised learning excels at discovering hidden patterns in data, playing a key role in customer segmentation and anomaly detection. Reinforcement learning learns optimal policies through interaction with the environment and is the core technology behind game AI and robot control. Each of the three paradigms has its own strengths — choosing the right method depends on your data conditions and problem type. Thank you for watching this course!"
294
+ zh:"让我们回顾今天的内容。监督学习适用于有标签数据的预测任务,从垃圾邮件检测到医学诊断。无监督学习擅长发现数据中的隐藏模式,在客户分群和异常检测中发挥关键作用。强化学习通过与环境的交互学习最优策略,是游戏AI和机器人控制的核心技术。三种范式各有优势——选择合适的方法取决于你的数据条件和问题类型。感谢观看本课程!"
295
+ - component isBackground:true jsx:"<Slide>{source}</Slide>"
296
+ ~~~md source
297
+ ## Summary
298
+
299
+ Summary
300
+
301
+ ### Three Paradigms Comparison
302
+
303
+ | Paradigm | Data Requirement | Typical Task | Representative Algorithm |
304
+ |----------|-----------------|--------------|--------------------------|
305
+ | 🔵 Supervised Learning | Labeled data | Classification / Regression | Decision Trees, SVM |
306
+ | 🟢 Unsupervised Learning | Unlabeled data | Clustering / Dimensionality Reduction | K-Means, PCA |
307
+ | 🟠 Reinforcement Learning | Environment interaction | Decision / Control | Q-Learning, PPO |
308
+
309
+ ### Selection Guide
310
+
311
+ - Have labeled data? → **Supervised Learning**
312
+ - Want to discover patterns? → **Unsupervised Learning**
313
+ - Need autonomous decisions? → **Reinforcement Learning**
314
+ ~~~
315
+ ~~~md zh-source
316
+ ## 总结
317
+
318
+ 总结
319
+
320
+ ### 三种范式对比
321
+
322
+ | 范式 | 数据需求 | 典型任务 | 代表算法 |
323
+ |------|----------|----------|----------|
324
+ | 🔵 监督学习 | 有标签数据 | 分类/回归 | 决策树、SVM |
325
+ | 🟢 无监督学习 | 无标签数据 | 聚类/降维 | K-Means、PCA |
326
+ | 🟠 强化学习 | 环境交互 | 决策/控制 | Q-Learning、PPO |
327
+
328
+ ### 选择指南
329
+
330
+ - 有标签数据?→ **监督学习**
331
+ - 想发现模式?→ **无监督学习**
332
+ - 需要自主决策?→ **强化学习**
333
+ ~~~
334
+
335
+ ## Thanks
336
+ - component duration:6 jsx:"<Slide>{source}</Slide>"
337
+ ~~~md source
338
+ ## Thanks
339
+
340
+ - Q&A
341
+ - Thanks
342
+ ~~~
343
+ ~~~md zh-source
344
+ ## 感谢
345
+
346
+ - 问答环节
347
+ - 谢谢
348
+ ~~~
349
+
350
+ # zh
351
+ tts:"edge-tts --voice 'zh-CN-YunxiNeural' --text '{input}' --write-media '{output}'"
@@ -0,0 +1,28 @@
1
+ {
2
+ "id": "root",
3
+ "type": "root",
4
+ "width": 640,
5
+ "height": 480,
6
+ "fps": 30,
7
+ "isSeries": false,
8
+ "children": [
9
+ {
10
+ "id": "scene-tween-visual",
11
+ "type": "folder",
12
+ "isSeries": false,
13
+ "children": [
14
+ {
15
+ "id": "demo-tween",
16
+ "type": "component",
17
+ "jsx": "<div style={{width:'100%',height:'100%',display:'flex',flexDirection:'column',alignItems:'center',justifyContent:'center',background:'#1a1a2e',overflow:'hidden'}}><div style={{padding:'40px 60px',borderRadius:'20px',background:'linear-gradient(135deg,#667eea,#764ba2)',boxShadow:'0 8px 32px rgba(102,126,234,0.4)',opacity:tween(0,1),transform:'scale('+tween(0.3,1.2)+') rotate('+tween(-10,5)+'deg)'}}><span style={{color:'white',fontSize:tween(24,72)+'px',fontWeight:'bold',fontFamily:'sans-serif'}}>Hello Tween!</span></div><div style={{marginTop:'30px',opacity:tween(0,1),color:'rgba(255,255,255,0.6)',fontSize:'16px',fontFamily:'monospace'}}>frame: {useCurrentFrame()} / {useVideoConfig().durationInFrames}</div></div>",
18
+ "actions": [
19
+ {
20
+ "start": 0,
21
+ "end": 4
22
+ }
23
+ ]
24
+ }
25
+ ]
26
+ }
27
+ ]
28
+ }
@@ -0,0 +1,54 @@
1
+ {
2
+ "id": "root",
3
+ "type": "root",
4
+ "width": 640,
5
+ "height": 480,
6
+ "fps": 30,
7
+ "isSeries": true,
8
+ "transition": "fade",
9
+ "transitionTime": 0.3,
10
+ "children": [
11
+ {
12
+ "id": "video-scene",
13
+ "type": "folder",
14
+ "isSeries": false,
15
+ "children": [
16
+ {
17
+ "id": "test-video",
18
+ "type": "video",
19
+ "src": "clip01.mp4",
20
+ "volume": 0,
21
+ "width": 640,
22
+ "height": 480,
23
+ "actions": [
24
+ {
25
+ "start": 0,
26
+ "end": 6,
27
+ "startFrom": 2,
28
+ "endAt": 8
29
+ }
30
+ ]
31
+ }
32
+ ]
33
+ },
34
+ {
35
+ "id": "photo-scene",
36
+ "type": "folder",
37
+ "isSeries": false,
38
+ "children": [
39
+ {
40
+ "id": "test-photo",
41
+ "type": "image",
42
+ "src": "https://picsum.photos/seed/video-series-photo/640/480",
43
+ "fit": "cover",
44
+ "actions": [
45
+ {
46
+ "start": 0,
47
+ "end": 3
48
+ }
49
+ ]
50
+ }
51
+ ]
52
+ }
53
+ ]
54
+ }