Workflow: Wait Code Automation

Workflow Details

Download Workflow
{
    "id": "CvXjXG4SFnN0ioJQ",
    "meta": {
        "instanceId": "e2034325698638870d6b764285427bad9d79bf1e08a458be597c06e61ad7e545",
        "templateCredsSetupCompleted": true
    },
    "name": "AutoQoutesV2_template",
    "tags": [],
    "nodes": [
        {
            "id": "2ff58bb4-7079-44fe-a2ac-b4af9fa5b30e",
            "name": "When clicking \u2018Test workflow\u2019",
            "type": "n8n-nodes-base.manualTrigger",
            "position": [
                300,
                0
            ],
            "parameters": [],
            "typeVersion": 1
        },
        {
            "id": "ec44d567-dfc8-4561-87df-903724225247",
            "name": "Generate Image",
            "type": "n8n-nodes-base.httpRequest",
            "position": [
                660,
                0
            ],
            "parameters": {
                "url": "https:\/\/api.piapi.ai\/api\/v1\/task",
                "body": "={\n  \"model\": \"Qubico\/flux1-dev\",\n  \"task_type\": \"txt2img\",\n  \"input\": {\n    \"prompt\": \"Ultra-realistic vertical nature landscape, {{ $json['Background (EN)'] }}, featuring {{ $json['Prompt (EN)'] }}, high detail, soft atmospheric lighting, cinematic golden hour glow, vertical composition, photorealistic texture, natural depth of field, calm and serene mood, no people, no buildings, HDR, 8k resolution, masterpiece\",\n    \"negative_prompt\": \"taking a photo of a room, recording a video of a room, photos app, video recorder, illegible text, blurry text, low quality text, DSLR, unnatural\",\n    \"width\": 540,\n    \"height\": 960\n  }\n}",
                "method": "POST",
                "options": [],
                "sendBody": true,
                "contentType": "raw",
                "sendHeaders": true,
                "rawContentType": "application\/json",
                "headerParameters": {
                    "parameters": [
                        {
                            "name": "X-API-Key",
                            "value": "=[Your PiAPI Key]"
                        }
                    ]
                }
            },
            "retryOnFail": false,
            "typeVersion": 4.20000000000000017763568394002504646778106689453125
        },
        {
            "id": "ad260a51-e981-47cc-8600-967c1c748814",
            "name": "Get image",
            "type": "n8n-nodes-base.httpRequest",
            "position": [
                1020,
                0
            ],
            "parameters": {
                "url": "=https:\/\/api.piapi.ai\/api\/v1\/task\/{{ $json.data.task_id }}",
                "options": [],
                "sendHeaders": true,
                "headerParameters": {
                    "parameters": [
                        {
                            "name": "X-API-Key",
                            "value": "=[Your PiAPI Key]"
                        }
                    ]
                }
            },
            "typeVersion": 4.20000000000000017763568394002504646778106689453125
        },
        {
            "id": "cddff673-15ce-47ec-a2d3-3d71437bfb1f",
            "name": "Sticky Note",
            "type": "n8n-nodes-base.stickyNote",
            "position": [
                600,
                -80
            ],
            "parameters": {
                "width": 820,
                "height": 240,
                "content": "## Create Image Background\nGenerate an image using prompt from Google Sheet via PiAPI Flux (Txt2img)."
            },
            "typeVersion": 1
        },
        {
            "id": "64132a39-ad42-4158-9eec-5b6bfdc7bca2",
            "name": "Update image background URL",
            "type": "n8n-nodes-base.googleSheets",
            "position": [
                1240,
                0
            ],
            "parameters": {
                "columns": {
                    "value": {
                        "Index": "={{ $('Get data from Google Sheet').item.json.Index }}",
                        "Background Image": "={{ $json.data.output.image_url }}"
                    },
                    "schema": [
                        {
                            "id": "Index",
                            "type": "string",
                            "display": true,
                            "removed": false,
                            "required": false,
                            "displayName": "Index",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Quote (Thai)",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Quote (Thai)",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Pen Name (Thai)",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Pen Name (Thai)",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Background (EN)",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Background (EN)",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Prompt (EN)",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Prompt (EN)",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Background Image",
                            "type": "string",
                            "display": true,
                            "required": false,
                            "displayName": "Background Image",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Background Video",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Background Video",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Video Status",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Video Status",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "row_number",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "readOnly": true,
                            "required": false,
                            "displayName": "row_number",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        }
                    ],
                    "mappingMode": "defineBelow",
                    "matchingColumns": [
                        "Index"
                    ],
                    "attemptToConvertTypes": false,
                    "convertFieldsToString": false
                },
                "options": [],
                "operation": "update",
                "sheetName": {
                    "__rl": true,
                    "mode": "list",
                    "value": "gid=0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1p1iPoiu2uI3qGbHi0diS7QwsMcLuzDIqwo3AeSUVrGQ\/edit#gid=0",
                    "cachedResultName": "Sheet1"
                },
                "documentId": {
                    "__rl": true,
                    "mode": "id",
                    "value": "1p1iPoiu2uI3qGbHi0diS7QwsMcLuzDIqwo3AeSUVrGQ"
                }
            },
            "credentials": {
                "googleSheetsOAuth2Api": {
                    "id": "Ra2f1dlqOJ13jTtb",
                    "name": "Google Sheets account"
                }
            },
            "typeVersion": 4.5
        },
        {
            "id": "801dd794-4cf8-42f7-8102-a3a4853cae39",
            "name": "Image-to-Video",
            "type": "n8n-nodes-base.httpRequest",
            "position": [
                260,
                280
            ],
            "parameters": {
                "url": "https:\/\/api.piapi.ai\/api\/v1\/task",
                "body": "={\n  \"model\": \"kling\",\n  \"task_type\": \"video_generation\",\n  \"input\": {\n    \"prompt\": \"Cinematic vertical video from image of {{ $('Get data from Google Sheet').item.json['Background (EN)'] }}, with {{ $('Get data from Google Sheet').item.json['Prompt (EN)'] }}, animated subtly from image, with soft light, mist, swaying trees, slow zoom effect, no people or buildings\",\n    \"negative_prompt\": \"blurry motion, distorted faces, unnatural lighting, over produced, bad quality\",\n    \"cfg_scale\": 0.5,\n    \"duration\": 5,\n    \"mode\": \"std\",\n    \"image_url\": \"{{ $('Get image').item.json.data.output.image_url }}\",\n    \"version\": \"1.0\",\n    \"camera_control\": {\n      \"type\": \"simple\",\n      \"config\": {\n        \"horizontal\": 0,\n        \"vertical\": 0,\n        \"pan\": 0,\n        \"tilt\": 0,\n        \"roll\": 0,\n        \"zoom\": 5\n      }\n    }\n  }\n}",
                "method": "POST",
                "options": [],
                "sendBody": true,
                "contentType": "raw",
                "sendHeaders": true,
                "rawContentType": "application\/json",
                "headerParameters": {
                    "parameters": [
                        {
                            "name": "X-API-Key",
                            "value": "=[Your PiAPI Key]"
                        }
                    ]
                }
            },
            "typeVersion": 4.20000000000000017763568394002504646778106689453125
        },
        {
            "id": "6f7d755f-73fb-474f-a2c4-4612317c4f5a",
            "name": "Wait image 2 min",
            "type": "n8n-nodes-base.wait",
            "position": [
                840,
                0
            ],
            "webhookId": "ccf58c3e-f91d-4f58-a4a7-aff58c9be226",
            "parameters": {
                "unit": "minutes",
                "amount": 2
            },
            "typeVersion": 1.100000000000000088817841970012523233890533447265625
        },
        {
            "id": "d8de3a95-1a5b-4495-9a1f-8178c1be3d44",
            "name": "Wait video 5 min",
            "type": "n8n-nodes-base.wait",
            "position": [
                440,
                280
            ],
            "webhookId": "6df38e96-d5ec-4588-9569-db9b86539a34",
            "parameters": {
                "unit": "minutes"
            },
            "typeVersion": 1.100000000000000088817841970012523233890533447265625
        },
        {
            "id": "c3f97a19-9ea8-4489-8629-767542f0fddb",
            "name": "Get Video",
            "type": "n8n-nodes-base.httpRequest",
            "position": [
                620,
                280
            ],
            "parameters": {
                "url": "=https:\/\/api.piapi.ai\/api\/v1\/task\/{{ $json.data.task_id }}",
                "options": [],
                "sendHeaders": true,
                "headerParameters": {
                    "parameters": [
                        {
                            "name": "X-API-Key",
                            "value": "=[Your PiAPI Key]"
                        }
                    ]
                }
            },
            "typeVersion": 4.20000000000000017763568394002504646778106689453125
        },
        {
            "id": "eefa224d-2e3d-459e-a16d-8e2584b59cf0",
            "name": "Sticky Note1",
            "type": "n8n-nodes-base.stickyNote",
            "position": [
                240,
                200
            ],
            "parameters": {
                "color": 3,
                "width": 1180,
                "height": 240,
                "content": "## Create Video Background\nCreate a cinematic vertical video from the generated image using PiAPI Kling."
            },
            "typeVersion": 1
        },
        {
            "id": "8d2035a8-d4a0-4a33-bae3-c18b530487d4",
            "name": "Generate Audio",
            "type": "n8n-nodes-base.httpRequest",
            "position": [
                380,
                560
            ],
            "parameters": {
                "url": "https:\/\/api.elevenlabs.io\/v1\/sound-generation",
                "method": "POST",
                "options": [],
                "sendBody": true,
                "sendHeaders": true,
                "bodyParameters": {
                    "parameters": [
                        {
                            "name": "text",
                            "value": "={\n  \"text\": \"no voice, A peaceful soundscape unfolds as the sun begins to rise over misty {{ $('Get data from Google Sheet').item.json['Background (EN)'] }}, casting warm light across the scene. The crisp morning air is filled with ambient nature sounds like {{ $('Get data from Google Sheet').item.json['Prompt (EN)'] }} along with soft lofi beats, blending into a calm and immersive atmosphere.\",\n  \"duration_seconds\": 5,\n  \"model_id\": \"sound-effects-v1\",\n  \"output_format\": \"mp3\"\n}\n"
                        },
                        {
                            "name": "duration_seconds",
                            "value": "20"
                        }
                    ]
                },
                "headerParameters": {
                    "parameters": [
                        {
                            "name": "xi-api-key",
                            "value": "[Your ElevenLab Key]"
                        }
                    ]
                }
            },
            "typeVersion": 4.20000000000000017763568394002504646778106689453125
        },
        {
            "id": "66af781a-2012-426e-a623-e90e21e8b2a1",
            "name": "Get data from Google Sheet",
            "type": "n8n-nodes-base.googleSheets",
            "position": [
                480,
                0
            ],
            "parameters": {
                "options": {
                    "returnFirstMatch": true
                },
                "filtersUI": {
                    "values": [
                        {
                            "lookupColumn": "Video Status"
                        }
                    ]
                },
                "sheetName": {
                    "__rl": true,
                    "mode": "list",
                    "value": "gid=0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1p1iPoiu2uI3qGbHi0diS7QwsMcLuzDIqwo3AeSUVrGQ\/edit#gid=0",
                    "cachedResultName": "Sheet1"
                },
                "documentId": {
                    "__rl": true,
                    "mode": "id",
                    "value": "1p1iPoiu2uI3qGbHi0diS7QwsMcLuzDIqwo3AeSUVrGQ"
                }
            },
            "credentials": {
                "googleSheetsOAuth2Api": {
                    "id": "Ra2f1dlqOJ13jTtb",
                    "name": "Google Sheets account"
                }
            },
            "typeVersion": 4.5
        },
        {
            "id": "04074118-9f30-4648-8aab-9574156a76ba",
            "name": "Update Sound background URL",
            "type": "n8n-nodes-base.googleSheets",
            "position": [
                1220,
                480
            ],
            "parameters": {
                "columns": {
                    "value": {
                        "Index": "={{ $('Get data from Google Sheet').item.json.Index }}",
                        "Music Background": "={{ $json.webContentLink }}"
                    },
                    "schema": [
                        {
                            "id": "Index",
                            "type": "string",
                            "display": true,
                            "removed": false,
                            "required": false,
                            "displayName": "Index",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Quote (Thai)",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Quote (Thai)",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Pen Name (Thai)",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Pen Name (Thai)",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Background (EN)",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Background (EN)",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Prompt (EN)",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Prompt (EN)",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Background Image",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Background Image",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Background Video",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Background Video",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Music Background",
                            "type": "string",
                            "display": true,
                            "removed": false,
                            "required": false,
                            "displayName": "Music Background",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Video Status",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Video Status",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "row_number",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "readOnly": true,
                            "required": false,
                            "displayName": "row_number",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        }
                    ],
                    "mappingMode": "defineBelow",
                    "matchingColumns": [
                        "Index"
                    ],
                    "attemptToConvertTypes": false,
                    "convertFieldsToString": false
                },
                "options": [],
                "operation": "update",
                "sheetName": {
                    "__rl": true,
                    "mode": "list",
                    "value": "gid=0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1p1iPoiu2uI3qGbHi0diS7QwsMcLuzDIqwo3AeSUVrGQ\/edit#gid=0",
                    "cachedResultName": "Sheet1"
                },
                "documentId": {
                    "__rl": true,
                    "mode": "id",
                    "value": "1p1iPoiu2uI3qGbHi0diS7QwsMcLuzDIqwo3AeSUVrGQ"
                }
            },
            "credentials": {
                "googleSheetsOAuth2Api": {
                    "id": "Ra2f1dlqOJ13jTtb",
                    "name": "Google Sheets account"
                }
            },
            "typeVersion": 4.5
        },
        {
            "id": "35ca939b-fb27-48cf-8036-f35618ceaee0",
            "name": "Update video background URL",
            "type": "n8n-nodes-base.googleSheets",
            "position": [
                1240,
                280
            ],
            "parameters": {
                "columns": {
                    "value": {
                        "Index": "={{ $('Get data from Google Sheet').item.json.Index }}",
                        "Background Video": "={{ $json.data.output.video_url }}"
                    },
                    "schema": [
                        {
                            "id": "Index",
                            "type": "string",
                            "display": true,
                            "removed": false,
                            "required": false,
                            "displayName": "Index",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Quote (Thai)",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Quote (Thai)",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Pen Name (Thai)",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Pen Name (Thai)",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Background (EN)",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Background (EN)",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Prompt (EN)",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Prompt (EN)",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Background Image",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Background Image",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Background Video",
                            "type": "string",
                            "display": true,
                            "required": false,
                            "displayName": "Background Video",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Video Status",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Video Status",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "row_number",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "readOnly": true,
                            "required": false,
                            "displayName": "row_number",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        }
                    ],
                    "mappingMode": "defineBelow",
                    "matchingColumns": [
                        "Index"
                    ],
                    "attemptToConvertTypes": false,
                    "convertFieldsToString": false
                },
                "options": [],
                "operation": "update",
                "sheetName": {
                    "__rl": true,
                    "mode": "list",
                    "value": "gid=0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1p1iPoiu2uI3qGbHi0diS7QwsMcLuzDIqwo3AeSUVrGQ\/edit#gid=0",
                    "cachedResultName": "Sheet1"
                },
                "documentId": {
                    "__rl": true,
                    "mode": "id",
                    "value": "1p1iPoiu2uI3qGbHi0diS7QwsMcLuzDIqwo3AeSUVrGQ"
                }
            },
            "credentials": {
                "googleSheetsOAuth2Api": {
                    "id": "Ra2f1dlqOJ13jTtb",
                    "name": "Google Sheets account"
                }
            },
            "typeVersion": 4.5
        },
        {
            "id": "54c8badf-a99a-4e5c-ad96-e1d982eb6855",
            "name": "Sticky Note2",
            "type": "n8n-nodes-base.stickyNote",
            "position": [
                240,
                480
            ],
            "parameters": {
                "color": 4,
                "width": 1180,
                "height": 240,
                "content": "## Create Sound Background\nGenerate ambient sound using ElevenLabs based on the scene prompt."
            },
            "typeVersion": 1
        },
        {
            "id": "15b9e2b1-72d9-42bf-a8a4-0ad0a01c5e5f",
            "name": "Upload Sound to Google Drive",
            "type": "n8n-nodes-base.googleDrive",
            "position": [
                780,
                480
            ],
            "parameters": {
                "name": "={{ $('Get data from Google Sheet').item.json['Background (EN)'] }}.mp3",
                "driveId": {
                    "__rl": true,
                    "mode": "id",
                    "value": "1Sfv2PvIHF0J3-5IOYFdZp2-4LNPOoSX1"
                },
                "options": [],
                "folderId": {
                    "__rl": true,
                    "mode": "list",
                    "value": "root",
                    "cachedResultName": "\/ (Root folder)"
                }
            },
            "credentials": {
                "googleDriveOAuth2Api": {
                    "id": "OEWvSsY5xiUhqOnx",
                    "name": "Google Drive account - PeakWave"
                }
            },
            "typeVersion": 3,
            "alwaysOutputData": true
        },
        {
            "id": "2a628e8a-077a-4999-9ef7-8d28ac4433ac",
            "name": "Save Video Background Locally1",
            "type": "n8n-nodes-base.readWriteFile",
            "position": [
                1040,
                280
            ],
            "parameters": {
                "options": [],
                "fileName": "=VideoBackground.mp4",
                "operation": "write"
            },
            "typeVersion": 1
        },
        {
            "id": "fa5cce8d-4b50-4221-9446-050f497b30a9",
            "name": "Get Binary Video Background",
            "type": "n8n-nodes-base.httpRequest",
            "position": [
                820,
                280
            ],
            "parameters": {
                "url": "={{ $json.data.output.video_url }}",
                "options": {
                    "response": {
                        "response": {
                            "responseFormat": "file"
                        }
                    }
                }
            },
            "typeVersion": 4.20000000000000017763568394002504646778106689453125
        },
        {
            "id": "ea003577-5467-4acb-a33b-b4b30a03a35f",
            "name": "Save Music Background Locally1",
            "type": "n8n-nodes-base.readWriteFile",
            "position": [
                980,
                560
            ],
            "parameters": {
                "options": {
                    "append": false
                },
                "fileName": "=SoundBackground.mp3",
                "operation": "write"
            },
            "typeVersion": 1
        },
        {
            "id": "b9332740-c4e0-40f9-bc0d-c550c8f0f96d",
            "name": "Prepare Overlay Text (Quote & Author)1",
            "type": "n8n-nodes-base.code",
            "position": [
                300,
                860
            ],
            "parameters": {
                "jsCode": "\/\/ Define separate configuration for the quote and the author\nconst quoteFont = \"Kanit-Italic.ttf\";      \nconst quoteFontSize = 70;\nconst authorFont = \"Kanit-Italic.ttf\";     \nconst authorFontSize = 50;\nconst fontColor = \"white\";\nconst lineHeightMultiplier = 1.1;\nconst videoWidth = 1080;\nconst margin = 40;  \n\n\/\/ Effective width for the quote text\nconst effectiveVideoWidth = videoWidth - 2 * margin;\n\n\/\/ Estimate average character width based on quoteFontSize\nconst avgCharWidth = quoteFontSize * 0.6;\nconst maxCharsPerLine = Math.floor(effectiveVideoWidth \/ avgCharWidth);\n\n\/\/ Retrieve the quote and author from \"Select Random Video, Music & Quote\"\nconst transcript = $('Get data from Google Sheet').first().json['Quote (Thai)'];\nif (!transcript) {\n  throw new Error(\"Quote not found\");\n}\n\nconst author = $('Get data from Google Sheet').first().json['Pen Name (Thai)'];\nif (!author) {\n  throw new Error(\"Author not found\");\n}\n\n\/\/ Split transcript into words and group them into lines\nconst words = transcript.split(' ');\nconst lines = [];\nlet currentLine = \"\";\nlet currentCharCount = 0;\n\nwords.forEach(word => {\n  const wordLength = word.length;\n  const additionalSpace = currentLine ? 1 : 0;\n  const potentialLength = currentCharCount + additionalSpace + wordLength;\n  if (potentialLength <= maxCharsPerLine) {\n    currentLine += (currentLine ? \" \" : \"\") + word;\n    currentCharCount = potentialLength;\n  } else {\n    lines.push(currentLine);\n    currentLine = word;\n    currentCharCount = wordLength;\n  }\n});\nif (currentLine) {\n  lines.push(currentLine);\n}\n\n\/\/ Calculate layout for the quote block\nconst lineHeight = quoteFontSize * lineHeightMultiplier;\nconst totalHeight = lines.length * lineHeight;\n\n\/\/ Build drawtext commands for quote lines\nconst quoteCommands = lines.map((line, index) => {\n  const escapedLine = line.replace(\/'\/g, \"\\\\'\");\n  return `drawtext=fontfile=${quoteFont}:text='${escapedLine}':fontsize=${quoteFontSize}:fontcolor=${fontColor}:x=(w-text_w)\/2:y=((h-${totalHeight})\/2)+(${index}*${lineHeight})`;\n});\n\n\/\/ Build the drawtext command for author\nconst authorY = `((h-${totalHeight})\/2)+(${lines.length}*${lineHeight})+20`;\nconst escapedAuthor = author.replace(\/'\/g, \"\\\\'\");\nconst authorCommand = `drawtext=fontfile=${authorFont}:text='${escapedAuthor}':fontsize=${authorFontSize}:fontcolor=${fontColor}:x=w-text_w-${margin}:y=${authorY}`;\n\n\/\/ Combine all commands into one drawtext filter string\nconst fullDrawTextFilter = quoteCommands.concat(authorCommand).join(\", \");\n\n\/\/ Return the prepared filter string\nreturn {\n  json: {\n    drawText: fullDrawTextFilter\n  }\n};"
            },
            "typeVersion": 2
        },
        {
            "id": "79764093-f6ca-459b-a73c-3326fe82fafa",
            "name": "Generate Final Video Clip1",
            "type": "n8n-nodes-base.executeCommand",
            "position": [
                480,
                860
            ],
            "parameters": {
                "command": "=ffmpeg -i {{ $('Save Video Background Locally1').item.json.fileName }} -i {{ $('Save Music Background Locally1').item.json.fileName }} -filter_complex \"[0:v]scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920[vid]; color=black@0.3:size=1080x1920:d=10[bg]; [vid][bg]overlay=shortest=1[bgvid]; [bgvid]{{ $json.drawText }}[outv]; [1:a]volume=0.8[aout]\" -map \"[outv]\" -map \"[aout]\" -aspect 9:16 -c:v libx264 -c:a aac -shortest output.mp4 -y"
            },
            "typeVersion": 1
        },
        {
            "id": "3c301b6b-d6cb-41af-ac52-5722bed8470d",
            "name": "Initiate YouTube Resumable Upload",
            "type": "n8n-nodes-base.httpRequest",
            "position": [
                700,
                860
            ],
            "parameters": {
                "url": "=https:\/\/www.googleapis.com\/upload\/youtube\/v3\/videos?part=snippet,status&uploadType=resumable",
                "body": "={\n  \"snippet\": {\n    \"title\": \"{{ $('Get data from Google Sheet').item.json['Quote (Thai)'] }}\",\n    \"description\": \"{{ $('Get data from Google Sheet').item.json['Quote (Thai)'] }}\\n{{ $('Get data from Google Sheet').item.json['Pen Name (Thai)'] }}\",\n    \"defaultLanguage\": \"en\",\n    \"defaultAudioLanguage\": \"en\"\n  },\n  \"status\": {\n    \"privacyStatus\": \"public\",\n    \"license\": \"youtube\",\n    \"embeddable\": true,\n    \"publicStatsViewable\": true,\n    \"madeForKids\": false\n  }\n}",
                "method": "POST",
                "options": {
                    "response": {
                        "response": {
                            "fullResponse": true
                        }
                    }
                },
                "sendBody": true,
                "contentType": "raw",
                "sendHeaders": true,
                "authentication": "predefinedCredentialType",
                "rawContentType": "RAW\/JSON",
                "headerParameters": {
                    "parameters": [
                        {
                            "name": "Content-Type",
                            "value": "application\/json"
                        },
                        {
                            "name": "X-Upload-Content-Type",
                            "value": "video\/webm"
                        }
                    ]
                },
                "nodeCredentialType": "youTubeOAuth2Api"
            },
            "credentials": {
                "youTubeOAuth2Api": {
                    "id": "f9uNp5YNQMnXrNw2",
                    "name": "YouTube account"
                }
            },
            "typeVersion": 4.20000000000000017763568394002504646778106689453125
        },
        {
            "id": "dbde06b3-e7ba-4b7e-9d58-0a06f88b5176",
            "name": "Read output file",
            "type": "n8n-nodes-base.readWriteFile",
            "position": [
                880,
                860
            ],
            "parameters": {
                "options": [],
                "fileSelector": "=output.mp4"
            },
            "typeVersion": 1
        },
        {
            "id": "0b9b92e0-5500-4dca-a622-f63b3cdf0878",
            "name": "Upload Video to YouTube",
            "type": "n8n-nodes-base.httpRequest",
            "position": [
                1080,
                860
            ],
            "parameters": {
                "url": "={{ $('Initiate YouTube Resumable Upload').item.json.headers.location }}",
                "method": "PUT",
                "options": [],
                "sendBody": true,
                "contentType": "binaryData",
                "sendHeaders": true,
                "authentication": "predefinedCredentialType",
                "headerParameters": {
                    "parameters": [
                        {
                            "name": "Content-Type",
                            "value": "video\/webm"
                        }
                    ]
                },
                "inputDataFieldName": "data",
                "nodeCredentialType": "youTubeOAuth2Api"
            },
            "credentials": {
                "youTubeOAuth2Api": {
                    "id": "f9uNp5YNQMnXrNw2",
                    "name": "YouTube account"
                }
            },
            "typeVersion": 4.20000000000000017763568394002504646778106689453125
        },
        {
            "id": "721078b6-b1e2-4077-b1ff-696cb3765675",
            "name": "Update Quote Upload Status",
            "type": "n8n-nodes-base.googleSheets",
            "position": [
                1280,
                860
            ],
            "parameters": {
                "columns": {
                    "value": {
                        "Index": "={{ $('Get data from Google Sheet').item.json.Index }}",
                        "Video Status": "=https:\/\/www.youtube.com\/watch?v={{ $json.id }}"
                    },
                    "schema": [
                        {
                            "id": "Index",
                            "type": "string",
                            "display": true,
                            "removed": false,
                            "required": false,
                            "displayName": "Index",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Quote (Thai)",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Quote (Thai)",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Pen Name (Thai)",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Pen Name (Thai)",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Background (EN)",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Background (EN)",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Prompt (EN)",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Prompt (EN)",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Background Image",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Background Image",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Background Video",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Background Video",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Music Background",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Music Background",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Video Status",
                            "type": "string",
                            "display": true,
                            "required": false,
                            "displayName": "Video Status",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        }
                    ],
                    "mappingMode": "defineBelow",
                    "matchingColumns": [
                        "Index"
                    ],
                    "attemptToConvertTypes": false,
                    "convertFieldsToString": false
                },
                "options": [],
                "operation": "appendOrUpdate",
                "sheetName": {
                    "__rl": true,
                    "mode": "list",
                    "value": "gid=0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1p1iPoiu2uI3qGbHi0diS7QwsMcLuzDIqwo3AeSUVrGQ\/edit#gid=0",
                    "cachedResultName": "Sheet1"
                },
                "documentId": {
                    "__rl": true,
                    "mode": "id",
                    "value": "1p1iPoiu2uI3qGbHi0diS7QwsMcLuzDIqwo3AeSUVrGQ"
                }
            },
            "credentials": {
                "googleSheetsOAuth2Api": {
                    "id": "Ra2f1dlqOJ13jTtb",
                    "name": "Google Sheets account"
                }
            },
            "typeVersion": 4.5
        },
        {
            "id": "8900abd9-9f35-46a3-9b59-883ff16b0764",
            "name": "Sticky Note3",
            "type": "n8n-nodes-base.stickyNote",
            "position": [
                660,
                760
            ],
            "parameters": {
                "color": 5,
                "width": 760,
                "height": 300,
                "content": "## Video Upload & Post-Processing\nUpload the final video to YouTube using the YouTube API and update your Google Sheets with upload statuses and YouTube links."
            },
            "typeVersion": 1
        },
        {
            "id": "07cdec2c-9677-46f0-8038-641c4c191059",
            "name": "Sticky Note4",
            "type": "n8n-nodes-base.stickyNote",
            "position": [
                240,
                -80
            ],
            "parameters": {
                "color": 6,
                "width": 340,
                "height": 240,
                "content": "## Get Quote\nRetrieve quote data from Google Sheets including text, author, and background prompts."
            },
            "typeVersion": 1
        },
        {
            "id": "aeadbc59-13d7-4755-b38d-6d4946ecfa78",
            "name": "Sticky Note5",
            "type": "n8n-nodes-base.stickyNote",
            "position": [
                240,
                760
            ],
            "parameters": {
                "color": 6,
                "width": 400,
                "height": 300,
                "content": "## Combine All\nMerge video, sound, and quote text into final clip using FFmpeg."
            },
            "typeVersion": 1
        }
    ],
    "active": false,
    "pinData": [],
    "settings": {
        "executionOrder": "v1"
    },
    "versionId": "2c56841d-3045-4d6d-b643-0f3804bf2c3e",
    "connections": {
        "Get Video": {
            "main": [
                [
                    {
                        "node": "Get Binary Video Background",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Get image": {
            "main": [
                [
                    {
                        "node": "Update image background URL",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Generate Audio": {
            "main": [
                [
                    {
                        "node": "Upload Sound to Google Drive",
                        "type": "main",
                        "index": 0
                    },
                    {
                        "node": "Save Music Background Locally1",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Generate Image": {
            "main": [
                [
                    {
                        "node": "Wait image 2 min",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Image-to-Video": {
            "main": [
                [
                    {
                        "node": "Wait video 5 min",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Read output file": {
            "main": [
                [
                    {
                        "node": "Upload Video to YouTube",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Wait image 2 min": {
            "main": [
                [
                    {
                        "node": "Get image",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Wait video 5 min": {
            "main": [
                [
                    {
                        "node": "Get Video",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Upload Video to YouTube": {
            "main": [
                [
                    {
                        "node": "Update Quote Upload Status",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Generate Final Video Clip1": {
            "main": [
                [
                    {
                        "node": "Initiate YouTube Resumable Upload",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Get data from Google Sheet": {
            "main": [
                [
                    {
                        "node": "Generate Image",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Update Quote Upload Status": {
            "main": [
                []
            ]
        },
        "Get Binary Video Background": {
            "main": [
                [
                    {
                        "node": "Save Video Background Locally1",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Update Sound background URL": {
            "main": [
                []
            ]
        },
        "Update image background URL": {
            "main": [
                [
                    {
                        "node": "Image-to-Video",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Update video background URL": {
            "main": [
                [
                    {
                        "node": "Generate Audio",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Upload Sound to Google Drive": {
            "main": [
                [
                    {
                        "node": "Update Sound background URL",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Save Music Background Locally1": {
            "main": [
                [
                    {
                        "node": "Prepare Overlay Text (Quote & Author)1",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Save Video Background Locally1": {
            "main": [
                [
                    {
                        "node": "Update video background URL",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Initiate YouTube Resumable Upload": {
            "main": [
                [
                    {
                        "node": "Read output file",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "When clicking \u2018Test workflow\u2019": {
            "main": [
                [
                    {
                        "node": "Get data from Google Sheet",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Prepare Overlay Text (Quote & Author)1": {
            "main": [
                [
                    {
                        "node": "Generate Final Video Clip1",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        }
    }
}
Back to Workflows

Related Workflows

React to PDFMonkey Callback
View
Stickynote Notion Create Webhook
View
💥🛠️Build a Web Search Chatbot with GPT-4o and MCP Brave Search
View
Create, update, and get activity in Strava
View
Send Triggered
View
Stickynote Executeworkflow Create Triggered
View
Search & Summarize Web Data with Perplexity, Gemini AI & Bright Data to Webhooks
View
Wordpress-to-csv
View
On new Stripe Invoice Payment update Hubspot and notify the team in Slack
View