gooseworks 0.5.8 → 0.5.9-dev.53.c1bd6be2

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 (69) hide show
  1. package/dist/kit/core/progress.d.ts +23 -3
  2. package/dist/kit/core/progress.d.ts.map +1 -1
  3. package/dist/kit/core/progress.js +62 -18
  4. package/dist/kit/core/progress.js.map +1 -1
  5. package/dist/kit/core/run.d.ts +5 -1
  6. package/dist/kit/core/run.d.ts.map +1 -1
  7. package/dist/kit/core/run.js +17 -4
  8. package/dist/kit/core/run.js.map +1 -1
  9. package/dist/kit/core/style.d.ts +1 -0
  10. package/dist/kit/core/style.d.ts.map +1 -1
  11. package/dist/kit/maker/cues.d.ts +67 -0
  12. package/dist/kit/maker/cues.d.ts.map +1 -0
  13. package/dist/kit/maker/cues.js +204 -0
  14. package/dist/kit/maker/cues.js.map +1 -0
  15. package/dist/kit/maker/encode.d.ts +5 -0
  16. package/dist/kit/maker/encode.d.ts.map +1 -1
  17. package/dist/kit/maker/encode.js +7 -1
  18. package/dist/kit/maker/encode.js.map +1 -1
  19. package/dist/kit/maker/facts.d.ts +46 -0
  20. package/dist/kit/maker/facts.d.ts.map +1 -0
  21. package/dist/kit/maker/facts.js +159 -0
  22. package/dist/kit/maker/facts.js.map +1 -0
  23. package/dist/kit/maker/inputs.d.ts +48 -3
  24. package/dist/kit/maker/inputs.d.ts.map +1 -1
  25. package/dist/kit/maker/inputs.js +151 -22
  26. package/dist/kit/maker/inputs.js.map +1 -1
  27. package/dist/kit/maker/make.d.ts +20 -1
  28. package/dist/kit/maker/make.d.ts.map +1 -1
  29. package/dist/kit/maker/make.js +125 -19
  30. package/dist/kit/maker/make.js.map +1 -1
  31. package/dist/kit/maker/page.d.ts.map +1 -1
  32. package/dist/kit/maker/page.js +49 -1
  33. package/dist/kit/maker/page.js.map +1 -1
  34. package/dist/kit/maker/parts/html-frames/1.2.0/part.json +1083 -0
  35. package/dist/kit/maker/parts/html-frames/src/part.d.ts.map +1 -1
  36. package/dist/kit/maker/parts/html-frames/src/part.js +4 -1
  37. package/dist/kit/maker/parts/html-frames/src/part.js.map +1 -1
  38. package/dist/kit/maker/runtime.d.ts.map +1 -1
  39. package/dist/kit/maker/runtime.js +54 -7
  40. package/dist/kit/maker/runtime.js.map +1 -1
  41. package/dist/kit/maker/timing.d.ts +74 -0
  42. package/dist/kit/maker/timing.d.ts.map +1 -0
  43. package/dist/kit/maker/timing.js +152 -0
  44. package/dist/kit/maker/timing.js.map +1 -0
  45. package/dist/kit/maker/under.d.ts +126 -0
  46. package/dist/kit/maker/under.d.ts.map +1 -0
  47. package/dist/kit/maker/under.js +299 -0
  48. package/dist/kit/maker/under.js.map +1 -0
  49. package/dist/skills/master-skill.d.ts +3 -3
  50. package/dist/skills/master-skill.d.ts.map +1 -1
  51. package/dist/skills/master-skill.js +20 -18
  52. package/dist/skills/master-skill.js.map +1 -1
  53. package/dist/skills/routes.js +2 -2
  54. package/dist/skills/routes.js.map +1 -1
  55. package/dist/skills/server-entry-skills.d.ts +6 -6
  56. package/dist/skills/server-entry-skills.d.ts.map +1 -1
  57. package/dist/skills/server-entry-skills.js +84 -55
  58. package/dist/skills/server-entry-skills.js.map +1 -1
  59. package/package.json +3 -3
  60. package/skills/goose-ads/SKILL.md +6 -6
  61. package/skills/goose-product-photos/SKILL.md +6 -6
  62. package/skills/goose-video/SKILL.md +29 -595
  63. package/skills/goose-video-local/SKILL.md +3 -1572
  64. package/skills/gooseworks/SKILL.md +6 -6
  65. package/skills/make-custom-video/SKILL.md +25 -672
  66. package/skills/manifest.json +7 -7
  67. package/skills/routes.json +1 -1
  68. package/dist/kit/maker/parts/html-frames/1.1.0/part.json +0 -199
  69. package/dist/skills/production-video-skills.json +0 -5
