Payment-free self-hosted builds keep full API access with optional webhookUrl callbacks and the published n8n-nodes-songs2vid package source under integrations/n8n.
395 lines
10 KiB
JSON
395 lines
10 KiB
JSON
{
|
||
"name": "Songs2VID — Audio → Render → YouTube (full)",
|
||
"meta": {
|
||
"templateCredsSetupCompleted": false,
|
||
"instanceId": "songs2vid-docs-template-v2"
|
||
},
|
||
"nodes": [
|
||
{
|
||
"parameters": {},
|
||
"id": "manual-trigger",
|
||
"name": "When clicking ‘Test workflow’",
|
||
"type": "n8n-nodes-base.manualTrigger",
|
||
"typeVersion": 1,
|
||
"position": [
|
||
0,
|
||
0
|
||
]
|
||
},
|
||
{
|
||
"parameters": {
|
||
"path": "songs2vid-complete",
|
||
"httpMethod": "POST",
|
||
"responseMode": "onReceived",
|
||
"options": {}
|
||
},
|
||
"id": "webhook-complete",
|
||
"name": "Songs2VID Job Webhook",
|
||
"type": "n8n-nodes-base.webhook",
|
||
"typeVersion": 2,
|
||
"position": [
|
||
0,
|
||
360
|
||
],
|
||
"webhookId": "songs2vid-complete"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"content": "## Inputs\nProvide binary fields (`cover`, `audio`) or replace Manual Trigger with Drive/Dropbox.\n\nCredential: Header Auth → Name `Authorization`, Value `Bearer s2yt_live_…`\n\nSet env `SONGS2VID_WEBHOOK_URL` to this workflow's Production Webhook URL.",
|
||
"height": 240,
|
||
"width": 320
|
||
},
|
||
"id": "sticky-inputs",
|
||
"name": "Setup",
|
||
"type": "n8n-nodes-base.stickyNote",
|
||
"typeVersion": 1,
|
||
"position": [
|
||
-320,
|
||
-40
|
||
]
|
||
},
|
||
{
|
||
"parameters": {
|
||
"method": "POST",
|
||
"url": "={{ $env.SONGS2VID_BASE_URL || 'https://songs2vid.com' }}/api/v1/upload",
|
||
"authentication": "genericCredentialType",
|
||
"genericAuthType": "httpHeaderAuth",
|
||
"sendBody": true,
|
||
"contentType": "multipart-form-data",
|
||
"bodyParameters": {
|
||
"parameters": [
|
||
{
|
||
"parameterType": "formBinaryData",
|
||
"name": "file",
|
||
"inputDataFieldName": "cover"
|
||
},
|
||
{
|
||
"name": "type",
|
||
"value": "image"
|
||
}
|
||
]
|
||
},
|
||
"options": {}
|
||
},
|
||
"id": "upload-cover",
|
||
"name": "Upload Cover Image",
|
||
"type": "n8n-nodes-base.httpRequest",
|
||
"typeVersion": 4.2,
|
||
"position": [
|
||
280,
|
||
0
|
||
],
|
||
"credentials": {
|
||
"httpHeaderAuth": {
|
||
"id": "REPLACE_ME",
|
||
"name": "Songs2VID API Key"
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"parameters": {
|
||
"method": "POST",
|
||
"url": "={{ $env.SONGS2VID_BASE_URL || 'https://songs2vid.com' }}/api/v1/upload",
|
||
"authentication": "genericCredentialType",
|
||
"genericAuthType": "httpHeaderAuth",
|
||
"sendBody": true,
|
||
"contentType": "multipart-form-data",
|
||
"bodyParameters": {
|
||
"parameters": [
|
||
{
|
||
"parameterType": "formBinaryData",
|
||
"name": "file",
|
||
"inputDataFieldName": "audio"
|
||
},
|
||
{
|
||
"name": "type",
|
||
"value": "audio"
|
||
}
|
||
]
|
||
},
|
||
"options": {}
|
||
},
|
||
"id": "upload-audio",
|
||
"name": "Upload Audio",
|
||
"type": "n8n-nodes-base.httpRequest",
|
||
"typeVersion": 4.2,
|
||
"position": [
|
||
520,
|
||
0
|
||
],
|
||
"credentials": {
|
||
"httpHeaderAuth": {
|
||
"id": "REPLACE_ME",
|
||
"name": "Songs2VID API Key"
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"parameters": {
|
||
"method": "POST",
|
||
"url": "={{ $env.SONGS2VID_BASE_URL || 'https://songs2vid.com' }}/api/v1/render",
|
||
"authentication": "genericCredentialType",
|
||
"genericAuthType": "httpHeaderAuth",
|
||
"sendBody": true,
|
||
"specifyBody": "json",
|
||
"jsonBody": "={\n \"imagePath\": \"{{ $('Upload Cover Image').item.json.path }}\",\n \"webhookUrl\": \"{{ $env.SONGS2VID_WEBHOOK_URL || '' }}\",\n \"items\": [{\n \"audioPath\": \"{{ $('Upload Audio').item.json.path }}\",\n \"audioFilename\": \"{{ $('Upload Audio').item.json.filename }}\",\n \"metadata\": {\n \"title\": \"{{ $('Upload Audio').item.json.audioTags?.title || $('Upload Audio').item.json.filename }}\",\n \"songTitle\": \"{{ $('Upload Audio').item.json.audioTags?.title || '' }}\",\n \"artist\": \"{{ $('Upload Audio').item.json.audioTags?.artist || '' }}\",\n \"description\": \"Uploaded via n8n + Songs2VID\",\n \"tags\": \"music,songs2vid\",\n \"privacy\": \"UNLISTED\",\n \"categoryId\": \"10\",\n \"resolution\": \"1920x1080\",\n \"notifySubscribers\": false,\n \"madeForKids\": false,\n \"embeddable\": true,\n \"creativeCommons\": false,\n \"includeWatermark\": false\n }\n }]\n}",
|
||
"options": {}
|
||
},
|
||
"id": "create-render",
|
||
"name": "Create Render",
|
||
"type": "n8n-nodes-base.httpRequest",
|
||
"typeVersion": 4.2,
|
||
"position": [
|
||
760,
|
||
0
|
||
],
|
||
"credentials": {
|
||
"httpHeaderAuth": {
|
||
"id": "REPLACE_ME",
|
||
"name": "Songs2VID API Key"
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"parameters": {
|
||
"method": "GET",
|
||
"url": "={{ $env.SONGS2VID_BASE_URL || 'https://songs2vid.com' }}{{ $json.statusUrl }}",
|
||
"authentication": "genericCredentialType",
|
||
"genericAuthType": "httpHeaderAuth",
|
||
"options": {}
|
||
},
|
||
"id": "poll-status",
|
||
"name": "Get Render Status (optional poll)",
|
||
"type": "n8n-nodes-base.httpRequest",
|
||
"typeVersion": 4.2,
|
||
"position": [
|
||
1000,
|
||
0
|
||
],
|
||
"credentials": {
|
||
"httpHeaderAuth": {
|
||
"id": "REPLACE_ME",
|
||
"name": "Songs2VID API Key"
|
||
}
|
||
},
|
||
"disabled": true
|
||
},
|
||
{
|
||
"parameters": {
|
||
"conditions": {
|
||
"options": {
|
||
"caseSensitive": true,
|
||
"leftValue": "",
|
||
"typeValidation": "strict"
|
||
},
|
||
"conditions": [
|
||
{
|
||
"id": "job-done",
|
||
"leftValue": "={{ $json.body?.event || $json.event }}",
|
||
"rightValue": "job.completed",
|
||
"operator": {
|
||
"type": "string",
|
||
"operation": "equals"
|
||
}
|
||
},
|
||
{
|
||
"id": "item-done",
|
||
"leftValue": "={{ $json.body?.event || $json.event }}",
|
||
"rightValue": "job.item.completed",
|
||
"operator": {
|
||
"type": "string",
|
||
"operation": "equals"
|
||
}
|
||
}
|
||
],
|
||
"combinator": "or"
|
||
},
|
||
"options": {}
|
||
},
|
||
"id": "if-completed",
|
||
"name": "Render Completed?",
|
||
"type": "n8n-nodes-base.if",
|
||
"typeVersion": 2,
|
||
"position": [
|
||
280,
|
||
360
|
||
]
|
||
},
|
||
{
|
||
"parameters": {
|
||
"conditions": {
|
||
"options": {
|
||
"caseSensitive": true,
|
||
"leftValue": "",
|
||
"typeValidation": "strict"
|
||
},
|
||
"conditions": [
|
||
{
|
||
"id": "job-fail",
|
||
"leftValue": "={{ $json.body?.event || $json.event }}",
|
||
"rightValue": "job.failed",
|
||
"operator": {
|
||
"type": "string",
|
||
"operation": "equals"
|
||
}
|
||
},
|
||
{
|
||
"id": "item-fail",
|
||
"leftValue": "={{ $json.body?.event || $json.event }}",
|
||
"rightValue": "job.item.failed",
|
||
"operator": {
|
||
"type": "string",
|
||
"operation": "equals"
|
||
}
|
||
}
|
||
],
|
||
"combinator": "or"
|
||
},
|
||
"options": {}
|
||
},
|
||
"id": "if-failed",
|
||
"name": "Render Failed?",
|
||
"type": "n8n-nodes-base.if",
|
||
"typeVersion": 2,
|
||
"position": [
|
||
280,
|
||
560
|
||
]
|
||
},
|
||
{
|
||
"parameters": {
|
||
"content": "## YouTube live\nVideo ID: `{{ $json.body?.youtubeVideoId || $json.youtubeVideoId }}`\n\nhttps://youtu.be/{{ $json.body?.youtubeVideoId || $json.youtubeVideoId }}",
|
||
"height": 180,
|
||
"width": 360
|
||
},
|
||
"id": "sticky-success",
|
||
"name": "Success",
|
||
"type": "n8n-nodes-base.stickyNote",
|
||
"typeVersion": 1,
|
||
"position": [
|
||
560,
|
||
320
|
||
]
|
||
},
|
||
{
|
||
"parameters": {
|
||
"content": "## Failed\n`{{ $json.body?.error || $json.error }}`",
|
||
"height": 160,
|
||
"width": 360
|
||
},
|
||
"id": "sticky-fail",
|
||
"name": "Failure",
|
||
"type": "n8n-nodes-base.stickyNote",
|
||
"typeVersion": 1,
|
||
"position": [
|
||
560,
|
||
520
|
||
]
|
||
}
|
||
],
|
||
"connections": {
|
||
"When clicking ‘Test workflow’": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Upload Cover Image",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Upload Cover Image": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Upload Audio",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Upload Audio": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Create Render",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Create Render": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Get Render Status (optional poll)",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Songs2VID Job Webhook": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Render Completed?",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Render Completed?": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Success",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
],
|
||
[
|
||
{
|
||
"node": "Render Failed?",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Render Failed?": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Failure",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
}
|
||
},
|
||
"pinData": {},
|
||
"settings": {
|
||
"executionOrder": "v1"
|
||
},
|
||
"staticData": null,
|
||
"tags": [
|
||
{
|
||
"name": "songs2vid"
|
||
},
|
||
{
|
||
"name": "n8n"
|
||
},
|
||
{
|
||
"name": "youtube"
|
||
}
|
||
],
|
||
"triggerCount": 0,
|
||
"updatedAt": "2026-08-08T00:00:00.000Z",
|
||
"versionId": "2"
|
||
} |