@lee-jisoo/n8n-nodes-mediafx 1.6.0 → 1.6.2

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 (54) hide show
  1. package/dist/fonts/DejaVuSans.ttf +0 -0
  2. package/dist/fonts/Inter-Regular.ttf +0 -0
  3. package/dist/fonts/NanumGothic-Regular.ttf +0 -0
  4. package/dist/fonts/NotoSansKR-Regular.ttf +0 -0
  5. package/dist/fonts/Pretendard-Regular.otf +0 -0
  6. package/dist/fonts/Roboto-Regular.ttf +0 -0
  7. package/dist/nodes/MediaFX/MediaFX.node.d.ts +12 -0
  8. package/dist/nodes/MediaFX/MediaFX.node.js +559 -0
  9. package/dist/nodes/MediaFX/mediafx.png +0 -0
  10. package/dist/nodes/MediaFX/operations/addSubtitle.d.ts +2 -0
  11. package/dist/nodes/MediaFX/operations/addSubtitle.js +202 -0
  12. package/dist/nodes/MediaFX/operations/addText.d.ts +2 -0
  13. package/dist/nodes/MediaFX/operations/addText.js +108 -0
  14. package/dist/nodes/MediaFX/operations/extractAudio.d.ts +2 -0
  15. package/dist/nodes/MediaFX/operations/extractAudio.js +57 -0
  16. package/dist/nodes/MediaFX/operations/imageToVideo.d.ts +5 -0
  17. package/dist/nodes/MediaFX/operations/imageToVideo.js +65 -0
  18. package/dist/nodes/MediaFX/operations/index.d.ts +13 -0
  19. package/dist/nodes/MediaFX/operations/index.js +29 -0
  20. package/dist/nodes/MediaFX/operations/merge.d.ts +2 -0
  21. package/dist/nodes/MediaFX/operations/merge.js +121 -0
  22. package/dist/nodes/MediaFX/operations/mixAudio.d.ts +2 -0
  23. package/dist/nodes/MediaFX/operations/mixAudio.js +141 -0
  24. package/dist/nodes/MediaFX/operations/multiVideoTransition.d.ts +2 -0
  25. package/dist/nodes/MediaFX/operations/multiVideoTransition.js +245 -0
  26. package/dist/nodes/MediaFX/operations/overlayVideo.d.ts +16 -0
  27. package/dist/nodes/MediaFX/operations/overlayVideo.js +240 -0
  28. package/dist/nodes/MediaFX/operations/separateAudio.d.ts +17 -0
  29. package/dist/nodes/MediaFX/operations/separateAudio.js +78 -0
  30. package/dist/nodes/MediaFX/operations/singleVideoFade.d.ts +2 -0
  31. package/dist/nodes/MediaFX/operations/singleVideoFade.js +60 -0
  32. package/dist/nodes/MediaFX/operations/speed.d.ts +12 -0
  33. package/dist/nodes/MediaFX/operations/speed.js +110 -0
  34. package/dist/nodes/MediaFX/operations/stampImage.d.ts +2 -0
  35. package/dist/nodes/MediaFX/operations/stampImage.js +146 -0
  36. package/dist/nodes/MediaFX/operations/trim.d.ts +2 -0
  37. package/dist/nodes/MediaFX/operations/trim.js +49 -0
  38. package/dist/nodes/MediaFX/properties/audio.properties.d.ts +2 -0
  39. package/dist/nodes/MediaFX/properties/audio.properties.js +394 -0
  40. package/dist/nodes/MediaFX/properties/font.properties.d.ts +2 -0
  41. package/dist/nodes/MediaFX/properties/font.properties.js +186 -0
  42. package/dist/nodes/MediaFX/properties/image.properties.d.ts +2 -0
  43. package/dist/nodes/MediaFX/properties/image.properties.js +333 -0
  44. package/dist/nodes/MediaFX/properties/resources.properties.d.ts +2 -0
  45. package/dist/nodes/MediaFX/properties/resources.properties.js +34 -0
  46. package/dist/nodes/MediaFX/properties/subtitle.properties.d.ts +2 -0
  47. package/dist/nodes/MediaFX/properties/subtitle.properties.js +361 -0
  48. package/dist/nodes/MediaFX/properties/video.properties.d.ts +2 -0
  49. package/dist/nodes/MediaFX/properties/video.properties.js +1135 -0
  50. package/dist/nodes/MediaFX/utils/ffmpegVersion.d.ts +14 -0
  51. package/dist/nodes/MediaFX/utils/ffmpegVersion.js +97 -0
  52. package/dist/nodes/MediaFX/utils.d.ts +43 -0
  53. package/dist/nodes/MediaFX/utils.js +410 -0
  54. package/package.json +1 -1
