n8n-nodes-eranol 0.1.1

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 (67) hide show
  1. package/dist/credentials/EranolApi.credentials.d.ts +10 -0
  2. package/dist/credentials/EranolApi.credentials.js +37 -0
  3. package/dist/nodes/Eranol/Eranol.node.d.ts +4 -0
  4. package/dist/nodes/Eranol/Eranol.node.js +78 -0
  5. package/dist/nodes/Eranol/eranol.png +0 -0
  6. package/dist/nodes/Eranol/eranol.svg +12 -0
  7. package/dist/nodes/Eranol/resources/audio/denoise.d.ts +2 -0
  8. package/dist/nodes/Eranol/resources/audio/denoise.js +66 -0
  9. package/dist/nodes/Eranol/resources/audio/highlights.d.ts +2 -0
  10. package/dist/nodes/Eranol/resources/audio/highlights.js +62 -0
  11. package/dist/nodes/Eranol/resources/audio/index.d.ts +2 -0
  12. package/dist/nodes/Eranol/resources/audio/index.js +61 -0
  13. package/dist/nodes/Eranol/resources/audio/removeSilence.d.ts +2 -0
  14. package/dist/nodes/Eranol/resources/audio/removeSilence.js +77 -0
  15. package/dist/nodes/Eranol/resources/compose/index.d.ts +2 -0
  16. package/dist/nodes/Eranol/resources/compose/index.js +33 -0
  17. package/dist/nodes/Eranol/resources/compose/merge.d.ts +2 -0
  18. package/dist/nodes/Eranol/resources/compose/merge.js +211 -0
  19. package/dist/nodes/Eranol/resources/convert/audioToMp3.d.ts +2 -0
  20. package/dist/nodes/Eranol/resources/convert/audioToMp3.js +25 -0
  21. package/dist/nodes/Eranol/resources/convert/audioToWav.d.ts +2 -0
  22. package/dist/nodes/Eranol/resources/convert/audioToWav.js +25 -0
  23. package/dist/nodes/Eranol/resources/convert/imageToJpg.d.ts +2 -0
  24. package/dist/nodes/Eranol/resources/convert/imageToJpg.js +25 -0
  25. package/dist/nodes/Eranol/resources/convert/imageToWebp.d.ts +2 -0
  26. package/dist/nodes/Eranol/resources/convert/imageToWebp.js +25 -0
  27. package/dist/nodes/Eranol/resources/convert/index.d.ts +2 -0
  28. package/dist/nodes/Eranol/resources/convert/index.js +103 -0
  29. package/dist/nodes/Eranol/resources/convert/videoToMp4.d.ts +2 -0
  30. package/dist/nodes/Eranol/resources/convert/videoToMp4.js +25 -0
  31. package/dist/nodes/Eranol/resources/convert/videoToWebm.d.ts +2 -0
  32. package/dist/nodes/Eranol/resources/convert/videoToWebm.js +25 -0
  33. package/dist/nodes/Eranol/resources/job/deleteJob.d.ts +2 -0
  34. package/dist/nodes/Eranol/resources/job/deleteJob.js +20 -0
  35. package/dist/nodes/Eranol/resources/job/getResult.d.ts +2 -0
  36. package/dist/nodes/Eranol/resources/job/getResult.js +20 -0
  37. package/dist/nodes/Eranol/resources/job/getStatus.d.ts +2 -0
  38. package/dist/nodes/Eranol/resources/job/getStatus.js +20 -0
  39. package/dist/nodes/Eranol/resources/job/index.d.ts +2 -0
  40. package/dist/nodes/Eranol/resources/job/index.js +61 -0
  41. package/dist/nodes/Eranol/resources/video/addIntro.d.ts +2 -0
  42. package/dist/nodes/Eranol/resources/video/addIntro.js +41 -0
  43. package/dist/nodes/Eranol/resources/video/addOutro.d.ts +2 -0
  44. package/dist/nodes/Eranol/resources/video/addOutro.js +41 -0
  45. package/dist/nodes/Eranol/resources/video/caption.d.ts +2 -0
  46. package/dist/nodes/Eranol/resources/video/caption.js +133 -0
  47. package/dist/nodes/Eranol/resources/video/extractAudio.d.ts +2 -0
  48. package/dist/nodes/Eranol/resources/video/extractAudio.js +49 -0
  49. package/dist/nodes/Eranol/resources/video/extractImages.d.ts +2 -0
  50. package/dist/nodes/Eranol/resources/video/extractImages.js +79 -0
  51. package/dist/nodes/Eranol/resources/video/generateGif.d.ts +2 -0
  52. package/dist/nodes/Eranol/resources/video/generateGif.js +92 -0
  53. package/dist/nodes/Eranol/resources/video/index.d.ts +2 -0
  54. package/dist/nodes/Eranol/resources/video/index.js +187 -0
  55. package/dist/nodes/Eranol/resources/video/overlay.d.ts +2 -0
  56. package/dist/nodes/Eranol/resources/video/overlay.js +133 -0
  57. package/dist/nodes/Eranol/resources/video/progressBar.d.ts +2 -0
  58. package/dist/nodes/Eranol/resources/video/progressBar.js +110 -0
  59. package/dist/nodes/Eranol/resources/video/reframe.d.ts +2 -0
  60. package/dist/nodes/Eranol/resources/video/reframe.js +79 -0
  61. package/dist/nodes/Eranol/resources/video/thumbnail.d.ts +2 -0
  62. package/dist/nodes/Eranol/resources/video/thumbnail.js +145 -0
  63. package/dist/nodes/Eranol/resources/video/trim.d.ts +2 -0
  64. package/dist/nodes/Eranol/resources/video/trim.js +56 -0
  65. package/dist/nodes/Eranol/resources/video/watermark.d.ts +2 -0
  66. package/dist/nodes/Eranol/resources/video/watermark.js +112 -0
  67. package/package.json +51 -0
