n8n-nodes-selfhosthub
Version:
Collection of n8n nodes for self-hosted AI services, including Leonardo.ai integration for AI image and content generation capabilities.
175 lines • 8.08 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CreateJ2vMovie = void 0;
const createMovie_1 = require("./operations/createMovie");
const mergeVideoAudio_1 = require("./operations/mergeVideoAudio");
const mergeVideos_1 = require("./operations/mergeVideos");
const requestBuilder_1 = require("./utils/requestBuilder");
class CreateJ2vMovie {
constructor() {
this.description = {
displayName: 'Self-Host Hub (JSON2Video)',
name: 'createJ2vMovie',
icon: 'file:createJ2vMovie.png',
group: [],
version: 1,
subtitle: '=',
description: 'Create videos with the JSON2Video API',
defaults: {
name: 'Self-Host Hub (JSON2Video)',
},
// We use NodeConnectionType.Main directly because isolatedModules is disabled in tsconfig.json
// If isolatedModules is enabled, these would need to be replaced with string literals and type assertions
// For more details, see docs/DEVELOPMENT_GUIDELINES.md#typescript-configuration
inputs: [
{
type: 'main',
displayName: 'Input',
},
],
outputs: [
{
type: 'main',
displayName: 'Output',
},
],
credentials: [
{
name: 'json2VideoApiCredentials',
required: true,
},
],
properties: [
// Core operation selector
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
options: [
{
name: 'Create Movie',
value: 'createMovie',
},
{
name: 'Merge Video and Audio',
value: 'mergeVideoAudio',
},
{
name: 'Merge Videos',
value: 'mergeVideos',
},
],
default: 'createMovie',
},
// Advanced Mode toggle for each operation
createMovie_1.createMovieAdvancedModeParameter,
mergeVideoAudio_1.mergeVideoAudioAdvancedModeParameter,
mergeVideos_1.mergeVideosAdvancedModeParameter,
// JSON Template for advanced mode for each operation
createMovie_1.createMovieJsonTemplateParameter,
mergeVideoAudio_1.mergeVideoAudioJsonTemplateParameter,
mergeVideos_1.mergeVideosJsonTemplateParameter,
// Import parameter definitions for each operation - validate each parameter has required fields
...createMovie_1.createMovieParameters.filter(p => p && typeof p.name === 'string'),
...createMovie_1.createMovieAdvancedParameters.filter(p => p && typeof p.name === 'string'),
...mergeVideoAudio_1.mergeVideoAudioParameters.filter(p => p && typeof p.name === 'string'),
...mergeVideoAudio_1.mergeVideoAudioAdvancedParameters.filter(p => p && typeof p.name === 'string'),
...mergeVideos_1.mergeVideosParameters.filter(p => p && typeof p.name === 'string'),
...mergeVideos_1.mergeVideosAdvancedParameters.filter(p => p && typeof p.name === 'string'),
],
};
}
async execute() {
const items = this.getInputData();
const returnData = [];
const credentials = await this.getCredentials('json2VideoApiCredentials');
const apiKey = credentials.apiKey;
// Process each item
for (let i = 0; i < items.length; i++) {
try {
// Get operation type
const operation = String(this.getNodeParameter('operation', i, ''));
// Check for advanced mode based on operation
let isAdvancedMode = false;
if (operation === 'createMovie') {
isAdvancedMode = this.getNodeParameter('advancedMode', i, true);
}
else if (operation === 'mergeVideoAudio') {
isAdvancedMode = this.getNodeParameter('advancedModeMergeAudio', i, true);
}
else if (operation === 'mergeVideos') {
isAdvancedMode = this.getNodeParameter('advancedModeMergeVideos', i, true);
}
// Log parameters for debugging
try {
const movieElements = this.getNodeParameter('movieElements.elementValues', i, []);
const elements = this.getNodeParameter('elements.elementValues', i, []);
}
catch (error) {
}
// Build request body using the centralized utility
const requestBody = requestBuilder_1.buildRequestBody.call(this, operation, i, isAdvancedMode);
// Get recordId and webhookUrl for the API URL parameters
const recordId = String(this.getNodeParameter('recordId', i, ''));
const webhookUrl = String(this.getNodeParameter('webhookUrl', i, ''));
// Common API call setup
const options = {
method: 'POST',
url: '',
body: requestBody,
headers: {
'Content-Type': 'application/json',
'x-api-key': apiKey,
},
json: true,
};
// Set the appropriate API endpoint based on operation
switch (operation) {
case 'createMovie':
case 'mergeVideoAudio':
case 'mergeVideos':
options.url = `https://api.json2video.com/v2/movies?id=${recordId}&webhook=${encodeURIComponent(webhookUrl)}`;
break;
case 'checkStatus':
const jobId = this.getNodeParameter('jobId', i);
options.url = `https://api.json2video.com/v2/movies/${jobId}`;
options.method = 'GET';
break;
}
// Make the API request
const responseData = await this.helpers.request(options);
// Handle the API response properly - JSON2Video returns an object, not an array
let processedResponse;
if (Array.isArray(responseData)) {
processedResponse = responseData;
}
else {
// Single object response - wrap in array
processedResponse = [responseData];
}
// Return the API response
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(processedResponse), { itemData: { item: i } });
returnData.push(...executionData);
}
catch (error) {
if (this.continueOnFail()) {
// Add error as json to output
returnData.push({
json: {
error: error.message || 'Unknown error occurred',
},
pairedItem: {
item: i,
},
});
continue;
}
throw error;
}
}
return [returnData];
}
}
exports.CreateJ2vMovie = CreateJ2vMovie;
//# sourceMappingURL=CreateJ2vMovie.node.js.map