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.
- package/dist/credentials/EranolApi.credentials.d.ts +10 -0
- package/dist/credentials/EranolApi.credentials.js +37 -0
- package/dist/nodes/Eranol/Eranol.node.d.ts +4 -0
- package/dist/nodes/Eranol/Eranol.node.js +78 -0
- package/dist/nodes/Eranol/eranol.png +0 -0
- package/dist/nodes/Eranol/eranol.svg +12 -0
- package/dist/nodes/Eranol/resources/audio/denoise.d.ts +2 -0
- package/dist/nodes/Eranol/resources/audio/denoise.js +66 -0
- package/dist/nodes/Eranol/resources/audio/highlights.d.ts +2 -0
- package/dist/nodes/Eranol/resources/audio/highlights.js +62 -0
- package/dist/nodes/Eranol/resources/audio/index.d.ts +2 -0
- package/dist/nodes/Eranol/resources/audio/index.js +61 -0
- package/dist/nodes/Eranol/resources/audio/removeSilence.d.ts +2 -0
- package/dist/nodes/Eranol/resources/audio/removeSilence.js +77 -0
- package/dist/nodes/Eranol/resources/compose/index.d.ts +2 -0
- package/dist/nodes/Eranol/resources/compose/index.js +33 -0
- package/dist/nodes/Eranol/resources/compose/merge.d.ts +2 -0
- package/dist/nodes/Eranol/resources/compose/merge.js +211 -0
- package/dist/nodes/Eranol/resources/convert/audioToMp3.d.ts +2 -0
- package/dist/nodes/Eranol/resources/convert/audioToMp3.js +25 -0
- package/dist/nodes/Eranol/resources/convert/audioToWav.d.ts +2 -0
- package/dist/nodes/Eranol/resources/convert/audioToWav.js +25 -0
- package/dist/nodes/Eranol/resources/convert/imageToJpg.d.ts +2 -0
- package/dist/nodes/Eranol/resources/convert/imageToJpg.js +25 -0
- package/dist/nodes/Eranol/resources/convert/imageToWebp.d.ts +2 -0
- package/dist/nodes/Eranol/resources/convert/imageToWebp.js +25 -0
- package/dist/nodes/Eranol/resources/convert/index.d.ts +2 -0
- package/dist/nodes/Eranol/resources/convert/index.js +103 -0
- package/dist/nodes/Eranol/resources/convert/videoToMp4.d.ts +2 -0
- package/dist/nodes/Eranol/resources/convert/videoToMp4.js +25 -0
- package/dist/nodes/Eranol/resources/convert/videoToWebm.d.ts +2 -0
- package/dist/nodes/Eranol/resources/convert/videoToWebm.js +25 -0
- package/dist/nodes/Eranol/resources/job/deleteJob.d.ts +2 -0
- package/dist/nodes/Eranol/resources/job/deleteJob.js +20 -0
- package/dist/nodes/Eranol/resources/job/getResult.d.ts +2 -0
- package/dist/nodes/Eranol/resources/job/getResult.js +20 -0
- package/dist/nodes/Eranol/resources/job/getStatus.d.ts +2 -0
- package/dist/nodes/Eranol/resources/job/getStatus.js +20 -0
- package/dist/nodes/Eranol/resources/job/index.d.ts +2 -0
- package/dist/nodes/Eranol/resources/job/index.js +61 -0
- package/dist/nodes/Eranol/resources/video/addIntro.d.ts +2 -0
- package/dist/nodes/Eranol/resources/video/addIntro.js +41 -0
- package/dist/nodes/Eranol/resources/video/addOutro.d.ts +2 -0
- package/dist/nodes/Eranol/resources/video/addOutro.js +41 -0
- package/dist/nodes/Eranol/resources/video/caption.d.ts +2 -0
- package/dist/nodes/Eranol/resources/video/caption.js +133 -0
- package/dist/nodes/Eranol/resources/video/extractAudio.d.ts +2 -0
- package/dist/nodes/Eranol/resources/video/extractAudio.js +49 -0
- package/dist/nodes/Eranol/resources/video/extractImages.d.ts +2 -0
- package/dist/nodes/Eranol/resources/video/extractImages.js +79 -0
- package/dist/nodes/Eranol/resources/video/generateGif.d.ts +2 -0
- package/dist/nodes/Eranol/resources/video/generateGif.js +92 -0
- package/dist/nodes/Eranol/resources/video/index.d.ts +2 -0
- package/dist/nodes/Eranol/resources/video/index.js +187 -0
- package/dist/nodes/Eranol/resources/video/overlay.d.ts +2 -0
- package/dist/nodes/Eranol/resources/video/overlay.js +133 -0
- package/dist/nodes/Eranol/resources/video/progressBar.d.ts +2 -0
- package/dist/nodes/Eranol/resources/video/progressBar.js +110 -0
- package/dist/nodes/Eranol/resources/video/reframe.d.ts +2 -0
- package/dist/nodes/Eranol/resources/video/reframe.js +79 -0
- package/dist/nodes/Eranol/resources/video/thumbnail.d.ts +2 -0
- package/dist/nodes/Eranol/resources/video/thumbnail.js +145 -0
- package/dist/nodes/Eranol/resources/video/trim.d.ts +2 -0
- package/dist/nodes/Eranol/resources/video/trim.js +56 -0
- package/dist/nodes/Eranol/resources/video/watermark.d.ts +2 -0
- package/dist/nodes/Eranol/resources/video/watermark.js +112 -0
- 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,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,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,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,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,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,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,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
|
+
];
|