@@ -0,0 +1,10 @@
1
+ import type { IAuthenticateGeneric, ICredentialType, INodeProperties, Icon, ICredentialTestRequest } from 'n8n-workflow';
2
+ export declare class EranolApi implements ICredentialType {
3
+ name: string;
4
+ displayName: string;
5
+ documentationUrl: string;
6
+ icon: Icon;
7
+ test: ICredentialTestRequest;
8
+ properties: INodeProperties[];
9
+ authenticate: IAuthenticateGeneric;
10
+ }
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EranolApi = void 0;
4
+ class EranolApi {
5
+ constructor() {
6
+ this.name = 'eranolApi';
7
+ this.displayName = 'Eranol API';
8
+ this.documentationUrl = 'https://www.eranol.com/documentation';
9
+ this.icon = 'file:../nodes/Eranol/eranol.svg';
10
+ this.test = {
11
+ request: {
12
+ baseURL: 'https://eranol.com/api/v1',
13
+ url: '/me',
14
+ },
15
+ };
16
+ this.properties = [
17
+ {
18
+ displayName: 'API Key',
19
+ name: 'apiKey',
20
+ type: 'string',
21
+ typeOptions: { password: true },
22
+ default: '',
23
+ required: true,
24
+ description: 'Your Eranol API key',
25
+ },
26
+ ];
27
+ this.authenticate = {
28
+ type: 'generic',
29
+ properties: {
30
+ headers: {
31
+ 'x-api-key': '={{$credentials.apiKey}}',
32
+ },
33
+ },
34
+ };
35
+ }
36
+ }
37
+ exports.EranolApi = EranolApi;
@@ -0,0 +1,4 @@
1
+ import { type INodeType, type INodeTypeDescription } from 'n8n-workflow';
2
+ export declare class Eranol implements INodeType {
3
+ description: INodeTypeDescription;
4
+ }
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Eranol = void 0;
4
+ const n8n_workflow_1 = require("n8n-workflow");
5
+ const video_1 = require("./resources/video");
6
+ const audio_1 = require("./resources/audio");
7
+ const convert_1 = require("./resources/convert");
8
+ const compose_1 = require("./resources/compose");
9
+ const job_1 = require("./resources/job");
10
+ class Eranol {
11
+ constructor() {
12
+ this.description = {
13
+ displayName: 'Eranol',
14
+ name: 'eranol',
15
+ icon: 'file:eranol.svg',
16
+ group: ['transform'],
17
+ version: 1,
18
+ subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
19
+ description: 'Interact with the Eranol FFmpeg media processing API',
20
+ defaults: {
21
+ name: 'Eranol',
22
+ },
23
+ inputs: [n8n_workflow_1.NodeConnectionTypes.Main],
24
+ outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
25
+ credentials: [
26
+ {
27
+ name: 'eranolApi',
28
+ required: true,
29
+ },
30
+ ],
31
+ requestDefaults: {
32
+ baseURL: 'https://eranol.com/api/v1',
33
+ headers: {
34
+ Accept: 'application/json',
35
+ 'Content-Type': 'application/json',
36
+ },
37
+ },
38
+ properties: [
39
+ {
40
+ displayName: 'Resource',
41
+ name: 'resource',
42
+ type: 'options',
43
+ noDataExpression: true,
44
+ options: [
45
+ {
46
+ name: 'Audio',
47
+ value: 'audio',
48
+ },
49
+ {
50
+ name: 'Compose',
51
+ value: 'compose',
52
+ },
53
+ {
54
+ name: 'Convert',
55
+ value: 'convert',
56
+ },
57
+ {
58
+ name: 'Job',
59
+ value: 'job',
60
+ },
61
+ {
62
+ name: 'Video',
63
+ value: 'video',
64
+ },
65
+ ],
66
+ default: 'video',
67
+ },
68
+ ...video_1.videoDescription,
69
+ ...audio_1.audioDescription,
70
+ ...convert_1.convertDescription,
71
+ ...compose_1.composeDescription,
72
+ ...job_1.jobDescription,
73
+ ],
74
+ usableAsTool: true,
75
+ };
76
+ }
77
+ }
78
+ exports.Eranol = Eranol;
Binary file
@@ -0,0 +1,12 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" fill="none">
2
+ <g transform="translate(32,32)">
3
+ <!-- Vertical bar -->
4
+ <rect x="-5" y="-28" width="10" height="56" rx="2" fill="#2DB87F"/>
5
+ <!-- Horizontal bar -->
6
+ <rect x="-28" y="-5" width="56" height="10" rx="2" fill="#2DB87F"/>
7
+ <!-- Diagonal bar (top-left to bottom-right) -->
8
+ <rect x="-5" y="-28" width="10" height="56" rx="2" fill="#2DB87F" transform="rotate(45)"/>
9
+ <!-- Diagonal bar (top-right to bottom-left) -->
10
+ <rect x="-5" y="-28" width="10" height="56" rx="2" fill="#2DB87F" transform="rotate(-45)"/>
11
+ </g>
12
+ </svg>
@@ -0,0 +1,2 @@
1
+ import type { INodeProperties } from 'n8n-workflow';
2
+ export declare const denoiseDescription: INodeProperties[];
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.denoiseDescription = void 0;
4
+ const displayOptions = {
5
+ show: {
6
+ resource: ['audio'],
7
+ operation: ['denoise'],
8
+ },
9
+ };
10
+ exports.denoiseDescription = [
11
+ {
12
+ displayName: 'Audio URL',
13
+ name: 'url',
14
+ type: 'string',
15
+ required: true,
16
+ default: '',
17
+ displayOptions,
18
+ description: 'URL of the audio file to denoise',
19
+ routing: {
20
+ send: {
21
+ type: 'body',
22
+ property: 'url',
23
+ },
24
+ },
25
+ },
26
+ {
27
+ displayName: 'Additional Fields',
28
+ name: 'additionalFields',
29
+ type: 'collection',
30
+ placeholder: 'Add Field',
31
+ default: {},
32
+ displayOptions,
33
+ options: [
34
+ {
35
+ displayName: 'Method',
36
+ name: 'method',
37
+ type: 'options',
38
+ default: 'fft',
39
+ options: [
40
+ { name: 'FFT', value: 'fft' },
41
+ { name: 'RNN', value: 'rnn' },
42
+ ],
43
+ description: 'Noise reduction method',
44
+ routing: {
45
+ send: {
46
+ type: 'body',
47
+ property: 'method',
48
+ },
49
+ },
50
+ },
51
+ {
52
+ displayName: 'Noise Reduction (dB)',
53
+ name: 'noiseReduction',
54
+ type: 'number',
55
+ default: 12,
56
+ description: 'Amount of noise reduction in decibels',
57
+ routing: {
58
+ send: {
59
+ type: 'body',
60
+ property: 'noise_reduction',
61
+ },
62
+ },
63
+ },
64
+ ],
65
+ },
66
+ ];
@@ -0,0 +1,2 @@
1
+ import type { INodeProperties } from 'n8n-workflow';
2
+ export declare const highlightsDescription: INodeProperties[];
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.highlightsDescription = void 0;
4
+ const displayOptions = {
5
+ show: {
6
+ resource: ['audio'],
7
+ operation: ['highlights'],
8
+ },
9
+ };
10
+ exports.highlightsDescription = [
11
+ {
12
+ displayName: 'Audio URL',
13
+ name: 'url',
14
+ type: 'string',
15
+ required: true,
16
+ default: '',
17
+ displayOptions,
18
+ description: 'URL of the audio file to extract highlights from',
19
+ routing: {
20
+ send: {
21
+ type: 'body',
22
+ property: 'url',
23
+ },
24
+ },
25
+ },
26
+ {
27
+ displayName: 'Additional Fields',
28
+ name: 'additionalFields',
29
+ type: 'collection',
30
+ placeholder: 'Add Field',
31
+ default: {},
32
+ displayOptions,
33
+ options: [
34
+ {
35
+ displayName: 'Top N',
36
+ name: 'topN',
37
+ type: 'number',
38
+ default: 5,
39
+ description: 'Number of top highlights to extract',
40
+ routing: {
41
+ send: {
42
+ type: 'body',
43
+ property: 'top_n',
44
+ },
45
+ },
46
+ },
47
+ {
48
+ displayName: 'Clip Duration',
49
+ name: 'clipDuration',
50
+ type: 'number',
51
+ default: 10,
52
+ description: 'Duration of each highlight clip in seconds',
53
+ routing: {
54
+ send: {
55
+ type: 'body',
56
+ property: 'clip_duration',
57
+ },
58
+ },
59
+ },
60
+ ],
61
+ },
62
+ ];
@@ -0,0 +1,2 @@
1
+ import type { INodeProperties } from 'n8n-workflow';
2
+ export declare const audioDescription: INodeProperties[];
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.audioDescription = void 0;
4
+ const denoise_1 = require("./denoise");
5
+ const removeSilence_1 = require("./removeSilence");
6
+ const highlights_1 = require("./highlights");
7
+ exports.audioDescription = [
8
+ {
9
+ displayName: 'Operation',
10
+ name: 'operation',
11
+ type: 'options',
12
+ noDataExpression: true,
13
+ displayOptions: {
14
+ show: {
15
+ resource: ['audio'],
16
+ },
17
+ },
18
+ options: [
19
+ {
20
+ name: 'Denoise',
21
+ value: 'denoise',
22
+ action: 'Denoise audio',
23
+ description: 'Remove background noise from audio',
24
+ routing: {
25
+ request: {
26
+ method: 'POST',
27
+ url: '/ffmpeg/audio/denoise',
28
+ },
29
+ },
30
+ },
31
+ {
32
+ name: 'Highlights',
33
+ value: 'highlights',
34
+ action: 'Extract audio highlights',
35
+ description: 'Extract the loudest segments based on RMS energy',
36
+ routing: {
37
+ request: {
38
+ method: 'POST',
39
+ url: '/ffmpeg/audio/highlights',
40
+ },
41
+ },
42
+ },
43
+ {
44
+ name: 'Remove Silence',
45
+ value: 'removeSilence',
46
+ action: 'Remove silence from audio',
47
+ description: 'Detect and eliminate quiet gaps in audio',
48
+ routing: {
49
+ request: {
50
+ method: 'POST',
51
+ url: '/ffmpeg/audio/remove-silence',
52
+ },
53
+ },
54
+ },
55
+ ],
56
+ default: 'denoise',
57
+ },
58
+ ...denoise_1.denoiseDescription,
59
+ ...removeSilence_1.removeSilenceDescription,
60
+ ...highlights_1.highlightsDescription,
61
+ ];
@@ -0,0 +1,2 @@
1
+ import type { INodeProperties } from 'n8n-workflow';
2
+ export declare const removeSilenceDescription: INodeProperties[];
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.removeSilenceDescription = void 0;
4
+ const displayOptions = {
5
+ show: {
6
+ resource: ['audio'],
7
+ operation: ['removeSilence'],
8
+ },
9
+ };
10
+ exports.removeSilenceDescription = [
11
+ {
12
+ displayName: 'Audio URL',
13
+ name: 'url',
14
+ type: 'string',
15
+ required: true,
16
+ default: '',
17
+ displayOptions,
18
+ description: 'URL of the audio file to process',
19
+ routing: {
20
+ send: {
21
+ type: 'body',
22
+ property: 'url',
23
+ },
24
+ },
25
+ },
26
+ {
27
+ displayName: 'Additional Fields',
28
+ name: 'additionalFields',
29
+ type: 'collection',
30
+ placeholder: 'Add Field',
31
+ default: {},
32
+ displayOptions,
33
+ options: [
34
+ {
35
+ displayName: 'Silence Threshold (dB)',
36
+ name: 'silenceThreshDb',
37
+ type: 'number',
38
+ default: -40,
39
+ description: 'Volume threshold below which audio is considered silence',
40
+ routing: {
41
+ send: {
42
+ type: 'body',
43
+ property: 'silence_thresh_db',
44
+ },
45
+ },
46
+ },
47
+ {
48
+ displayName: 'Min Silence Duration',
49
+ name: 'minSilenceDuration',
50
+ type: 'number',
51
+ typeOptions: { numberPrecision: 2 },
52
+ default: 0.5,
53
+ description: 'Minimum duration of silence to remove (seconds)',
54
+ routing: {
55
+ send: {
56
+ type: 'body',
57
+ property: 'min_silence_duration',
58
+ },
59
+ },
60
+ },
61
+ {
62
+ displayName: 'Padding',
63
+ name: 'padding',
64
+ type: 'number',
65
+ typeOptions: { numberPrecision: 2 },
66
+ default: 0.1,
67
+ description: 'Padding to keep around non-silent segments (seconds)',
68
+ routing: {
69
+ send: {
70
+ type: 'body',
71
+ property: 'padding',
72
+ },
73
+ },
74
+ },
75
+ ],
76
+ },
77
+ ];
@@ -0,0 +1,2 @@
1
+ import type { INodeProperties } from 'n8n-workflow';
2
+ export declare const composeDescription: INodeProperties[];
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.composeDescription = void 0;
4
+ const merge_1 = require("./merge");
5
+ exports.composeDescription = [
6
+ {
7
+ displayName: 'Operation',
8
+ name: 'operation',
9
+ type: 'options',
10
+ noDataExpression: true,
11
+ displayOptions: {
12
+ show: {
13
+ resource: ['compose'],
14
+ },
15
+ },
16
+ options: [
17
+ {
18
+ name: 'Merge',
19
+ value: 'merge',
20
+ action: 'Merge images and audio into video',
21
+ description: 'Combine image slides with audio into a video',
22
+ routing: {
23
+ request: {
24
+ method: 'POST',
25
+ url: '/ffmpeg/merge',
26
+ },
27
+ },
28
+ },
29
+ ],
30
+ default: 'merge',
31
+ },
32
+ ...merge_1.mergeDescription,
33
+ ];
@@ -0,0 +1,2 @@
1
+ import type { INodeProperties } from 'n8n-workflow';
2
+ export declare const mergeDescription: INodeProperties[];
@@ -0,0 +1,211 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mergeDescription = void 0;
4
+ const displayOptions = {
5
+ show: {
6
+ resource: ['compose'],
7
+ operation: ['merge'],
8
+ },
9
+ };
10
+ exports.mergeDescription = [
11
+ {
12
+ displayName: 'Images',
13
+ name: 'images',
14
+ type: 'fixedCollection',
15
+ typeOptions: {
16
+ multipleValues: true,
17
+ },
18
+ required: true,
19
+ default: {},
20
+ displayOptions,
21
+ description: 'Image slides to combine into video',
22
+ options: [
23
+ {
24
+ name: 'imageValues',
25
+ displayName: 'Image',
26
+ values: [
27
+ {
28
+ displayName: 'Image URL',
29
+ name: 'url',
30
+ type: 'string',
31
+ default: '',
32
+ required: true,
33
+ description: 'URL of the image',
34
+ },
35
+ {
36
+ displayName: 'Duration (Seconds)',
37
+ name: 'duration',
38
+ type: 'number',
39
+ default: 5,
40
+ required: true,
41
+ description: 'How long this image is displayed',
42
+ },
43
+ ],
44
+ },
45
+ ],
46
+ routing: {
47
+ send: {
48
+ type: 'body',
49
+ property: 'images',
50
+ value: '={{$value.imageValues}}',
51
+ },
52
+ },
53
+ },
54
+ {
55
+ displayName: 'Audio URL',
56
+ name: 'audioUrl',
57
+ type: 'string',
58
+ required: true,
59
+ default: '',
60
+ displayOptions,
61
+ description: 'URL of the audio track',
62
+ routing: {
63
+ send: {
64
+ type: 'body',
65
+ property: 'audio_url',
66
+ },
67
+ },
68
+ },
69
+ {
70
+ displayName: 'Additional Fields',
71
+ name: 'additionalFields',
72
+ type: 'collection',
73
+ placeholder: 'Add Field',
74
+ default: {},
75
+ displayOptions,
76
+ options: [
77
+ {
78
+ displayName: 'Audio Mode',
79
+ name: 'audioMode',
80
+ type: 'options',
81
+ default: 'trim',
82
+ options: [
83
+ { name: 'Trim', value: 'trim' },
84
+ { name: 'Loop', value: 'loop' },
85
+ ],
86
+ description: 'How audio length is handled relative to video',
87
+ routing: {
88
+ send: {
89
+ type: 'body',
90
+ property: 'audio_mode',
91
+ },
92
+ },
93
+ },
94
+ {
95
+ displayName: 'Background Audio URL',
96
+ name: 'bgAudioUrl',
97
+ type: 'string',
98
+ default: '',
99
+ description: 'URL of a background audio track to mix in',
100
+ routing: {
101
+ send: {
102
+ type: 'body',
103
+ property: 'bg_audio_url',
104
+ },
105
+ },
106
+ },
107
+ {
108
+ displayName: 'Background Audio Volume',
109
+ name: 'bgAudioVolume',
110
+ type: 'number',
111
+ typeOptions: { minValue: 0, maxValue: 1, numberPrecision: 2 },
112
+ default: 0.3,
113
+ description: 'Volume level for the background audio (0-1)',
114
+ routing: {
115
+ send: {
116
+ type: 'body',
117
+ property: 'bg_audio_volume',
118
+ },
119
+ },
120
+ },
121
+ {
122
+ displayName: 'Fade Duration (Seconds)',
123
+ name: 'fadeSecs',
124
+ type: 'number',
125
+ typeOptions: { numberPrecision: 1 },
126
+ default: 0.5,
127
+ description: 'Duration of the fade transition in seconds',
128
+ routing: {
129
+ send: {
130
+ type: 'body',
131
+ property: 'fade_secs',
132
+ },
133
+ },
134
+ },
135
+ {
136
+ displayName: 'Fit',
137
+ name: 'fit',
138
+ type: 'options',
139
+ default: 'cover',
140
+ options: [
141
+ { name: 'Cover', value: 'cover' },
142
+ { name: 'Contain', value: 'contain' },
143
+ { name: 'Fill', value: 'fill' },
144
+ ],
145
+ description: 'How images are fit to the output dimensions',
146
+ routing: {
147
+ send: {
148
+ type: 'body',
149
+ property: 'fit',
150
+ },
151
+ },
152
+ },
153
+ {
154
+ displayName: 'FPS',
155
+ name: 'fps',
156
+ type: 'number',
157
+ default: 30,
158
+ description: 'Frames per second for the output video',
159
+ routing: {
160
+ send: {
161
+ type: 'body',
162
+ property: 'fps',
163
+ },
164
+ },
165
+ },
166
+ {
167
+ displayName: 'Height',
168
+ name: 'height',
169
+ type: 'number',
170
+ default: 1080,
171
+ description: 'Output video height in pixels',
172
+ routing: {
173
+ send: {
174
+ type: 'body',
175
+ property: 'height',
176
+ },
177
+ },
178
+ },
179
+ {
180
+ displayName: 'Transition',
181
+ name: 'transition',
182
+ type: 'options',
183
+ default: 'fade',
184
+ options: [
185
+ { name: 'Fade', value: 'fade' },
186
+ { name: 'None', value: 'none' },
187
+ ],
188
+ description: 'Transition effect between slides',
189
+ routing: {
190
+ send: {
191
+ type: 'body',
192
+ property: 'transition',
193
+ },
194
+ },
195
+ },
196
+ {
197
+ displayName: 'Width',
198
+ name: 'width',
199
+ type: 'number',
200
+ default: 1920,
201
+ description: 'Output video width in pixels',
202
+ routing: {
203
+ send: {
204
+ type: 'body',
205
+ property: 'width',
206
+ },
207
+ },
208
+ },
209
+ ],
210
+ },
211
+ ];