@@ -0,0 +1,1135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.videoProperties = void 0;
4
+ exports.videoProperties = [
5
+ // Video Processing Operations
6
+ {
7
+ displayName: 'Operation',
8
+ name: 'operation',
9
+ type: 'options',
10
+ noDataExpression: true,
11
+ displayOptions: {
12
+ show: {
13
+ resource: ['video'],
14
+ },
15
+ },
16
+ options: [
17
+ {
18
+ name: 'Merge',
19
+ value: 'merge',
20
+ description: 'Combine multiple videos into a single video file',
21
+ },
22
+ {
23
+ name: 'Trim',
24
+ value: 'trim',
25
+ description: 'Cut a video to a specific start and end time',
26
+ },
27
+ {
28
+ name: 'Speed',
29
+ value: 'speed',
30
+ description: 'Adjust video playback speed (slow motion or fast forward)',
31
+ },
32
+ {
33
+ name: 'Transition',
34
+ value: 'multiTransition',
35
+ description: 'Apply transition effects between multiple videos',
36
+ },
37
+ {
38
+ name: 'Fade',
39
+ value: 'singleFade',
40
+ description: 'Apply fade in/out effects to a single video',
41
+ },
42
+ {
43
+ name: 'Separate Audio',
44
+ value: 'separateAudio',
45
+ description: 'Split video into muted video and extracted audio track',
46
+ },
47
+ {
48
+ name: 'Overlay Video',
49
+ value: 'overlayVideo',
50
+ description: 'Overlay a video on top of another video as a layer',
51
+ },
52
+ ],
53
+ default: 'merge',
54
+ },
55
+ // ===================
56
+ // VIDEO MERGE FIELDS
57
+ // ===================
58
+ {
59
+ displayName: 'Video Sources',
60
+ name: 'videoSources',
61
+ type: 'fixedCollection',
62
+ typeOptions: {
63
+ multipleValues: true,
64
+ },
65
+ placeholder: 'Add Video Source',
66
+ displayOptions: {
67
+ show: {
68
+ resource: ['video'],
69
+ operation: ['merge'],
70
+ },
71
+ },
72
+ default: [],
73
+ options: [
74
+ {
75
+ displayName: 'Source',
76
+ name: 'sources',
77
+ values: [
78
+ {
79
+ displayName: 'Source Type',
80
+ name: 'sourceType',
81
+ type: 'options',
82
+ options: [
83
+ {
84
+ name: 'URL',
85
+ value: 'url',
86
+ },
87
+ {
88
+ name: 'Binary Data from Previous Node',
89
+ value: 'binary',
90
+ },
91
+ ],
92
+ default: 'url',
93
+ },
94
+ {
95
+ displayName: 'Value',
96
+ name: 'value',
97
+ type: 'string',
98
+ default: '',
99
+ placeholder: 'https://example.com/video.mp4 or /data/video.mp4',
100
+ displayOptions: { show: { sourceType: ['url'] } },
101
+ },
102
+ {
103
+ displayName: 'Binary Property',
104
+ name: 'binaryProperty',
105
+ type: 'string',
106
+ default: 'data',
107
+ description: 'Name of the binary property from the previous node. If using Merge node, use data1, data2, etc.',
108
+ placeholder: 'e.g., data, data1, data2',
109
+ displayOptions: { show: { sourceType: ['binary'] } },
110
+ },
111
+ ],
112
+ },
113
+ ],
114
+ },
115
+ {
116
+ displayName: 'Output Format',
117
+ name: 'videoOutputFormat',
118
+ type: 'options',
119
+ displayOptions: {
120
+ show: {
121
+ resource: ['video'],
122
+ operation: ['merge'],
123
+ },
124
+ },
125
+ options: [
126
+ {
127
+ name: 'MP4',
128
+ value: 'mp4',
129
+ },
130
+ {
131
+ name: 'AVI',
132
+ value: 'avi',
133
+ },
134
+ {
135
+ name: 'MOV',
136
+ value: 'mov',
137
+ },
138
+ ],
139
+ default: 'mp4',
140
+ },
141
+ // ===================
142
+ // VIDEO TRIM FIELDS
143
+ // ===================
144
+ {
145
+ displayName: 'Video Source',
146
+ name: 'source',
147
+ type: 'fixedCollection',
148
+ placeholder: 'Add Video Source',
149
+ displayOptions: {
150
+ show: {
151
+ resource: ['video'],
152
+ operation: ['trim'],
153
+ },
154
+ },
155
+ default: {},
156
+ options: [
157
+ {
158
+ displayName: 'Source',
159
+ name: 'source',
160
+ values: [
161
+ {
162
+ displayName: 'Source Type',
163
+ name: 'sourceType',
164
+ type: 'options',
165
+ options: [{ name: 'URL', value: 'url' }, { name: 'Binary Data', value: 'binary' }],
166
+ default: 'url',
167
+ },
168
+ {
169
+ displayName: 'Value',
170
+ name: 'value',
171
+ type: 'string',
172
+ default: '',
173
+ placeholder: 'https://example.com/video.mp4',
174
+ displayOptions: { show: { sourceType: ['url'] } },
175
+ },
176
+ {
177
+ displayName: 'Binary Property',
178
+ name: 'binaryProperty',
179
+ type: 'string',
180
+ default: 'data',
181
+ description: 'Name of the binary property from the previous node',
182
+ placeholder: 'e.g., data',
183
+ displayOptions: { show: { sourceType: ['binary'] } },
184
+ },
185
+ ],
186
+ },
187
+ ],
188
+ },
189
+ {
190
+ displayName: 'Start Time (seconds)',
191
+ name: 'startTime',
192
+ type: 'number',
193
+ displayOptions: {
194
+ show: {
195
+ resource: ['video'],
196
+ operation: ['trim'],
197
+ },
198
+ },
199
+ default: 0,
200
+ description: 'Start time in seconds',
201
+ },
202
+ {
203
+ displayName: 'End Time (seconds)',
204
+ name: 'endTime',
205
+ type: 'number',
206
+ displayOptions: {
207
+ show: {
208
+ resource: ['video'],
209
+ operation: ['trim'],
210
+ },
211
+ },
212
+ default: 10,
213
+ description: 'End time in seconds',
214
+ },
215
+ // ===================
216
+ // MULTI-VIDEO TRANSITION FIELDS
217
+ // ===================
218
+ {
219
+ displayName: 'Video Sources',
220
+ name: 'transitionSources',
221
+ type: 'fixedCollection',
222
+ typeOptions: {
223
+ multipleValues: true,
224
+ },
225
+ displayOptions: {
226
+ show: {
227
+ resource: ['video'],
228
+ operation: ['multiTransition'],
229
+ },
230
+ },
231
+ default: [],
232
+ options: [
233
+ {
234
+ displayName: 'Source',
235
+ name: 'sources',
236
+ values: [
237
+ {
238
+ displayName: 'Source Type',
239
+ name: 'sourceType',
240
+ type: 'options',
241
+ options: [{ name: 'URL', value: 'url' }, { name: 'Binary Data', value: 'binary' }],
242
+ default: 'url',
243
+ },
244
+ {
245
+ displayName: 'Value',
246
+ name: 'value',
247
+ type: 'string',
248
+ default: '',
249
+ placeholder: 'https://example.com/video.mp4 or /data/video.mp4',
250
+ displayOptions: { show: { sourceType: ['url'] } },
251
+ },
252
+ {
253
+ displayName: 'Binary Property',
254
+ name: 'binaryProperty',
255
+ type: 'string',
256
+ default: 'data',
257
+ description: 'Name of the binary property from the previous node. If using Merge node, use data1, data2, etc.',
258
+ placeholder: 'e.g., data, data1, data2',
259
+ displayOptions: { show: { sourceType: ['binary'] } },
260
+ },
261
+ ],
262
+ },
263
+ ],
264
+ },
265
+ {
266
+ displayName: 'Transition Effect',
267
+ name: 'transitionEffect',
268
+ type: 'options',
269
+ typeOptions: {
270
+ loadOptionsMethod: 'getTransitionEffects',
271
+ },
272
+ displayOptions: {
273
+ show: {
274
+ resource: ['video'],
275
+ operation: ['multiTransition'],
276
+ },
277
+ },
278
+ default: 'fade',
279
+ description: 'Type of transition effect to apply',
280
+ },
281
+ {
282
+ displayName: 'Transition Duration (seconds)',
283
+ name: 'transitionDuration',
284
+ type: 'number',
285
+ typeOptions: {
286
+ minValue: 0.1,
287
+ maxValue: 10,
288
+ numberStepSize: 0.1,
289
+ },
290
+ displayOptions: {
291
+ show: {
292
+ resource: ['video'],
293
+ operation: ['multiTransition'],
294
+ },
295
+ },
296
+ default: 1.5,
297
+ description: 'Duration of transition effect in seconds',
298
+ },
299
+ {
300
+ displayName: 'Output Format',
301
+ name: 'transitionOutputFormat',
302
+ type: 'options',
303
+ displayOptions: {
304
+ show: {
305
+ resource: ['video'],
306
+ operation: ['multiTransition', 'singleFade'],
307
+ },
308
+ },
309
+ options: [
310
+ { name: 'MP4', value: 'mp4' },
311
+ { name: 'MOV', value: 'mov' },
312
+ { name: 'AVI', value: 'avi' },
313
+ { name: 'MKV', value: 'mkv' },
314
+ ],
315
+ default: 'mp4',
316
+ description: 'The format of the output video file.',
317
+ },
318
+ // ===================
319
+ // SINGLE VIDEO FADE FIELDS
320
+ // ===================
321
+ {
322
+ displayName: 'Video Source',
323
+ name: 'fadeSource',
324
+ type: 'fixedCollection',
325
+ placeholder: 'Add Video Source',
326
+ displayOptions: {
327
+ show: {
328
+ resource: ['video'],
329
+ operation: ['singleFade'],
330
+ },
331
+ },
332
+ default: {},
333
+ options: [{
334
+ displayName: 'Source',
335
+ name: 'source',
336
+ values: [
337
+ {
338
+ displayName: 'Source Type', name: 'sourceType', type: 'options',
339
+ options: [{ name: 'URL', value: 'url' }, { name: 'Binary Data', value: 'binary' }],
340
+ default: 'url',
341
+ },
342
+ { displayName: 'Value', name: 'value', type: 'string', default: '', placeholder: 'https://example.com/video.mp4', displayOptions: { show: { sourceType: ['url'] } } },
343
+ {
344
+ displayName: 'Binary Property',
345
+ name: 'binaryProperty',
346
+ type: 'string',
347
+ default: 'data',
348
+ description: 'Name of the binary property from the previous node',
349
+ placeholder: 'e.g., data',
350
+ displayOptions: { show: { sourceType: ['binary'] } }
351
+ },
352
+ ],
353
+ }],
354
+ },
355
+ {
356
+ displayName: 'Fade Effect',
357
+ name: 'fadeEffect',
358
+ type: 'options',
359
+ displayOptions: {
360
+ show: {
361
+ resource: ['video'],
362
+ operation: ['singleFade'],
363
+ },
364
+ },
365
+ options: [
366
+ { name: 'Fade In', value: 'in' },
367
+ { name: 'Fade Out', value: 'out' },
368
+ ],
369
+ default: 'in',
370
+ },
371
+ {
372
+ displayName: 'Fade Start Time (seconds)',
373
+ name: 'fadeStartTime',
374
+ type: 'number',
375
+ displayOptions: {
376
+ show: {
377
+ resource: ['video'],
378
+ operation: ['singleFade'],
379
+ },
380
+ },
381
+ default: 0,
382
+ },
383
+ {
384
+ displayName: 'Fade Duration (seconds)',
385
+ name: 'fadeDuration',
386
+ type: 'number',
387
+ displayOptions: {
388
+ show: {
389
+ resource: ['video'],
390
+ operation: ['singleFade'],
391
+ },
392
+ },
393
+ default: 1,
394
+ },
395
+ // ===================
396
+ // SEPARATE AUDIO FIELDS
397
+ // ===================
398
+ {
399
+ displayName: 'Video Source',
400
+ name: 'separateSource',
401
+ type: 'fixedCollection',
402
+ placeholder: 'Add Video Source',
403
+ displayOptions: {
404
+ show: {
405
+ resource: ['video'],
406
+ operation: ['separateAudio'],
407
+ },
408
+ },
409
+ default: {},
410
+ options: [
411
+ {
412
+ displayName: 'Source',
413
+ name: 'source',
414
+ values: [
415
+ {
416
+ displayName: 'Source Type',
417
+ name: 'sourceType',
418
+ type: 'options',
419
+ options: [
420
+ { name: 'URL', value: 'url' },
421
+ { name: 'Binary Data', value: 'binary' },
422
+ ],
423
+ default: 'url',
424
+ },
425
+ {
426
+ displayName: 'Value',
427
+ name: 'value',
428
+ type: 'string',
429
+ default: '',
430
+ placeholder: 'https://example.com/video.mp4',
431
+ displayOptions: { show: { sourceType: ['url'] } },
432
+ },
433
+ {
434
+ displayName: 'Binary Property',
435
+ name: 'binaryProperty',
436
+ type: 'string',
437
+ default: 'data',
438
+ description: 'Name of the binary property from the previous node',
439
+ placeholder: 'e.g., data',
440
+ displayOptions: { show: { sourceType: ['binary'] } },
441
+ },
442
+ ],
443
+ },
444
+ ],
445
+ },
446
+ {
447
+ displayName: 'Video Output Format',
448
+ name: 'separateVideoFormat',
449
+ type: 'options',
450
+ displayOptions: {
451
+ show: {
452
+ resource: ['video'],
453
+ operation: ['separateAudio'],
454
+ },
455
+ },
456
+ options: [
457
+ { name: 'MP4', value: 'mp4' },
458
+ { name: 'MOV', value: 'mov' },
459
+ { name: 'AVI', value: 'avi' },
460
+ { name: 'MKV', value: 'mkv' },
461
+ ],
462
+ default: 'mp4',
463
+ description: 'Output format for the muted video file',
464
+ },
465
+ {
466
+ displayName: 'Audio Output Format',
467
+ name: 'separateAudioFormat',
468
+ type: 'options',
469
+ displayOptions: {
470
+ show: {
471
+ resource: ['video'],
472
+ operation: ['separateAudio'],
473
+ },
474
+ },
475
+ options: [
476
+ { name: 'MP3', value: 'mp3' },
477
+ { name: 'AAC', value: 'aac' },
478
+ { name: 'WAV', value: 'wav' },
479
+ { name: 'FLAC', value: 'flac' },
480
+ ],
481
+ default: 'mp3',
482
+ description: 'Output format for the extracted audio file',
483
+ },
484
+ {
485
+ displayName: 'Audio Codec',
486
+ name: 'separateAudioCodec',
487
+ type: 'options',
488
+ displayOptions: {
489
+ show: {
490
+ resource: ['video'],
491
+ operation: ['separateAudio'],
492
+ },
493
+ },
494
+ options: [
495
+ { name: 'Copy (No Re-encoding)', value: 'copy' },
496
+ { name: 'MP3 (libmp3lame)', value: 'libmp3lame' },
497
+ { name: 'AAC', value: 'aac' },
498
+ { name: 'FLAC', value: 'flac' },
499
+ { name: 'PCM 16-bit', value: 'pcm_s16le' },
500
+ ],
501
+ default: 'copy',
502
+ description: 'Audio codec for the extracted audio. "Copy" is fastest but may not work with all format combinations.',
503
+ },
504
+ {
505
+ displayName: 'Audio Bitrate',
506
+ name: 'separateAudioBitrate',
507
+ type: 'options',
508
+ displayOptions: {
509
+ show: {
510
+ resource: ['video'],
511
+ operation: ['separateAudio'],
512
+ },
513
+ },
514
+ options: [
515
+ { name: '128 kbps', value: '128k' },
516
+ { name: '192 kbps', value: '192k' },
517
+ { name: '256 kbps', value: '256k' },
518
+ { name: '320 kbps', value: '320k' },
519
+ ],
520
+ default: '192k',
521
+ description: 'Bitrate for the extracted audio (ignored when codec is "copy")',
522
+ },
523
+ {
524
+ displayName: 'Video Output Field Name',
525
+ name: 'separateVideoFieldName',
526
+ type: 'string',
527
+ displayOptions: {
528
+ show: {
529
+ resource: ['video'],
530
+ operation: ['separateAudio'],
531
+ },
532
+ },
533
+ default: 'video',
534
+ description: 'Name of the binary property where the muted video will be stored',
535
+ placeholder: 'video',
536
+ },
537
+ {
538
+ displayName: 'Audio Output Field Name',
539
+ name: 'separateAudioFieldName',
540
+ type: 'string',
541
+ displayOptions: {
542
+ show: {
543
+ resource: ['video'],
544
+ operation: ['separateAudio'],
545
+ },
546
+ },
547
+ default: 'audio',
548
+ description: 'Name of the binary property where the extracted audio will be stored',
549
+ placeholder: 'audio',
550
+ },
551
+ // ===================
552
+ // OVERLAY VIDEO FIELDS
553
+ // ===================
554
+ {
555
+ displayName: 'Main Video Source',
556
+ name: 'overlayMainSource',
557
+ type: 'fixedCollection',
558
+ placeholder: 'Add Main Video',
559
+ displayOptions: {
560
+ show: {
561
+ resource: ['video'],
562
+ operation: ['overlayVideo'],
563
+ },
564
+ },
565
+ default: {},
566
+ options: [
567
+ {
568
+ displayName: 'Source',
569
+ name: 'source',
570
+ values: [
571
+ {
572
+ displayName: 'Source Type',
573
+ name: 'sourceType',
574
+ type: 'options',
575
+ options: [
576
+ { name: 'URL', value: 'url' },
577
+ { name: 'Binary Data', value: 'binary' },
578
+ ],
579
+ default: 'url',
580
+ },
581
+ {
582
+ displayName: 'Value',
583
+ name: 'value',
584
+ type: 'string',
585
+ default: '',
586
+ placeholder: 'https://example.com/main-video.mp4',
587
+ displayOptions: { show: { sourceType: ['url'] } },
588
+ },
589
+ {
590
+ displayName: 'Binary Property',
591
+ name: 'binaryProperty',
592
+ type: 'string',
593
+ default: 'data',
594
+ description: 'Name of the binary property from the previous node',
595
+ placeholder: 'e.g., data, data1',
596
+ displayOptions: { show: { sourceType: ['binary'] } },
597
+ },
598
+ ],
599
+ },
600
+ ],
601
+ description: 'The main (background) video',
602
+ },
603
+ {
604
+ displayName: 'Overlay Video Source',
605
+ name: 'overlaySource',
606
+ type: 'fixedCollection',
607
+ placeholder: 'Add Overlay Video',
608
+ displayOptions: {
609
+ show: {
610
+ resource: ['video'],
611
+ operation: ['overlayVideo'],
612
+ },
613
+ },
614
+ default: {},
615
+ options: [
616
+ {
617
+ displayName: 'Source',
618
+ name: 'source',
619
+ values: [
620
+ {
621
+ displayName: 'Source Type',
622
+ name: 'sourceType',
623
+ type: 'options',
624
+ options: [
625
+ { name: 'URL', value: 'url' },
626
+ { name: 'Binary Data', value: 'binary' },
627
+ ],
628
+ default: 'url',
629
+ },
630
+ {
631
+ displayName: 'Value',
632
+ name: 'value',
633
+ type: 'string',
634
+ default: '',
635
+ placeholder: 'https://example.com/overlay-video.mp4',
636
+ displayOptions: { show: { sourceType: ['url'] } },
637
+ },
638
+ {
639
+ displayName: 'Binary Property',
640
+ name: 'binaryProperty',
641
+ type: 'string',
642
+ default: 'data2',
643
+ description: 'Name of the binary property from the previous node',
644
+ placeholder: 'e.g., data2, overlay',
645
+ displayOptions: { show: { sourceType: ['binary'] } },
646
+ },
647
+ ],
648
+ },
649
+ ],
650
+ description: 'The overlay (foreground) video to place on top',
651
+ },
652
+ {
653
+ displayName: 'Position Mode',
654
+ name: 'overlayPositionMode',
655
+ type: 'options',
656
+ displayOptions: {
657
+ show: {
658
+ resource: ['video'],
659
+ operation: ['overlayVideo'],
660
+ },
661
+ },
662
+ options: [
663
+ { name: 'Alignment (Preset Positions)', value: 'alignment' },
664
+ { name: 'Custom Coordinates', value: 'coordinates' },
665
+ ],
666
+ default: 'alignment',
667
+ description: 'How to position the overlay video',
668
+ },
669
+ {
670
+ displayName: 'Horizontal Alignment',
671
+ name: 'overlayHorizontalAlign',
672
+ type: 'options',
673
+ displayOptions: {
674
+ show: {
675
+ resource: ['video'],
676
+ operation: ['overlayVideo'],
677
+ overlayPositionMode: ['alignment'],
678
+ },
679
+ },
680
+ options: [
681
+ { name: 'Left', value: 'left' },
682
+ { name: 'Center', value: 'center' },
683
+ { name: 'Right', value: 'right' },
684
+ ],
685
+ default: 'center',
686
+ description: 'Horizontal alignment of the overlay',
687
+ },
688
+ {
689
+ displayName: 'Vertical Alignment',
690
+ name: 'overlayVerticalAlign',
691
+ type: 'options',
692
+ displayOptions: {
693
+ show: {
694
+ resource: ['video'],
695
+ operation: ['overlayVideo'],
696
+ overlayPositionMode: ['alignment'],
697
+ },
698
+ },
699
+ options: [
700
+ { name: 'Top', value: 'top' },
701
+ { name: 'Middle', value: 'middle' },
702
+ { name: 'Bottom', value: 'bottom' },
703
+ ],
704
+ default: 'middle',
705
+ description: 'Vertical alignment of the overlay',
706
+ },
707
+ {
708
+ displayName: 'Padding X (px)',
709
+ name: 'overlayPaddingX',
710
+ type: 'number',
711
+ displayOptions: {
712
+ show: {
713
+ resource: ['video'],
714
+ operation: ['overlayVideo'],
715
+ overlayPositionMode: ['alignment'],
716
+ },
717
+ },
718
+ default: 0,
719
+ description: 'Horizontal padding/margin from the edge in pixels',
720
+ },
721
+ {
722
+ displayName: 'Padding Y (px)',
723
+ name: 'overlayPaddingY',
724
+ type: 'number',
725
+ displayOptions: {
726
+ show: {
727
+ resource: ['video'],
728
+ operation: ['overlayVideo'],
729
+ overlayPositionMode: ['alignment'],
730
+ },
731
+ },
732
+ default: 0,
733
+ description: 'Vertical padding/margin from the edge in pixels',
734
+ },
735
+ {
736
+ displayName: 'Position X',
737
+ name: 'overlayX',
738
+ type: 'string',
739
+ displayOptions: {
740
+ show: {
741
+ resource: ['video'],
742
+ operation: ['overlayVideo'],
743
+ overlayPositionMode: ['coordinates'],
744
+ },
745
+ },
746
+ default: '0',
747
+ description: 'X position for the overlay. Can be a number (pixels) or FFmpeg expression like (main_w-overlay_w)/2 for center.',
748
+ placeholder: '0 or (main_w-overlay_w)/2',
749
+ },
750
+ {
751
+ displayName: 'Position Y',
752
+ name: 'overlayY',
753
+ type: 'string',
754
+ displayOptions: {
755
+ show: {
756
+ resource: ['video'],
757
+ operation: ['overlayVideo'],
758
+ overlayPositionMode: ['coordinates'],
759
+ },
760
+ },
761
+ default: '0',
762
+ description: 'Y position for the overlay. Can be a number (pixels) or FFmpeg expression like (main_h-overlay_h)/2 for center.',
763
+ placeholder: '0 or (main_h-overlay_h)/2',
764
+ },
765
+ {
766
+ displayName: 'Size Mode',
767
+ name: 'overlaySizeMode',
768
+ type: 'options',
769
+ displayOptions: {
770
+ show: {
771
+ resource: ['video'],
772
+ operation: ['overlayVideo'],
773
+ },
774
+ },
775
+ options: [
776
+ { name: 'Percentage of Main Video', value: 'percentage' },
777
+ { name: 'Pixels', value: 'pixels' },
778
+ { name: 'Original Size', value: 'original' },
779
+ ],
780
+ default: 'percentage',
781
+ description: 'How to specify the overlay size',
782
+ },
783
+ {
784
+ displayName: 'Width (%)',
785
+ name: 'overlayWidthPercent',
786
+ type: 'number',
787
+ typeOptions: {
788
+ minValue: 1,
789
+ maxValue: 100,
790
+ numberStepSize: 1,
791
+ },
792
+ displayOptions: {
793
+ show: {
794
+ resource: ['video'],
795
+ operation: ['overlayVideo'],
796
+ overlaySizeMode: ['percentage'],
797
+ },
798
+ },
799
+ default: 50,
800
+ description: 'Width of the overlay as percentage of main video width (1-100%)',
801
+ },
802
+ {
803
+ displayName: 'Height Mode',
804
+ name: 'overlayHeightMode',
805
+ type: 'options',
806
+ displayOptions: {
807
+ show: {
808
+ resource: ['video'],
809
+ operation: ['overlayVideo'],
810
+ overlaySizeMode: ['percentage'],
811
+ },
812
+ },
813
+ options: [
814
+ { name: 'Auto (Keep Aspect Ratio)', value: 'auto' },
815
+ { name: 'Percentage of Main Video', value: 'percentage' },
816
+ ],
817
+ default: 'auto',
818
+ description: 'How to determine overlay height',
819
+ },
820
+ {
821
+ displayName: 'Height (%)',
822
+ name: 'overlayHeightPercent',
823
+ type: 'number',
824
+ typeOptions: {
825
+ minValue: 1,
826
+ maxValue: 100,
827
+ numberStepSize: 1,
828
+ },
829
+ displayOptions: {
830
+ show: {
831
+ resource: ['video'],
832
+ operation: ['overlayVideo'],
833
+ overlaySizeMode: ['percentage'],
834
+ overlayHeightMode: ['percentage'],
835
+ },
836
+ },
837
+ default: 50,
838
+ description: 'Height of the overlay as percentage of main video height (1-100%)',
839
+ },
840
+ {
841
+ displayName: 'Width (px)',
842
+ name: 'overlayWidthPixels',
843
+ type: 'number',
844
+ displayOptions: {
845
+ show: {
846
+ resource: ['video'],
847
+ operation: ['overlayVideo'],
848
+ overlaySizeMode: ['pixels'],
849
+ },
850
+ },
851
+ default: 640,
852
+ description: 'Width of the overlay in pixels. Set to -1 to maintain aspect ratio.',
853
+ },
854
+ {
855
+ displayName: 'Height (px)',
856
+ name: 'overlayHeightPixels',
857
+ type: 'number',
858
+ displayOptions: {
859
+ show: {
860
+ resource: ['video'],
861
+ operation: ['overlayVideo'],
862
+ overlaySizeMode: ['pixels'],
863
+ },
864
+ },
865
+ default: -1,
866
+ description: 'Height of the overlay in pixels. Set to -1 to maintain aspect ratio.',
867
+ },
868
+ {
869
+ displayName: 'Opacity',
870
+ name: 'overlayOpacity',
871
+ type: 'number',
872
+ typeOptions: {
873
+ minValue: 0,
874
+ maxValue: 1,
875
+ numberStepSize: 0.1,
876
+ },
877
+ displayOptions: {
878
+ show: {
879
+ resource: ['video'],
880
+ operation: ['overlayVideo'],
881
+ },
882
+ },
883
+ default: 1,
884
+ description: 'Opacity of the overlay video (0 = transparent, 1 = opaque)',
885
+ },
886
+ {
887
+ displayName: 'Enable Time Control',
888
+ name: 'overlayEnableTimeControl',
889
+ type: 'boolean',
890
+ displayOptions: {
891
+ show: {
892
+ resource: ['video'],
893
+ operation: ['overlayVideo'],
894
+ },
895
+ },
896
+ default: false,
897
+ description: 'Whether to show the overlay only during a specific time range',
898
+ },
899
+ {
900
+ displayName: 'Start Time (seconds)',
901
+ name: 'overlayStartTime',
902
+ type: 'number',
903
+ displayOptions: {
904
+ show: {
905
+ resource: ['video'],
906
+ operation: ['overlayVideo'],
907
+ overlayEnableTimeControl: [true],
908
+ },
909
+ },
910
+ default: 0,
911
+ description: 'Time in seconds when the overlay should start appearing',
912
+ },
913
+ {
914
+ displayName: 'End Time (seconds)',
915
+ name: 'overlayEndTime',
916
+ type: 'number',
917
+ displayOptions: {
918
+ show: {
919
+ resource: ['video'],
920
+ operation: ['overlayVideo'],
921
+ overlayEnableTimeControl: [true],
922
+ },
923
+ },
924
+ default: 0,
925
+ description: 'Time in seconds when the overlay should stop appearing (0 = until end)',
926
+ },
927
+ {
928
+ displayName: 'Audio Handling',
929
+ name: 'overlayAudioHandling',
930
+ type: 'options',
931
+ displayOptions: {
932
+ show: {
933
+ resource: ['video'],
934
+ operation: ['overlayVideo'],
935
+ },
936
+ },
937
+ options: [
938
+ { name: 'Main Video Audio Only', value: 'main' },
939
+ { name: 'Overlay Video Audio Only', value: 'overlay' },
940
+ { name: 'Mix Both Audio Tracks', value: 'mix' },
941
+ { name: 'No Audio', value: 'none' },
942
+ ],
943
+ default: 'main',
944
+ description: 'How to handle audio from both videos',
945
+ },
946
+ {
947
+ displayName: 'Main Audio Volume',
948
+ name: 'overlayMainVolume',
949
+ type: 'number',
950
+ typeOptions: {
951
+ minValue: 0,
952
+ maxValue: 2,
953
+ numberStepSize: 0.1,
954
+ },
955
+ displayOptions: {
956
+ show: {
957
+ resource: ['video'],
958
+ operation: ['overlayVideo'],
959
+ overlayAudioHandling: ['mix'],
960
+ },
961
+ },
962
+ default: 1,
963
+ description: 'Volume level for main video audio (1 = 100%)',
964
+ },
965
+ {
966
+ displayName: 'Overlay Audio Volume',
967
+ name: 'overlayOverlayVolume',
968
+ type: 'number',
969
+ typeOptions: {
970
+ minValue: 0,
971
+ maxValue: 2,
972
+ numberStepSize: 0.1,
973
+ },
974
+ displayOptions: {
975
+ show: {
976
+ resource: ['video'],
977
+ operation: ['overlayVideo'],
978
+ overlayAudioHandling: ['mix'],
979
+ },
980
+ },
981
+ default: 0.5,
982
+ description: 'Volume level for overlay video audio (1 = 100%)',
983
+ },
984
+ {
985
+ displayName: 'Output Format',
986
+ name: 'overlayOutputFormat',
987
+ type: 'options',
988
+ displayOptions: {
989
+ show: {
990
+ resource: ['video'],
991
+ operation: ['overlayVideo'],
992
+ },
993
+ },
994
+ options: [
995
+ { name: 'MP4', value: 'mp4' },
996
+ { name: 'MOV', value: 'mov' },
997
+ { name: 'AVI', value: 'avi' },
998
+ { name: 'MKV', value: 'mkv' },
999
+ ],
1000
+ default: 'mp4',
1001
+ description: 'Output format for the resulting video',
1002
+ },
1003
+ // ===================
1004
+ // VIDEO SPEED FIELDS
1005
+ // ===================
1006
+ {
1007
+ displayName: 'Video Source',
1008
+ name: 'speedSource',
1009
+ type: 'fixedCollection',
1010
+ placeholder: 'Add Video Source',
1011
+ displayOptions: {
1012
+ show: {
1013
+ resource: ['video'],
1014
+ operation: ['speed'],
1015
+ },
1016
+ },
1017
+ default: {},
1018
+ options: [
1019
+ {
1020
+ displayName: 'Source',
1021
+ name: 'source',
1022
+ values: [
1023
+ {
1024
+ displayName: 'Source Type',
1025
+ name: 'sourceType',
1026
+ type: 'options',
1027
+ options: [
1028
+ { name: 'URL', value: 'url' },
1029
+ { name: 'Binary Data', value: 'binary' },
1030
+ ],
1031
+ default: 'url',
1032
+ },
1033
+ {
1034
+ displayName: 'Value',
1035
+ name: 'value',
1036
+ type: 'string',
1037
+ default: '',
1038
+ placeholder: 'https://example.com/video.mp4',
1039
+ displayOptions: { show: { sourceType: ['url'] } },
1040
+ },
1041
+ {
1042
+ displayName: 'Binary Property',
1043
+ name: 'binaryProperty',
1044
+ type: 'string',
1045
+ default: 'data',
1046
+ description: 'Name of the binary property from the previous node',
1047
+ placeholder: 'e.g., data',
1048
+ displayOptions: { show: { sourceType: ['binary'] } },
1049
+ },
1050
+ ],
1051
+ },
1052
+ ],
1053
+ },
1054
+ {
1055
+ displayName: 'Speed',
1056
+ name: 'speed',
1057
+ type: 'number',
1058
+ typeOptions: {
1059
+ minValue: 0.25,
1060
+ maxValue: 4,
1061
+ numberStepSize: 0.25,
1062
+ },
1063
+ displayOptions: {
1064
+ show: {
1065
+ resource: ['video'],
1066
+ operation: ['speed'],
1067
+ },
1068
+ },
1069
+ default: 1,
1070
+ description: 'Speed multiplier. 0.5 = half speed (slow motion), 2 = double speed (fast forward). Range: 0.25x to 4x.',
1071
+ },
1072
+ {
1073
+ displayName: 'Adjust Audio',
1074
+ name: 'adjustAudio',
1075
+ type: 'boolean',
1076
+ displayOptions: {
1077
+ show: {
1078
+ resource: ['video'],
1079
+ operation: ['speed'],
1080
+ },
1081
+ },
1082
+ default: true,
1083
+ description: 'Whether to adjust audio speed along with video. If disabled, audio will be removed.',
1084
+ },
1085
+ {
1086
+ displayName: 'Maintain Audio Pitch',
1087
+ name: 'maintainPitch',
1088
+ type: 'boolean',
1089
+ displayOptions: {
1090
+ show: {
1091
+ resource: ['video'],
1092
+ operation: ['speed'],
1093
+ adjustAudio: [true],
1094
+ },
1095
+ },
1096
+ default: false,
1097
+ description: 'Whether to maintain the original audio pitch when changing speed. Note: This may not work on all systems.',
1098
+ },
1099
+ {
1100
+ displayName: 'Output Format',
1101
+ name: 'speedOutputFormat',
1102
+ type: 'options',
1103
+ displayOptions: {
1104
+ show: {
1105
+ resource: ['video'],
1106
+ operation: ['speed'],
1107
+ },
1108
+ },
1109
+ options: [
1110
+ { name: 'MP4', value: 'mp4' },
1111
+ { name: 'MOV', value: 'mov' },
1112
+ { name: 'AVI', value: 'avi' },
1113
+ { name: 'MKV', value: 'mkv' },
1114
+ ],
1115
+ default: 'mp4',
1116
+ description: 'Output format for the speed-adjusted video',
1117
+ },
1118
+ // ===================
1119
+ // OUTPUT FIELD NAME
1120
+ // ===================
1121
+ {
1122
+ displayName: 'Output Field Name',
1123
+ name: 'outputFieldName',
1124
+ type: 'string',
1125
+ displayOptions: {
1126
+ show: {
1127
+ resource: ['video'],
1128
+ operation: ['merge', 'trim', 'speed', 'multiTransition', 'singleFade', 'overlayVideo'],
1129
+ },
1130
+ },
1131
+ default: 'data',
1132
+ description: 'Name of the binary property where the output video will be stored',
1133
+ placeholder: 'data',
1134
+ },
1135
+ ];