@@ -0,0 +1,1083 @@
1
+ {
2
+ "interface": 1,
3
+ "id": "html-frames",
4
+ "version": "1.2.0",
5
+ "kind": "render_html",
6
+ "title": "HTML frames",
7
+ "summary": "Draws a style's frame page with the plan's scenes, products and brand in the kit's Chromium, frame by frame, to H.264; can draw it transparent over another step's video and time scenes by voice or word count.",
8
+ "runtime": "node",
9
+ "entry": "part.mjs",
10
+ "files": [
11
+ "assets/sfx/chime.wav",
12
+ "assets/sfx/click.wav",
13
+ "assets/sfx/notify.wav",
14
+ "assets/sfx/pop.wav",
15
+ "assets/sfx/swoosh.wav",
16
+ "assets/sfx/tap.wav",
17
+ "assets/sfx/tick.wav",
18
+ "assets/sfx/whoosh.wav",
19
+ "part.mjs"
20
+ ],
21
+ "kit": ">=1.0.0 <2.0.0",
22
+ "needs": {
23
+ "browser": true,
24
+ "ffmpeg": {
25
+ "filters": [
26
+ "scale",
27
+ "setsar",
28
+ "format",
29
+ "transpose",
30
+ "hflip",
31
+ "vflip",
32
+ "overlay",
33
+ "crop",
34
+ "fps",
35
+ "setpts",
36
+ "adelay",
37
+ "amix",
38
+ "volume",
39
+ "apad",
40
+ "atrim"
41
+ ],
42
+ "encoders": [
43
+ "libx264",
44
+ "png",
45
+ "mjpeg",
46
+ "aac",
47
+ "rawvideo",
48
+ "pcm_s16le"
49
+ ]
50
+ },
51
+ "network": false,
52
+ "models": [],
53
+ "disk_mb": 1024
54
+ },
55
+ "inputs": {
56
+ "type": "object",
57
+ "additionalProperties": false,
58
+ "required": [
59
+ "template",
60
+ "scenes",
61
+ "aspect",
62
+ "max_words"
63
+ ],
64
+ "oneOf": [
65
+ {
66
+ "required": [
67
+ "duration_s"
68
+ ]
69
+ },
70
+ {
71
+ "required": [
72
+ "scene_s"
73
+ ]
74
+ },
75
+ {
76
+ "required": [
77
+ "pace"
78
+ ]
79
+ },
80
+ {
81
+ "required": [
82
+ "speech"
83
+ ]
84
+ },
85
+ {
86
+ "required": [
87
+ "under"
88
+ ]
89
+ }
90
+ ],
91
+ "properties": {
92
+ "template": {
93
+ "description": "The style's frame page. The maker puts the kit runtime first in its head; the page reads window.kit and draws each frame from kit.render(fn), renderAt(t), seek(ms), or CSS and Web Animations.",
94
+ "type": "object",
95
+ "x-kit-file": {
96
+ "media": "html"
97
+ }
98
+ },
99
+ "frames": {
100
+ "description": "Every other file the page uses (css, js, json, svg, png, jpg, webp), kept at the same places relative to the template. The page can load nothing else.",
101
+ "type": "array",
102
+ "maxItems": 200,
103
+ "items": {
104
+ "anyOf": [
105
+ {
106
+ "type": "object",
107
+ "x-kit-file": {
108
+ "media": "html"
109
+ }
110
+ },
111
+ {
112
+ "type": "object",
113
+ "x-kit-file": {
114
+ "media": "text"
115
+ }
116
+ },
117
+ {
118
+ "type": "object",
119
+ "x-kit-file": {
120
+ "media": "json"
121
+ }
122
+ },
123
+ {
124
+ "type": "object",
125
+ "x-kit-file": {
126
+ "media": "image"
127
+ }
128
+ }
129
+ ]
130
+ }
131
+ },
132
+ "fonts": {
133
+ "description": "The style's fonts (ttf, otf, woff, woff2). CSS uses each by its file name without the extension.",
134
+ "type": "array",
135
+ "maxItems": 20,
136
+ "items": {
137
+ "type": "object",
138
+ "x-kit-file": {
139
+ "media": "font"
140
+ }
141
+ }
142
+ },
143
+ "scenes": {
144
+ "description": "plan.scenes, in order. Each scene's time comes from duration_s or scene_s (shared evenly), pace (by word count), speech (from its first spoken entry) or under_timeline (the video drawn over). kit.scenes carries each one's start_s and end_s, and picture and image as URLs when they are files.",
145
+ "type": "array",
146
+ "minItems": 1,
147
+ "maxItems": 30,
148
+ "items": {
149
+ "type": "object",
150
+ "properties": {
151
+ "id": {
152
+ "type": [
153
+ "string",
154
+ "null"
155
+ ],
156
+ "maxLength": 64
157
+ },
158
+ "line": {
159
+ "type": [
160
+ "string",
161
+ "null"
162
+ ],
163
+ "maxLength": 2000
164
+ },
165
+ "on_screen": {
166
+ "type": [
167
+ "string",
168
+ "null"
169
+ ],
170
+ "maxLength": 2000
171
+ },
172
+ "picture": {
173
+ "anyOf": [
174
+ {
175
+ "type": "null"
176
+ },
177
+ {
178
+ "type": "string",
179
+ "maxLength": 2000
180
+ },
181
+ {
182
+ "type": "object",
183
+ "x-kit-file": {
184
+ "media": "image"
185
+ }
186
+ }
187
+ ]
188
+ },
189
+ "image": {
190
+ "description": "A picture the customer uploaded for this scene, as kit.scenes[i].image (a URL the page can load).",
191
+ "anyOf": [
192
+ {
193
+ "type": "null"
194
+ },
195
+ {
196
+ "type": "object",
197
+ "x-kit-file": {
198
+ "media": "image"
199
+ }
200
+ }
201
+ ]
202
+ },
203
+ "speaker": {
204
+ "description": "The cast key of who says this scene, as kit.scenes[i].speaker.",
205
+ "type": [
206
+ "string",
207
+ "null"
208
+ ],
209
+ "maxLength": 64
210
+ },
211
+ "extra": {
212
+ "description": "The style's own scene fields (plan.scenes[].extra), as kit.scenes[i].extra.",
213
+ "type": [
214
+ "object",
215
+ "null"
216
+ ]
217
+ }
218
+ }
219
+ }
220
+ },
221
+ "max_words": {
222
+ "description": "The style's scenes.max_words. A scene whose line or on-screen text has more words is refused.",
223
+ "type": "integer",
224
+ "minimum": 1,
225
+ "maximum": 200
226
+ },
227
+ "products": {
228
+ "description": "plan.products, in the customer's order. A PNG, JPEG or WebP photo over 2048 px on its long side, as shown after its EXIF orientation, reaches the page turned upright and scaled down to 2048 px (a PNG or WebP as PNG, keeping its transparency).",
229
+ "type": "array",
230
+ "maxItems": 12,
231
+ "items": {
232
+ "type": "object",
233
+ "required": [
234
+ "id"
235
+ ],
236
+ "properties": {
237
+ "id": {
238
+ "type": "string",
239
+ "minLength": 1
240
+ },
241
+ "name": {
242
+ "type": [
243
+ "string",
244
+ "null"
245
+ ],
246
+ "maxLength": 2000
247
+ },
248
+ "images": {
249
+ "type": "array",
250
+ "maxItems": 20,
251
+ "items": {
252
+ "type": "object",
253
+ "x-kit-file": {
254
+ "media": "image"
255
+ }
256
+ }
257
+ }
258
+ }
259
+ }
260
+ },
261
+ "brand": {
262
+ "description": "The brand frozen at the yes ({\"from\": \"brand\"}): name, logo, colors, fonts (heading, body), cta. Colours become CSS variables (--brand-primary, ...); fonts are brand-heading and brand-body.",
263
+ "type": [
264
+ "object",
265
+ "null"
266
+ ],
267
+ "properties": {
268
+ "name": {
269
+ "type": [
270
+ "string",
271
+ "null"
272
+ ],
273
+ "maxLength": 2000
274
+ },
275
+ "logo": {
276
+ "anyOf": [
277
+ {
278
+ "type": "null"
279
+ },
280
+ {
281
+ "type": "object",
282
+ "x-kit-file": {
283
+ "media": "image"
284
+ }
285
+ }
286
+ ]
287
+ },
288
+ "colors": {
289
+ "type": [
290
+ "object",
291
+ "null"
292
+ ]
293
+ },
294
+ "fonts": {
295
+ "type": [
296
+ "object",
297
+ "null"
298
+ ],
299
+ "properties": {
300
+ "heading": {
301
+ "anyOf": [
302
+ {
303
+ "type": "null"
304
+ },
305
+ {
306
+ "type": "object",
307
+ "x-kit-file": {
308
+ "media": "font"
309
+ }
310
+ }
311
+ ]
312
+ },
313
+ "body": {
314
+ "anyOf": [
315
+ {
316
+ "type": "null"
317
+ },
318
+ {
319
+ "type": "object",
320
+ "x-kit-file": {
321
+ "media": "font"
322
+ }
323
+ }
324
+ ]
325
+ }
326
+ }
327
+ },
328
+ "cta": {
329
+ "type": [
330
+ "object",
331
+ "null"
332
+ ]
333
+ }
334
+ }
335
+ },
336
+ "aspect": {
337
+ "enum": [
338
+ "9:16",
339
+ "1:1",
340
+ "4:5",
341
+ "16:9"
342
+ ]
343
+ },
344
+ "duration_s": {
345
+ "description": "Length of the whole video, in seconds. Give this or scene_s.",
346
+ "type": "number",
347
+ "minimum": 0.5,
348
+ "maximum": 180
349
+ },
350
+ "scene_s": {
351
+ "description": "Seconds per scene; the video is this times the number of scenes. Give this or duration_s.",
352
+ "type": "number",
353
+ "exclusiveMinimum": 0,
354
+ "maximum": 60
355
+ },
356
+ "fps": {
357
+ "description": "Frames per second. Default 30; drawn over a video (under), that video's own rate, rounded and kept to 1-60.",
358
+ "type": "integer",
359
+ "minimum": 1,
360
+ "maximum": 60,
361
+ "default": 30
362
+ },
363
+ "short_side": {
364
+ "description": "Pixels on the short side of the video. The page is always laid out at 1080 and scaled.",
365
+ "enum": [
366
+ 720,
367
+ 1080
368
+ ],
369
+ "default": 1080
370
+ },
371
+ "values": {
372
+ "description": "The style's own plain values for its page (labels, look choices), as kit.values.",
373
+ "type": "object"
374
+ },
375
+ "under": {
376
+ "description": "A video to draw over (another step's video). The page is drawn transparent and laid over it; its sound is kept, the video is as long as it, and the page's size and fps follow the aspect and fps inputs. Needs under_timeline.",
377
+ "type": "object",
378
+ "x-kit-file": {
379
+ "media": "video"
380
+ }
381
+ },
382
+ "under_timeline": {
383
+ "description": "The timeline of the video drawn over. kit.scenes take its scene start times by id (in order when no id matches and the counts match); each runs to the next one's start, so a gap between its scenes belongs to the scene before it on the page. When it is one scene (one clip, say) and the plan has several, the plan's scenes share it evenly on whole frames and become this step's scenes; any other count mismatch is refused. Its speech, end_card and safe_zones pass through to this step's timeline. kit.under.quiet_band[i] is the emptiest band of scene i's middle frame.",
384
+ "type": "object",
385
+ "additionalProperties": false,
386
+ "required": [
387
+ "duration_s",
388
+ "width",
389
+ "height",
390
+ "fps",
391
+ "scenes",
392
+ "speech"
393
+ ],
394
+ "properties": {
395
+ "duration_s": {
396
+ "type": "number",
397
+ "exclusiveMinimum": 0
398
+ },
399
+ "width": {
400
+ "type": "integer",
401
+ "minimum": 1
402
+ },
403
+ "height": {
404
+ "type": "integer",
405
+ "minimum": 1
406
+ },
407
+ "fps": {
408
+ "type": "number",
409
+ "exclusiveMinimum": 0
410
+ },
411
+ "scenes": {
412
+ "type": "array",
413
+ "items": {
414
+ "type": "object",
415
+ "additionalProperties": false,
416
+ "required": [
417
+ "id",
418
+ "start_s",
419
+ "end_s"
420
+ ],
421
+ "properties": {
422
+ "id": {
423
+ "type": "string"
424
+ },
425
+ "start_s": {
426
+ "type": "number",
427
+ "minimum": 0
428
+ },
429
+ "end_s": {
430
+ "type": "number",
431
+ "minimum": 0
432
+ }
433
+ }
434
+ }
435
+ },
436
+ "speech": {
437
+ "type": "array",
438
+ "items": {
439
+ "type": "object",
440
+ "additionalProperties": false,
441
+ "required": [
442
+ "text",
443
+ "start_s",
444
+ "end_s"
445
+ ],
446
+ "properties": {
447
+ "scene_id": {
448
+ "type": "string"
449
+ },
450
+ "text": {
451
+ "type": "string"
452
+ },
453
+ "spoken": {
454
+ "type": "string"
455
+ },
456
+ "start_s": {
457
+ "type": "number",
458
+ "minimum": 0
459
+ },
460
+ "end_s": {
461
+ "type": "number",
462
+ "minimum": 0
463
+ },
464
+ "words": {
465
+ "type": "array",
466
+ "items": {
467
+ "type": "object",
468
+ "additionalProperties": false,
469
+ "required": [
470
+ "text",
471
+ "start_s",
472
+ "end_s"
473
+ ],
474
+ "properties": {
475
+ "text": {
476
+ "type": "string"
477
+ },
478
+ "start_s": {
479
+ "type": "number",
480
+ "minimum": 0
481
+ },
482
+ "end_s": {
483
+ "type": "number",
484
+ "minimum": 0
485
+ }
486
+ }
487
+ }
488
+ }
489
+ }
490
+ }
491
+ },
492
+ "end_card": {
493
+ "type": "object",
494
+ "additionalProperties": false,
495
+ "required": [
496
+ "start_s",
497
+ "end_s"
498
+ ],
499
+ "properties": {
500
+ "start_s": {
501
+ "type": "number",
502
+ "minimum": 0
503
+ },
504
+ "end_s": {
505
+ "type": "number",
506
+ "minimum": 0
507
+ }
508
+ }
509
+ },
510
+ "safe_zones": {
511
+ "type": "array",
512
+ "items": {
513
+ "type": "object",
514
+ "additionalProperties": false,
515
+ "required": [
516
+ "use",
517
+ "x",
518
+ "y",
519
+ "w",
520
+ "h"
521
+ ],
522
+ "properties": {
523
+ "use": {
524
+ "enum": [
525
+ "captions",
526
+ "logo"
527
+ ]
528
+ },
529
+ "x": {
530
+ "type": "number"
531
+ },
532
+ "y": {
533
+ "type": "number"
534
+ },
535
+ "w": {
536
+ "type": "number",
537
+ "minimum": 0
538
+ },
539
+ "h": {
540
+ "type": "number",
541
+ "minimum": 0
542
+ }
543
+ }
544
+ }
545
+ }
546
+ }
547
+ },
548
+ "speech": {
549
+ "description": "A voice track timeline's speech (step.<voice>.timeline.speech). Entries pair with scenes by scene_id, or in order when no entry has one and the counts match. Scene 1 starts at 0 and every other scene at its first speech entry; scenes with no speech share the gap before the next scene evenly. The video ends tail_s after the last entry. Passed through to the output timeline and to kit.speech; kit.scenes[i].words lists the words that start in scene i.",
550
+ "type": "array",
551
+ "minItems": 1,
552
+ "maxItems": 400,
553
+ "items": {
554
+ "type": "object",
555
+ "additionalProperties": false,
556
+ "required": [
557
+ "text",
558
+ "start_s",
559
+ "end_s"
560
+ ],
561
+ "properties": {
562
+ "scene_id": {
563
+ "type": "string"
564
+ },
565
+ "text": {
566
+ "type": "string"
567
+ },
568
+ "spoken": {
569
+ "type": "string"
570
+ },
571
+ "start_s": {
572
+ "type": "number",
573
+ "minimum": 0
574
+ },
575
+ "end_s": {
576
+ "type": "number",
577
+ "minimum": 0
578
+ },
579
+ "words": {
580
+ "type": "array",
581
+ "items": {
582
+ "type": "object",
583
+ "additionalProperties": false,
584
+ "required": [
585
+ "text",
586
+ "start_s",
587
+ "end_s"
588
+ ],
589
+ "properties": {
590
+ "text": {
591
+ "type": "string"
592
+ },
593
+ "start_s": {
594
+ "type": "number",
595
+ "minimum": 0
596
+ },
597
+ "end_s": {
598
+ "type": "number",
599
+ "minimum": 0
600
+ }
601
+ }
602
+ }
603
+ }
604
+ }
605
+ }
606
+ },
607
+ "tail_s": {
608
+ "description": "Seconds held after the last spoken entry, when scenes are timed by speech. Default 0.",
609
+ "type": "number",
610
+ "minimum": 0,
611
+ "maximum": 10
612
+ },
613
+ "pace": {
614
+ "description": "Each scene holds base_s + per_word_s for each word of its on_screen text (or its line when it has none), kept between min_s and max_s; the last scene holds at least last_min_s. The video is the sum of the holds.",
615
+ "type": "object",
616
+ "additionalProperties": false,
617
+ "required": [
618
+ "base_s",
619
+ "per_word_s"
620
+ ],
621
+ "properties": {
622
+ "base_s": {
623
+ "type": "number",
624
+ "minimum": 0,
625
+ "maximum": 30
626
+ },
627
+ "per_word_s": {
628
+ "type": "number",
629
+ "minimum": 0,
630
+ "maximum": 5
631
+ },
632
+ "min_s": {
633
+ "type": "number",
634
+ "exclusiveMinimum": 0,
635
+ "maximum": 60
636
+ },
637
+ "max_s": {
638
+ "type": "number",
639
+ "exclusiveMinimum": 0,
640
+ "maximum": 60
641
+ },
642
+ "last_min_s": {
643
+ "type": "number",
644
+ "minimum": 0,
645
+ "maximum": 60
646
+ }
647
+ }
648
+ },
649
+ "caption_zone": {
650
+ "description": "Where captions may go, in the page's CSS pixels (1080 on the short side), kept to the page. Reported in the video's pixels (rounded inward) as timeline.safe_zones[use=captions], which the captions layer keeps to; it replaces any caption zone of the video drawn over.",
651
+ "type": "object",
652
+ "additionalProperties": false,
653
+ "required": [
654
+ "x",
655
+ "y",
656
+ "w",
657
+ "h"
658
+ ],
659
+ "properties": {
660
+ "x": {
661
+ "type": "number",
662
+ "minimum": 0
663
+ },
664
+ "y": {
665
+ "type": "number",
666
+ "minimum": 0
667
+ },
668
+ "w": {
669
+ "type": "number",
670
+ "exclusiveMinimum": 0
671
+ },
672
+ "h": {
673
+ "type": "number",
674
+ "exclusiveMinimum": 0
675
+ }
676
+ }
677
+ },
678
+ "end_card_scenes": {
679
+ "description": "The last this many scenes are the end card: timeline.end_card spans them to the end, so no caption is drawn over them. Drawn over a video, it replaces that video's end card. 0 adds none.",
680
+ "type": "integer",
681
+ "minimum": 0,
682
+ "maximum": 30
683
+ },
684
+ "skip_blank": {
685
+ "description": "When no scene has on_screen text or a line, the step makes nothing (no video, no timeline) instead of a blank video; the kit then leaves out every reference to its outputs.",
686
+ "type": "boolean"
687
+ },
688
+ "media": {
689
+ "description": "Extra pictures by id (a cast still, a screen), as kit.media [{id, url}].",
690
+ "type": "array",
691
+ "maxItems": 24,
692
+ "items": {
693
+ "type": "object",
694
+ "additionalProperties": false,
695
+ "required": [
696
+ "id",
697
+ "image"
698
+ ],
699
+ "properties": {
700
+ "id": {
701
+ "type": "string",
702
+ "minLength": 1,
703
+ "maxLength": 64
704
+ },
705
+ "image": {
706
+ "type": "object",
707
+ "x-kit-file": {
708
+ "media": "image"
709
+ }
710
+ }
711
+ }
712
+ }
713
+ },
714
+ "footage": {
715
+ "description": "plan.footage, for its windows only: kit.scenes[i].footage lists the scene's entries as {kind, start_s, end_s, crop, fit}. The files are never put in the page (a frame page cannot play video).",
716
+ "type": "array",
717
+ "maxItems": 20,
718
+ "items": {
719
+ "type": "object",
720
+ "properties": {
721
+ "scene_id": {
722
+ "type": [
723
+ "string",
724
+ "null"
725
+ ],
726
+ "maxLength": 64
727
+ },
728
+ "kind": {
729
+ "type": [
730
+ "string",
731
+ "null"
732
+ ],
733
+ "maxLength": 32
734
+ },
735
+ "start_ms": {
736
+ "type": [
737
+ "number",
738
+ "null"
739
+ ],
740
+ "minimum": 0
741
+ },
742
+ "end_ms": {
743
+ "type": [
744
+ "number",
745
+ "null"
746
+ ],
747
+ "minimum": 0
748
+ },
749
+ "crop": {
750
+ "description": "A source box [x0, y0, x1, y1] in 0..1 of the source, as plan.footage gives it.",
751
+ "anyOf": [
752
+ {
753
+ "type": "null"
754
+ },
755
+ {
756
+ "type": "array",
757
+ "minItems": 4,
758
+ "maxItems": 4,
759
+ "items": {
760
+ "type": "number",
761
+ "minimum": 0,
762
+ "maximum": 1
763
+ }
764
+ },
765
+ {
766
+ "type": "object"
767
+ }
768
+ ]
769
+ },
770
+ "fit": {
771
+ "type": [
772
+ "string",
773
+ "null"
774
+ ],
775
+ "maxLength": 32
776
+ },
777
+ "mask": {
778
+ "type": [
779
+ "array",
780
+ "null"
781
+ ],
782
+ "maxItems": 8
783
+ },
784
+ "file": {
785
+ "anyOf": [
786
+ {
787
+ "type": "null"
788
+ },
789
+ {
790
+ "type": "object",
791
+ "x-kit-file": {
792
+ "media": "video"
793
+ }
794
+ },
795
+ {
796
+ "type": "object",
797
+ "x-kit-file": {
798
+ "media": "image"
799
+ }
800
+ }
801
+ ]
802
+ }
803
+ }
804
+ }
805
+ },
806
+ "facts": {
807
+ "description": "Measure every PNG, JPEG and WebP picture the page gets into kit.facts[url]: {alpha, plate, accent, luminance, width, height, subject {x, y, w, h, top_cx}} (sizes as 0..1 fractions). An SVG, GIF or AVIF picture gets no entry. Default false.",
808
+ "type": "boolean"
809
+ }
810
+ },
811
+ "allOf": [
812
+ {
813
+ "anyOf": [
814
+ {
815
+ "not": {
816
+ "required": [
817
+ "under"
818
+ ]
819
+ }
820
+ },
821
+ {
822
+ "required": [
823
+ "under_timeline"
824
+ ]
825
+ }
826
+ ]
827
+ },
828
+ {
829
+ "anyOf": [
830
+ {
831
+ "not": {
832
+ "required": [
833
+ "under_timeline"
834
+ ]
835
+ }
836
+ },
837
+ {
838
+ "required": [
839
+ "under"
840
+ ]
841
+ }
842
+ ]
843
+ },
844
+ {
845
+ "anyOf": [
846
+ {
847
+ "not": {
848
+ "required": [
849
+ "tail_s"
850
+ ]
851
+ }
852
+ },
853
+ {
854
+ "required": [
855
+ "speech"
856
+ ]
857
+ }
858
+ ]
859
+ }
860
+ ]
861
+ },
862
+ "outputs": {
863
+ "type": "object",
864
+ "additionalProperties": false,
865
+ "required": [],
866
+ "properties": {
867
+ "video": {
868
+ "description": "H.264 in yuv420p, BT.709, at the aspect's size. Silent, unless it was drawn over a video with sound (that sound is kept as AAC) or the page marked sound cues.",
869
+ "type": "object",
870
+ "x-kit-file": {
871
+ "media": "video",
872
+ "mime": [
873
+ "video/mp4"
874
+ ]
875
+ }
876
+ },
877
+ "seconds": {
878
+ "type": "number",
879
+ "exclusiveMinimum": 0
880
+ },
881
+ "timeline": {
882
+ "description": "duration_s, width, height, fps, scenes [{id, start_s, end_s}], the speech it was timed by or drawn over (else empty), end_card when end_card_scenes or the video drawn over has one, and safe_zones: the logo's box (the picture of kit.brand.logo as drawn on the last frame that shows it), the caption zone, and the zones of the video drawn over, all in the video's pixels.",
883
+ "type": "object",
884
+ "additionalProperties": false,
885
+ "required": [
886
+ "duration_s",
887
+ "width",
888
+ "height",
889
+ "fps",
890
+ "scenes",
891
+ "speech"
892
+ ],
893
+ "properties": {
894
+ "duration_s": {
895
+ "type": "number",
896
+ "exclusiveMinimum": 0
897
+ },
898
+ "width": {
899
+ "type": "integer",
900
+ "minimum": 1
901
+ },
902
+ "height": {
903
+ "type": "integer",
904
+ "minimum": 1
905
+ },
906
+ "fps": {
907
+ "type": "number",
908
+ "exclusiveMinimum": 0
909
+ },
910
+ "scenes": {
911
+ "type": "array",
912
+ "items": {
913
+ "type": "object",
914
+ "additionalProperties": false,
915
+ "required": [
916
+ "id",
917
+ "start_s",
918
+ "end_s"
919
+ ],
920
+ "properties": {
921
+ "id": {
922
+ "type": "string"
923
+ },
924
+ "start_s": {
925
+ "type": "number",
926
+ "minimum": 0
927
+ },
928
+ "end_s": {
929
+ "type": "number",
930
+ "minimum": 0
931
+ }
932
+ }
933
+ }
934
+ },
935
+ "speech": {
936
+ "type": "array",
937
+ "items": {
938
+ "type": "object",
939
+ "additionalProperties": false,
940
+ "required": [
941
+ "text",
942
+ "start_s",
943
+ "end_s"
944
+ ],
945
+ "properties": {
946
+ "scene_id": {
947
+ "type": "string"
948
+ },
949
+ "text": {
950
+ "type": "string"
951
+ },
952
+ "spoken": {
953
+ "type": "string"
954
+ },
955
+ "start_s": {
956
+ "type": "number",
957
+ "minimum": 0
958
+ },
959
+ "end_s": {
960
+ "type": "number",
961
+ "minimum": 0
962
+ },
963
+ "words": {
964
+ "type": "array",
965
+ "items": {
966
+ "type": "object",
967
+ "additionalProperties": false,
968
+ "required": [
969
+ "text",
970
+ "start_s",
971
+ "end_s"
972
+ ],
973
+ "properties": {
974
+ "text": {
975
+ "type": "string"
976
+ },
977
+ "start_s": {
978
+ "type": "number",
979
+ "minimum": 0
980
+ },
981
+ "end_s": {
982
+ "type": "number",
983
+ "minimum": 0
984
+ }
985
+ }
986
+ }
987
+ }
988
+ }
989
+ }
990
+ },
991
+ "end_card": {
992
+ "type": "object",
993
+ "additionalProperties": false,
994
+ "required": [
995
+ "start_s",
996
+ "end_s"
997
+ ],
998
+ "properties": {
999
+ "start_s": {
1000
+ "type": "number",
1001
+ "minimum": 0
1002
+ },
1003
+ "end_s": {
1004
+ "type": "number",
1005
+ "minimum": 0
1006
+ }
1007
+ }
1008
+ },
1009
+ "safe_zones": {
1010
+ "type": "array",
1011
+ "maxItems": 8,
1012
+ "items": {
1013
+ "type": "object",
1014
+ "additionalProperties": false,
1015
+ "required": [
1016
+ "use",
1017
+ "x",
1018
+ "y",
1019
+ "w",
1020
+ "h"
1021
+ ],
1022
+ "properties": {
1023
+ "use": {
1024
+ "enum": [
1025
+ "captions",
1026
+ "logo"
1027
+ ]
1028
+ },
1029
+ "x": {
1030
+ "type": "number",
1031
+ "minimum": 0
1032
+ },
1033
+ "y": {
1034
+ "type": "number",
1035
+ "minimum": 0
1036
+ },
1037
+ "w": {
1038
+ "type": "number",
1039
+ "exclusiveMinimum": 0
1040
+ },
1041
+ "h": {
1042
+ "type": "number",
1043
+ "exclusiveMinimum": 0
1044
+ }
1045
+ }
1046
+ }
1047
+ }
1048
+ }
1049
+ }
1050
+ },
1051
+ "anyOf": [
1052
+ {
1053
+ "required": [
1054
+ "video",
1055
+ "seconds",
1056
+ "timeline"
1057
+ ]
1058
+ },
1059
+ {
1060
+ "maxProperties": 0
1061
+ }
1062
+ ]
1063
+ },
1064
+ "cost": {
1065
+ "basis": "free"
1066
+ },
1067
+ "determinism": "pure",
1068
+ "timing": {
1069
+ "typical_s": 90,
1070
+ "timeout_s": 1200
1071
+ },
1072
+ "retry": {
1073
+ "transient": 1
1074
+ },
1075
+ "replaces": [
1076
+ "render-html-frames",
1077
+ "render-search-grid",
1078
+ "render-photo-grid-card",
1079
+ "render-logo-equation-card",
1080
+ "create-kinetic-typography"
1081
+ ],
1082
+ "x-determinism-scope": "pure within one render environment: the same inputs give the same bytes on the same operating system, Chromium build and fonts. The kit's toolchain id carries the browser's render fingerprint (version, platform and a hash of a probe page drawn with the system's fonts), so a cached step is never reused on a computer that would draw it differently."
1083
+ }