n8n-nodes-eranol 0.2.4 → 0.2.9
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.
- package/dist/nodes/Eranol/Eranol.node.d.ts +2 -1
- package/dist/nodes/Eranol/Eranol.node.js +309 -7
- package/dist/nodes/Eranol/resources/audio/denoise.js +0 -24
- package/dist/nodes/Eranol/resources/audio/highlights.js +0 -24
- package/dist/nodes/Eranol/resources/audio/index.js +0 -21
- package/dist/nodes/Eranol/resources/audio/removeSilence.js +0 -30
- package/dist/nodes/Eranol/resources/compose/composeVideo.js +0 -19
- package/dist/nodes/Eranol/resources/compose/concat.js +0 -13
- package/dist/nodes/Eranol/resources/compose/index.js +0 -21
- package/dist/nodes/Eranol/resources/compose/merge.js +0 -73
- package/dist/nodes/Eranol/resources/convert/audioToMp3.js +0 -12
- package/dist/nodes/Eranol/resources/convert/audioToWav.js +0 -12
- package/dist/nodes/Eranol/resources/convert/imageToJpg.js +0 -12
- package/dist/nodes/Eranol/resources/convert/imageToWebp.js +0 -12
- package/dist/nodes/Eranol/resources/convert/index.js +0 -42
- package/dist/nodes/Eranol/resources/convert/videoToMp4.js +0 -12
- package/dist/nodes/Eranol/resources/convert/videoToWebm.js +0 -12
- package/dist/nodes/Eranol/resources/image/generateImage.js +0 -36
- package/dist/nodes/Eranol/resources/image/index.js +0 -13
- package/dist/nodes/Eranol/resources/job/index.js +0 -24
- package/dist/nodes/Eranol/resources/notify/index.js +0 -7
- package/dist/nodes/Eranol/resources/notify/sendEmail.js +0 -24
- package/dist/nodes/Eranol/resources/video/addIntro.js +0 -18
- package/dist/nodes/Eranol/resources/video/addOutro.js +0 -18
- package/dist/nodes/Eranol/resources/video/caption.js +0 -54
- package/dist/nodes/Eranol/resources/video/extractAudio.js +0 -18
- package/dist/nodes/Eranol/resources/video/extractImages.js +0 -30
- package/dist/nodes/Eranol/resources/video/generateGif.js +0 -36
- package/dist/nodes/Eranol/resources/video/index.js +0 -84
- package/dist/nodes/Eranol/resources/video/overlay.js +2 -27
- package/dist/nodes/Eranol/resources/video/progressBar.js +0 -42
- package/dist/nodes/Eranol/resources/video/reframe.js +0 -30
- package/dist/nodes/Eranol/resources/video/thumbnail.js +0 -60
- package/dist/nodes/Eranol/resources/video/trim.js +0 -24
- package/dist/nodes/Eranol/resources/video/watermark.js +0 -42
- package/package.json +1 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { type INodeType, type INodeTypeDescription } from 'n8n-workflow';
|
|
1
|
+
import { type IExecuteFunctions, type INodeExecutionData, type INodeType, type INodeTypeDescription } from 'n8n-workflow';
|
|
2
2
|
export declare class Eranol implements INodeType {
|
|
3
3
|
description: INodeTypeDescription;
|
|
4
|
+
execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
|
|
4
5
|
}
|
|
@@ -9,6 +9,233 @@ const compose_1 = require("./resources/compose");
|
|
|
9
9
|
const job_1 = require("./resources/job");
|
|
10
10
|
const image_1 = require("./resources/image");
|
|
11
11
|
const notify_1 = require("./resources/notify");
|
|
12
|
+
const BASE_URL = 'https://eranol.com/api/v1';
|
|
13
|
+
const OPERATION_MAP = {
|
|
14
|
+
// video
|
|
15
|
+
addIntro: { method: 'POST', url: '/ffmpeg/video/add-intro' },
|
|
16
|
+
addOutro: { method: 'POST', url: '/ffmpeg/video/add-outro' },
|
|
17
|
+
caption: { method: 'POST', url: '/ffmpeg/video/caption' },
|
|
18
|
+
extractAudio: { method: 'POST', url: '/ffmpeg/video/extract/audio' },
|
|
19
|
+
extractImages: { method: 'POST', url: '/ffmpeg/video/extract/images' },
|
|
20
|
+
generateGif: { method: 'POST', url: '/ffmpeg/video/extract/gif' },
|
|
21
|
+
overlay: { method: 'POST', url: '/ffmpeg/video/overlay' },
|
|
22
|
+
progressBar: { method: 'POST', url: '/ffmpeg/video/progress-bar' },
|
|
23
|
+
reframe: { method: 'POST', url: '/ffmpeg/video/reframe' },
|
|
24
|
+
thumbnail: { method: 'POST', url: '/ffmpeg/video/thumbnail' },
|
|
25
|
+
trim: { method: 'POST', url: '/ffmpeg/video/trim' },
|
|
26
|
+
watermark: { method: 'POST', url: '/ffmpeg/video/watermark' },
|
|
27
|
+
// audio
|
|
28
|
+
denoise: { method: 'POST', url: '/ffmpeg/audio/denoise' },
|
|
29
|
+
highlights: { method: 'POST', url: '/ffmpeg/audio/highlights' },
|
|
30
|
+
removeSilence: { method: 'POST', url: '/ffmpeg/audio/remove-silence' },
|
|
31
|
+
// convert
|
|
32
|
+
audioToMp3: { method: 'POST', url: '/ffmpeg/convert/audio/to/mp3' },
|
|
33
|
+
audioToWav: { method: 'POST', url: '/ffmpeg/convert/audio/to/wav' },
|
|
34
|
+
imageToJpg: { method: 'POST', url: '/ffmpeg/convert/image/to/jpg' },
|
|
35
|
+
imageToWebp: { method: 'POST', url: '/ffmpeg/convert/image/to/webp' },
|
|
36
|
+
videoToMp4: { method: 'POST', url: '/ffmpeg/convert/video/to/mp4' },
|
|
37
|
+
videoToWebm: { method: 'POST', url: '/ffmpeg/convert/video/to/webm' },
|
|
38
|
+
// compose
|
|
39
|
+
concat: { method: 'POST', url: '/ffmpeg/video/concat' },
|
|
40
|
+
composeVideo: { method: 'POST', url: '/ffmpeg/video/compose' },
|
|
41
|
+
merge: { method: 'POST', url: '/ffmpeg/merge' },
|
|
42
|
+
// image
|
|
43
|
+
generateImage: { method: 'POST', url: '/image' },
|
|
44
|
+
// notify
|
|
45
|
+
sendEmail: { method: 'POST', url: '/notifications/email' },
|
|
46
|
+
};
|
|
47
|
+
function buildBody(operation, p) {
|
|
48
|
+
var _a, _b, _c, _d;
|
|
49
|
+
const additional = p('additionalFields', {});
|
|
50
|
+
switch (operation) {
|
|
51
|
+
// ── video ──────────────────────────────────────────────────────────
|
|
52
|
+
case 'trim':
|
|
53
|
+
return { url: p('url'), start_sec: p('startSec'), end_sec: p('endSec') };
|
|
54
|
+
case 'addIntro':
|
|
55
|
+
return { url: p('url'), intro_url: p('introUrl') };
|
|
56
|
+
case 'addOutro':
|
|
57
|
+
return { url: p('url'), outro_url: p('outroUrl') };
|
|
58
|
+
case 'caption': {
|
|
59
|
+
const body = { url: p('url') };
|
|
60
|
+
if (additional.fontColor !== undefined)
|
|
61
|
+
body.font_color = additional.fontColor;
|
|
62
|
+
if (additional.fontSize !== undefined)
|
|
63
|
+
body.font_size = additional.fontSize;
|
|
64
|
+
if (additional.maxSegmentDuration !== undefined)
|
|
65
|
+
body.max_segment_duration = additional.maxSegmentDuration;
|
|
66
|
+
if (additional.maxWordsPerLine !== undefined)
|
|
67
|
+
body.max_words_per_line = additional.maxWordsPerLine;
|
|
68
|
+
if (additional.outlineColor !== undefined)
|
|
69
|
+
body.outline_color = additional.outlineColor;
|
|
70
|
+
if (additional.outlineWidth !== undefined)
|
|
71
|
+
body.outline_width = additional.outlineWidth;
|
|
72
|
+
if (additional.position !== undefined)
|
|
73
|
+
body.position = additional.position;
|
|
74
|
+
return body;
|
|
75
|
+
}
|
|
76
|
+
case 'extractAudio': {
|
|
77
|
+
const body = { url: p('url') };
|
|
78
|
+
if (additional.mono !== undefined)
|
|
79
|
+
body.mono = additional.mono;
|
|
80
|
+
return body;
|
|
81
|
+
}
|
|
82
|
+
case 'extractImages': {
|
|
83
|
+
const body = { url: p('url'), start_sec: p('startSec'), end_sec: p('endSec') };
|
|
84
|
+
if (additional.fps !== undefined)
|
|
85
|
+
body.fps = additional.fps;
|
|
86
|
+
return body;
|
|
87
|
+
}
|
|
88
|
+
case 'generateGif': {
|
|
89
|
+
const body = { url: p('url'), start_sec: p('startSec'), end_sec: p('endSec') };
|
|
90
|
+
if (additional.fps !== undefined)
|
|
91
|
+
body.fps = additional.fps;
|
|
92
|
+
if (additional.width !== undefined)
|
|
93
|
+
body.width = additional.width;
|
|
94
|
+
return body;
|
|
95
|
+
}
|
|
96
|
+
case 'overlay': {
|
|
97
|
+
const raw = p('overlays', { overlayValues: [] });
|
|
98
|
+
return { url: p('url'), overlays: (_a = raw.overlayValues) !== null && _a !== void 0 ? _a : [] };
|
|
99
|
+
}
|
|
100
|
+
case 'progressBar': {
|
|
101
|
+
const body = { url: p('url') };
|
|
102
|
+
if (additional.color !== undefined)
|
|
103
|
+
body.color = additional.color;
|
|
104
|
+
if (additional.height !== undefined)
|
|
105
|
+
body.height = additional.height;
|
|
106
|
+
if (additional.opacity !== undefined)
|
|
107
|
+
body.opacity = additional.opacity;
|
|
108
|
+
if (additional.position !== undefined)
|
|
109
|
+
body.position = additional.position;
|
|
110
|
+
if (additional.style !== undefined)
|
|
111
|
+
body.style = additional.style;
|
|
112
|
+
return body;
|
|
113
|
+
}
|
|
114
|
+
case 'reframe': {
|
|
115
|
+
const body = { url: p('url'), width: p('width'), height: p('height') };
|
|
116
|
+
if (additional.bgColor !== undefined)
|
|
117
|
+
body.bg_color = additional.bgColor;
|
|
118
|
+
return body;
|
|
119
|
+
}
|
|
120
|
+
case 'thumbnail': {
|
|
121
|
+
const body = { url: p('url') };
|
|
122
|
+
if (additional.bgColor !== undefined)
|
|
123
|
+
body.bg_color = additional.bgColor;
|
|
124
|
+
if (additional.fontColor !== undefined)
|
|
125
|
+
body.font_color = additional.fontColor;
|
|
126
|
+
if (additional.fontSize !== undefined)
|
|
127
|
+
body.font_size = additional.fontSize;
|
|
128
|
+
if (additional.height !== undefined)
|
|
129
|
+
body.height = additional.height;
|
|
130
|
+
if (additional.position !== undefined)
|
|
131
|
+
body.position = additional.position;
|
|
132
|
+
if (additional.text !== undefined)
|
|
133
|
+
body.text = additional.text;
|
|
134
|
+
if (additional.timeSec !== undefined)
|
|
135
|
+
body.time_sec = additional.timeSec;
|
|
136
|
+
if (additional.width !== undefined)
|
|
137
|
+
body.width = additional.width;
|
|
138
|
+
return body;
|
|
139
|
+
}
|
|
140
|
+
case 'watermark': {
|
|
141
|
+
const body = { url: p('url'), watermark_url: p('watermarkUrl') };
|
|
142
|
+
if (additional.position !== undefined)
|
|
143
|
+
body.position = additional.position;
|
|
144
|
+
if (additional.scale !== undefined)
|
|
145
|
+
body.scale = additional.scale;
|
|
146
|
+
if (additional.opacity !== undefined)
|
|
147
|
+
body.opacity = additional.opacity;
|
|
148
|
+
if (additional.margin !== undefined)
|
|
149
|
+
body.margin = additional.margin;
|
|
150
|
+
return body;
|
|
151
|
+
}
|
|
152
|
+
// ── audio ──────────────────────────────────────────────────────────
|
|
153
|
+
case 'denoise': {
|
|
154
|
+
const body = { url: p('url') };
|
|
155
|
+
if (additional.method !== undefined)
|
|
156
|
+
body.method = additional.method;
|
|
157
|
+
if (additional.noiseReduction !== undefined)
|
|
158
|
+
body.noise_reduction = additional.noiseReduction;
|
|
159
|
+
return body;
|
|
160
|
+
}
|
|
161
|
+
case 'highlights': {
|
|
162
|
+
const body = { url: p('url') };
|
|
163
|
+
if (additional.topN !== undefined)
|
|
164
|
+
body.top_n = additional.topN;
|
|
165
|
+
if (additional.clipDuration !== undefined)
|
|
166
|
+
body.clip_duration = additional.clipDuration;
|
|
167
|
+
return body;
|
|
168
|
+
}
|
|
169
|
+
case 'removeSilence': {
|
|
170
|
+
const body = { url: p('url') };
|
|
171
|
+
if (additional.silenceThreshDb !== undefined)
|
|
172
|
+
body.silence_thresh_db = additional.silenceThreshDb;
|
|
173
|
+
if (additional.minSilenceDuration !== undefined)
|
|
174
|
+
body.min_silence_duration = additional.minSilenceDuration;
|
|
175
|
+
if (additional.padding !== undefined)
|
|
176
|
+
body.padding = additional.padding;
|
|
177
|
+
return body;
|
|
178
|
+
}
|
|
179
|
+
// ── convert ────────────────────────────────────────────────────────
|
|
180
|
+
case 'audioToMp3':
|
|
181
|
+
case 'audioToWav':
|
|
182
|
+
case 'imageToJpg':
|
|
183
|
+
case 'imageToWebp':
|
|
184
|
+
case 'videoToMp4':
|
|
185
|
+
case 'videoToWebm':
|
|
186
|
+
return { url: p('url') };
|
|
187
|
+
// ── compose ────────────────────────────────────────────────────────
|
|
188
|
+
case 'concat': {
|
|
189
|
+
const raw = p('clips', { clipValues: [] });
|
|
190
|
+
return { clips: (_b = raw.clipValues) !== null && _b !== void 0 ? _b : [] };
|
|
191
|
+
}
|
|
192
|
+
case 'composeVideo': {
|
|
193
|
+
const raw = p('overlays', { overlayValues: [] });
|
|
194
|
+
return { main_video_url: p('mainVideoUrl'), overlays: (_c = raw.overlayValues) !== null && _c !== void 0 ? _c : [] };
|
|
195
|
+
}
|
|
196
|
+
case 'merge': {
|
|
197
|
+
const raw = p('images', { imageValues: [] });
|
|
198
|
+
const body = { images: (_d = raw.imageValues) !== null && _d !== void 0 ? _d : [], audio_url: p('audioUrl') };
|
|
199
|
+
if (additional.audioMode !== undefined)
|
|
200
|
+
body.audio_mode = additional.audioMode;
|
|
201
|
+
if (additional.bgAudioUrl !== undefined)
|
|
202
|
+
body.bg_audio_url = additional.bgAudioUrl;
|
|
203
|
+
if (additional.bgAudioVolume !== undefined)
|
|
204
|
+
body.bg_audio_volume = additional.bgAudioVolume;
|
|
205
|
+
if (additional.fadeSecs !== undefined)
|
|
206
|
+
body.fade_secs = additional.fadeSecs;
|
|
207
|
+
if (additional.fit !== undefined)
|
|
208
|
+
body.fit = additional.fit;
|
|
209
|
+
if (additional.fps !== undefined)
|
|
210
|
+
body.fps = additional.fps;
|
|
211
|
+
if (additional.height !== undefined)
|
|
212
|
+
body.height = additional.height;
|
|
213
|
+
if (additional.transition !== undefined)
|
|
214
|
+
body.transition = additional.transition;
|
|
215
|
+
if (additional.width !== undefined)
|
|
216
|
+
body.width = additional.width;
|
|
217
|
+
return body;
|
|
218
|
+
}
|
|
219
|
+
// ── image ──────────────────────────────────────────────────────────
|
|
220
|
+
case 'generateImage': {
|
|
221
|
+
const body = { prompt: p('prompt') };
|
|
222
|
+
if (additional.height !== undefined)
|
|
223
|
+
body.height = additional.height;
|
|
224
|
+
if (additional.negativePrompt !== undefined)
|
|
225
|
+
body.negative_prompt = additional.negativePrompt;
|
|
226
|
+
if (additional.seed !== undefined)
|
|
227
|
+
body.seed = additional.seed;
|
|
228
|
+
if (additional.width !== undefined)
|
|
229
|
+
body.width = additional.width;
|
|
230
|
+
return body;
|
|
231
|
+
}
|
|
232
|
+
// ── notify ─────────────────────────────────────────────────────────
|
|
233
|
+
case 'sendEmail':
|
|
234
|
+
return { to: p('to'), subject: p('subject'), message: p('message') };
|
|
235
|
+
default:
|
|
236
|
+
return {};
|
|
237
|
+
}
|
|
238
|
+
}
|
|
12
239
|
class Eranol {
|
|
13
240
|
constructor() {
|
|
14
241
|
this.description = {
|
|
@@ -30,13 +257,6 @@ class Eranol {
|
|
|
30
257
|
required: true,
|
|
31
258
|
},
|
|
32
259
|
],
|
|
33
|
-
requestDefaults: {
|
|
34
|
-
baseURL: 'https://eranol.com/api/v1',
|
|
35
|
-
headers: {
|
|
36
|
-
Accept: 'application/json',
|
|
37
|
-
'Content-Type': 'application/json',
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
260
|
properties: [
|
|
41
261
|
{
|
|
42
262
|
displayName: 'Resource',
|
|
@@ -86,5 +306,87 @@ class Eranol {
|
|
|
86
306
|
usableAsTool: true,
|
|
87
307
|
};
|
|
88
308
|
}
|
|
309
|
+
async execute() {
|
|
310
|
+
const request = this.helpers.httpRequestWithAuthentication.bind(this);
|
|
311
|
+
const items = this.getInputData();
|
|
312
|
+
const returnData = [];
|
|
313
|
+
for (let i = 0; i < items.length; i++) {
|
|
314
|
+
const resource = this.getNodeParameter('resource', i);
|
|
315
|
+
const operation = this.getNodeParameter('operation', i);
|
|
316
|
+
const useJsonBody = this.getNodeParameter('useJsonBody', i, false);
|
|
317
|
+
const p = (name, fallback) => {
|
|
318
|
+
try {
|
|
319
|
+
return this.getNodeParameter(name, i);
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
return fallback;
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
let responseData;
|
|
326
|
+
// ── GET/DELETE operations (no body) ────────────────────────────
|
|
327
|
+
if (resource === 'job') {
|
|
328
|
+
const jobId = operation !== 'verify' ? p('jobId') : '';
|
|
329
|
+
if (operation === 'getStatus') {
|
|
330
|
+
responseData = await request('eranolApi', {
|
|
331
|
+
method: 'GET',
|
|
332
|
+
url: `${BASE_URL}/ffmpeg/status/${jobId}`,
|
|
333
|
+
headers: { Accept: 'application/json' },
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
else if (operation === 'getResult') {
|
|
337
|
+
responseData = await request('eranolApi', {
|
|
338
|
+
method: 'GET',
|
|
339
|
+
url: `${BASE_URL}/ffmpeg/result/${jobId}`,
|
|
340
|
+
headers: { Accept: 'application/json' },
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
else if (operation === 'deleteJob') {
|
|
344
|
+
responseData = await request('eranolApi', {
|
|
345
|
+
method: 'DELETE',
|
|
346
|
+
url: `${BASE_URL}/ffmpeg/jobs/${jobId}`,
|
|
347
|
+
headers: { Accept: 'application/json' },
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
else if (operation === 'verify') {
|
|
351
|
+
responseData = await request('eranolApi', {
|
|
352
|
+
method: 'GET',
|
|
353
|
+
url: `${BASE_URL}/verify`,
|
|
354
|
+
headers: { Accept: 'application/json' },
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
else if (resource === 'image' && operation === 'imageStatus') {
|
|
359
|
+
const jobId = p('jobId');
|
|
360
|
+
responseData = await request('eranolApi', {
|
|
361
|
+
method: 'GET',
|
|
362
|
+
url: `${BASE_URL}/image/status/${jobId}`,
|
|
363
|
+
headers: { Accept: 'application/json' },
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
// ── POST operations ────────────────────────────────────────
|
|
368
|
+
const route = OPERATION_MAP[operation];
|
|
369
|
+
if (!route) {
|
|
370
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Unknown operation: ${operation}`);
|
|
371
|
+
}
|
|
372
|
+
const body = useJsonBody
|
|
373
|
+
? JSON.parse(p('jsonBody', '{}'))
|
|
374
|
+
: buildBody(operation, p);
|
|
375
|
+
responseData = await request('eranolApi', {
|
|
376
|
+
method: route.method,
|
|
377
|
+
url: `${BASE_URL}${route.url}`,
|
|
378
|
+
headers: {
|
|
379
|
+
Accept: 'application/json',
|
|
380
|
+
'Content-Type': 'application/json',
|
|
381
|
+
},
|
|
382
|
+
body,
|
|
383
|
+
json: true,
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } });
|
|
387
|
+
returnData.push(...executionData);
|
|
388
|
+
}
|
|
389
|
+
return [returnData];
|
|
390
|
+
}
|
|
89
391
|
}
|
|
90
392
|
exports.Eranol = Eranol;
|
|
@@ -30,12 +30,6 @@ exports.denoiseDescription = [
|
|
|
30
30
|
},
|
|
31
31
|
},
|
|
32
32
|
description: 'The JSON body to send with the request',
|
|
33
|
-
routing: {
|
|
34
|
-
send: {
|
|
35
|
-
type: 'body',
|
|
36
|
-
value: '={{JSON.parse($value)}}',
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
33
|
},
|
|
40
34
|
{
|
|
41
35
|
displayName: 'Audio URL',
|
|
@@ -51,12 +45,6 @@ exports.denoiseDescription = [
|
|
|
51
45
|
},
|
|
52
46
|
},
|
|
53
47
|
description: 'URL of the audio file to denoise',
|
|
54
|
-
routing: {
|
|
55
|
-
send: {
|
|
56
|
-
type: 'body',
|
|
57
|
-
property: 'url',
|
|
58
|
-
},
|
|
59
|
-
},
|
|
60
48
|
},
|
|
61
49
|
{
|
|
62
50
|
displayName: 'Additional Fields',
|
|
@@ -82,12 +70,6 @@ exports.denoiseDescription = [
|
|
|
82
70
|
{ name: 'RNN', value: 'rnn' },
|
|
83
71
|
],
|
|
84
72
|
description: 'Noise reduction method',
|
|
85
|
-
routing: {
|
|
86
|
-
send: {
|
|
87
|
-
type: 'body',
|
|
88
|
-
property: 'method',
|
|
89
|
-
},
|
|
90
|
-
},
|
|
91
73
|
},
|
|
92
74
|
{
|
|
93
75
|
displayName: 'Noise Reduction (dB)',
|
|
@@ -95,12 +77,6 @@ exports.denoiseDescription = [
|
|
|
95
77
|
type: 'number',
|
|
96
78
|
default: 12,
|
|
97
79
|
description: 'Amount of noise reduction in decibels',
|
|
98
|
-
routing: {
|
|
99
|
-
send: {
|
|
100
|
-
type: 'body',
|
|
101
|
-
property: 'noise_reduction',
|
|
102
|
-
},
|
|
103
|
-
},
|
|
104
80
|
},
|
|
105
81
|
],
|
|
106
82
|
},
|
|
@@ -30,12 +30,6 @@ exports.highlightsDescription = [
|
|
|
30
30
|
},
|
|
31
31
|
},
|
|
32
32
|
description: 'The JSON body to send with the request',
|
|
33
|
-
routing: {
|
|
34
|
-
send: {
|
|
35
|
-
type: 'body',
|
|
36
|
-
value: '={{JSON.parse($value)}}',
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
33
|
},
|
|
40
34
|
{
|
|
41
35
|
displayName: 'Audio URL',
|
|
@@ -51,12 +45,6 @@ exports.highlightsDescription = [
|
|
|
51
45
|
},
|
|
52
46
|
},
|
|
53
47
|
description: 'URL of the audio file to extract highlights from',
|
|
54
|
-
routing: {
|
|
55
|
-
send: {
|
|
56
|
-
type: 'body',
|
|
57
|
-
property: 'url',
|
|
58
|
-
},
|
|
59
|
-
},
|
|
60
48
|
},
|
|
61
49
|
{
|
|
62
50
|
displayName: 'Additional Fields',
|
|
@@ -78,12 +66,6 @@ exports.highlightsDescription = [
|
|
|
78
66
|
type: 'number',
|
|
79
67
|
default: 5,
|
|
80
68
|
description: 'Number of top highlights to extract',
|
|
81
|
-
routing: {
|
|
82
|
-
send: {
|
|
83
|
-
type: 'body',
|
|
84
|
-
property: 'top_n',
|
|
85
|
-
},
|
|
86
|
-
},
|
|
87
69
|
},
|
|
88
70
|
{
|
|
89
71
|
displayName: 'Clip Duration',
|
|
@@ -91,12 +73,6 @@ exports.highlightsDescription = [
|
|
|
91
73
|
type: 'number',
|
|
92
74
|
default: 10,
|
|
93
75
|
description: 'Duration of each highlight clip in seconds',
|
|
94
|
-
routing: {
|
|
95
|
-
send: {
|
|
96
|
-
type: 'body',
|
|
97
|
-
property: 'clip_duration',
|
|
98
|
-
},
|
|
99
|
-
},
|
|
100
76
|
},
|
|
101
77
|
],
|
|
102
78
|
},
|
|
@@ -21,39 +21,18 @@ exports.audioDescription = [
|
|
|
21
21
|
value: 'denoise',
|
|
22
22
|
action: 'Denoise audio',
|
|
23
23
|
description: 'Remove background noise from audio',
|
|
24
|
-
routing: {
|
|
25
|
-
request: {
|
|
26
|
-
method: 'POST',
|
|
27
|
-
url: '/ffmpeg/audio/denoise',
|
|
28
|
-
headers: { 'Content-Type': 'application/json' },
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
24
|
},
|
|
32
25
|
{
|
|
33
26
|
name: 'Highlights',
|
|
34
27
|
value: 'highlights',
|
|
35
28
|
action: 'Extract audio highlights',
|
|
36
29
|
description: 'Extract the loudest segments based on RMS energy',
|
|
37
|
-
routing: {
|
|
38
|
-
request: {
|
|
39
|
-
method: 'POST',
|
|
40
|
-
url: '/ffmpeg/audio/highlights',
|
|
41
|
-
headers: { 'Content-Type': 'application/json' },
|
|
42
|
-
},
|
|
43
|
-
},
|
|
44
30
|
},
|
|
45
31
|
{
|
|
46
32
|
name: 'Remove Silence',
|
|
47
33
|
value: 'removeSilence',
|
|
48
34
|
action: 'Remove silence from audio',
|
|
49
35
|
description: 'Detect and eliminate quiet gaps in audio',
|
|
50
|
-
routing: {
|
|
51
|
-
request: {
|
|
52
|
-
method: 'POST',
|
|
53
|
-
url: '/ffmpeg/audio/remove-silence',
|
|
54
|
-
headers: { 'Content-Type': 'application/json' },
|
|
55
|
-
},
|
|
56
|
-
},
|
|
57
36
|
},
|
|
58
37
|
],
|
|
59
38
|
default: 'denoise',
|
|
@@ -30,12 +30,6 @@ exports.removeSilenceDescription = [
|
|
|
30
30
|
},
|
|
31
31
|
},
|
|
32
32
|
description: 'The JSON body to send with the request',
|
|
33
|
-
routing: {
|
|
34
|
-
send: {
|
|
35
|
-
type: 'body',
|
|
36
|
-
value: '={{JSON.parse($value)}}',
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
33
|
},
|
|
40
34
|
{
|
|
41
35
|
displayName: 'Audio URL',
|
|
@@ -51,12 +45,6 @@ exports.removeSilenceDescription = [
|
|
|
51
45
|
},
|
|
52
46
|
},
|
|
53
47
|
description: 'URL of the audio file to process',
|
|
54
|
-
routing: {
|
|
55
|
-
send: {
|
|
56
|
-
type: 'body',
|
|
57
|
-
property: 'url',
|
|
58
|
-
},
|
|
59
|
-
},
|
|
60
48
|
},
|
|
61
49
|
{
|
|
62
50
|
displayName: 'Additional Fields',
|
|
@@ -78,12 +66,6 @@ exports.removeSilenceDescription = [
|
|
|
78
66
|
type: 'number',
|
|
79
67
|
default: -40,
|
|
80
68
|
description: 'Volume threshold below which audio is considered silence',
|
|
81
|
-
routing: {
|
|
82
|
-
send: {
|
|
83
|
-
type: 'body',
|
|
84
|
-
property: 'silence_thresh_db',
|
|
85
|
-
},
|
|
86
|
-
},
|
|
87
69
|
},
|
|
88
70
|
{
|
|
89
71
|
displayName: 'Min Silence Duration',
|
|
@@ -92,12 +74,6 @@ exports.removeSilenceDescription = [
|
|
|
92
74
|
typeOptions: { numberPrecision: 2 },
|
|
93
75
|
default: 0.5,
|
|
94
76
|
description: 'Minimum duration of silence to remove (seconds)',
|
|
95
|
-
routing: {
|
|
96
|
-
send: {
|
|
97
|
-
type: 'body',
|
|
98
|
-
property: 'min_silence_duration',
|
|
99
|
-
},
|
|
100
|
-
},
|
|
101
77
|
},
|
|
102
78
|
{
|
|
103
79
|
displayName: 'Padding',
|
|
@@ -106,12 +82,6 @@ exports.removeSilenceDescription = [
|
|
|
106
82
|
typeOptions: { numberPrecision: 2 },
|
|
107
83
|
default: 0.1,
|
|
108
84
|
description: 'Padding to keep around non-silent segments (seconds)',
|
|
109
|
-
routing: {
|
|
110
|
-
send: {
|
|
111
|
-
type: 'body',
|
|
112
|
-
property: 'padding',
|
|
113
|
-
},
|
|
114
|
-
},
|
|
115
85
|
},
|
|
116
86
|
],
|
|
117
87
|
},
|
|
@@ -30,12 +30,6 @@ exports.composeVideoDescription = [
|
|
|
30
30
|
},
|
|
31
31
|
},
|
|
32
32
|
description: 'The JSON body to send with the request',
|
|
33
|
-
routing: {
|
|
34
|
-
send: {
|
|
35
|
-
type: 'body',
|
|
36
|
-
value: '={{JSON.parse($value)}}',
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
33
|
},
|
|
40
34
|
{
|
|
41
35
|
displayName: 'Main Video URL',
|
|
@@ -51,12 +45,6 @@ exports.composeVideoDescription = [
|
|
|
51
45
|
},
|
|
52
46
|
},
|
|
53
47
|
description: 'URL of the main/base video',
|
|
54
|
-
routing: {
|
|
55
|
-
send: {
|
|
56
|
-
type: 'body',
|
|
57
|
-
property: 'main_video_url',
|
|
58
|
-
},
|
|
59
|
-
},
|
|
60
48
|
},
|
|
61
49
|
{
|
|
62
50
|
displayName: 'Overlays',
|
|
@@ -118,12 +106,5 @@ exports.composeVideoDescription = [
|
|
|
118
106
|
],
|
|
119
107
|
},
|
|
120
108
|
],
|
|
121
|
-
routing: {
|
|
122
|
-
send: {
|
|
123
|
-
type: 'body',
|
|
124
|
-
property: 'overlays',
|
|
125
|
-
value: '={{$value.overlayValues}}',
|
|
126
|
-
},
|
|
127
|
-
},
|
|
128
109
|
},
|
|
129
110
|
];
|
|
@@ -30,12 +30,6 @@ exports.concatDescription = [
|
|
|
30
30
|
},
|
|
31
31
|
},
|
|
32
32
|
description: 'The JSON body to send with the request',
|
|
33
|
-
routing: {
|
|
34
|
-
send: {
|
|
35
|
-
type: 'body',
|
|
36
|
-
value: '={{JSON.parse($value)}}',
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
33
|
},
|
|
40
34
|
{
|
|
41
35
|
displayName: 'Clips',
|
|
@@ -78,12 +72,5 @@ exports.concatDescription = [
|
|
|
78
72
|
],
|
|
79
73
|
},
|
|
80
74
|
],
|
|
81
|
-
routing: {
|
|
82
|
-
send: {
|
|
83
|
-
type: 'body',
|
|
84
|
-
property: 'clips',
|
|
85
|
-
value: '={{$value.clipValues}}',
|
|
86
|
-
},
|
|
87
|
-
},
|
|
88
75
|
},
|
|
89
76
|
];
|
|
@@ -21,39 +21,18 @@ exports.composeDescription = [
|
|
|
21
21
|
value: 'concat',
|
|
22
22
|
action: 'Concatenate videos',
|
|
23
23
|
description: 'Merge video clips in order into a single video',
|
|
24
|
-
routing: {
|
|
25
|
-
request: {
|
|
26
|
-
method: 'POST',
|
|
27
|
-
url: '/ffmpeg/video/concat',
|
|
28
|
-
headers: { 'Content-Type': 'application/json' },
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
24
|
},
|
|
32
25
|
{
|
|
33
26
|
name: 'Compose Video',
|
|
34
27
|
value: 'composeVideo',
|
|
35
28
|
action: 'Compose video with overlays',
|
|
36
29
|
description: 'Overlay video or image segments onto a main video at specific time ranges',
|
|
37
|
-
routing: {
|
|
38
|
-
request: {
|
|
39
|
-
method: 'POST',
|
|
40
|
-
url: '/ffmpeg/video/compose',
|
|
41
|
-
headers: { 'Content-Type': 'application/json' },
|
|
42
|
-
},
|
|
43
|
-
},
|
|
44
30
|
},
|
|
45
31
|
{
|
|
46
32
|
name: 'Merge',
|
|
47
33
|
value: 'merge',
|
|
48
34
|
action: 'Merge images and audio into video',
|
|
49
35
|
description: 'Combine image slides with audio into a video',
|
|
50
|
-
routing: {
|
|
51
|
-
request: {
|
|
52
|
-
method: 'POST',
|
|
53
|
-
url: '/ffmpeg/merge',
|
|
54
|
-
headers: { 'Content-Type': 'application/json' },
|
|
55
|
-
},
|
|
56
|
-
},
|
|
57
36
|
},
|
|
58
37
|
],
|
|
59
38
|
default: 'merge',
|