AutomationFlowsAI & RAG › Create Viral Social Media Videos with Falai Flux/kling and Gpt-4 Automation

Create Viral Social Media Videos with Falai Flux/kling and Gpt-4 Automation

ByMatthew @matthew-synteria on n8n.io

This workflow automates the entire process of creating short, cinematic, fact-based videos ready for social media. It takes a single concept, generates a script and visuals, creates video clips, adds a voiceover, and assembles a final video, which is then uploaded directly to…

Event trigger★★★★★ complexityAI-powered39 nodesGoogle DriveHTTP RequestOpenAIGoogle Sheets
AI & RAG Trigger: Event Nodes: 39 Complexity: ★★★★★ AI nodes: yes Added:

This workflow corresponds to n8n.io template #6918 — we link there as the canonical source.

This workflow follows the Google Drive → Google Sheets recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "cec5f9ad-36f7-4058-8457-2b2522ae2440",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        6048,
        -1712
      ],
      "parameters": {
        "color": 4,
        "width": 528,
        "height": 80,
        "content": "## Create Voiceover and Upload Video to Drive\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "14df5024-e051-473f-97e4-bf64e717b3e6",
      "name": "Upload file to drive",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        6224,
        -1008
      ],
      "parameters": {
        "name": "={{ $('Create New Idea1').first().json.message.content.name }}",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "root",
          "cachedResultName": "/ (Root folder)"
        }
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "7566a56d-0417-4657-a252-95cc9bbce206",
      "name": "URL to file",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        5952,
        -1008
      ],
      "parameters": {
        "url": "={{ $json.video_url }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "e0befd74-9b5d-4c1b-91e6-dca10d907db5",
      "name": "Get Full Voiceover Prompt",
      "type": "n8n-nodes-base.code",
      "position": [
        5744,
        -1568
      ],
      "parameters": {
        "jsCode": "let combined;\n\ntry {\n  // 1) grab the segments array\n  const segments = $('Generate Timed Script').first().json.message.content.segments;\n  if (!Array.isArray(segments)) {\n    throw new Error(\"Expected an array at ('Gnerate Timed Script').first().json.message.content.segments[0]\");\n  }\n\n  // 2) extract each text and trim whitespace\n  const texts = segments.map(s => {\n    if (typeof s.text !== \"string\") {\n      throw new Error(\"Each segment must have a text string\");\n    }\n    return s.text.trim();\n  });\n\n  // 3) join into one paragraph (spaces between sentences)\n  combined = texts.join(\" \");\n}\ncatch (err) {\n  throw new Error(\"Failed to combine segment texts: \" + err.message);\n}\n\n// 4) return a single item carrying your full script\nreturn [\n  {\n    json: {\n      paragraph: combined\n    }\n  }\n];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "7a3eb5bd-d354-4b6f-85a2-d18193340c86",
      "name": "Wait1",
      "type": "n8n-nodes-base.wait",
      "position": [
        5040,
        -1392
      ],
      "parameters": {
        "amount": 240
      },
      "typeVersion": 1.1
    },
    {
      "id": "eb52e5fb-1dbe-48e9-9994-007308743296",
      "name": "Wait11",
      "type": "n8n-nodes-base.wait",
      "position": [
        5040,
        -1168
      ],
      "parameters": {
        "amount": 700
      },
      "typeVersion": 1.1
    },
    {
      "id": "4b96227e-489d-4624-bc34-430dd7e33501",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3760,
        -960
      ],
      "parameters": {
        "color": 5,
        "width": 320,
        "height": 100,
        "content": "## Step 4: Merge Videos\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "56ac8431-b487-47a9-8155-e12eaa891de2",
      "name": "List Elements1",
      "type": "n8n-nodes-base.code",
      "position": [
        4368,
        -960
      ],
      "parameters": {
        "jsCode": "return [\n  {\n    video_urls: items.map(item => item.json.video.url)\n  }\n];"
      },
      "typeVersion": 2
    },
    {
      "id": "23f4420e-67bb-4462-92d1-21a71dfe5fb7",
      "name": "Merge1",
      "type": "n8n-nodes-base.merge",
      "position": [
        4144,
        -960
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.1
    },
    {
      "id": "9fa34ca3-ac63-4900-9870-e76717c1d969",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3968,
        -1168
      ],
      "parameters": {
        "width": 320,
        "height": 100,
        "content": "## Step 3: Generate videos\n"
      },
      "typeVersion": 1
    },
    {
      "id": "8f0801aa-f458-47a6-a362-6ac329a11345",
      "name": "Get Video1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        5504,
        -1168
      ],
      "parameters": {
        "url": "=https://queue.fal.run/fal-ai/kling-video/requests/{{ $json.request_id }}\n",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Key APIKEY"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "fb67f516-c2f9-4f4d-9405-f71081900cd3",
      "name": "Create Video1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        4608,
        -1168
      ],
      "parameters": {
        "url": "https://queue.fal.run/fal-ai/kling-video/v1.6/standard/image-to-video",
        "body": "={\n    \"prompt\": \"{{ $json.content }}\",\n    \"image_url\": \"{{ $('Get Images1').item.json.images[0].url }}\",\n    \"duration\": \"5\",\n    \"aspect_ratio\": \"9:16\",\n    \"negative_prompt\": \"bad quality\",\n    \"cfg_scale\": 0.5\n}",
        "method": "POST",
        "options": {
          "batching": {
            "batch": {
              "batchSize": 1,
              "batchInterval": 2000
            }
          }
        },
        "sendBody": true,
        "contentType": "raw",
        "sendHeaders": true,
        "rawContentType": "application/json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Key APIKEY"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "1ac22084-8049-408e-b38a-548c3c294939",
      "name": "Video Prompts1",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        4368,
        -1168
      ],
      "parameters": {
        "text": "=You are a prompt-generation AI trained to create short,\ncinematic, third-person video prompts.\n\nYou will analyze an uploaded image and create one clear,\nrealistic prompt describing a frozen moment.\n\nEach prompt must match the style of the context.\nOriginal photo-generation prompt for context:\n\"{{ $('Unbundle prompts1').item.json.prompt }}\"\nUse this only to understand the role, setting, or tone. Do\nnot copy or repeat it.\n\nRules\nNo \"I\" or \"POV\" phrasing.\nShort third-person sentences (under 300 characters).\nOnly one action.\n\nMention visible environmental textures (swirling dust storms,\nice crystals refracting light, layered rock strata, light\nshafts through thin atmospheres).\n\nNo emotional language, no cinematic words like \"camera\npans.\"\n\nOne frozen action per sentence, no chaining\n\nMatch cold, void, awe-inspiring documentary feeling.\n\nExample Outputs\n-A vibrant nebula glowing in shades of violet and gold against a backdrop of countless stars.\n\n-A spiral galaxy\u2019s dusty arms curving gracefully through the cosmic expanse.\n\n-The crescent Moon rising over an alien planet\u2019s lavender-hued horizon.\n\n-Auroral curtains dancing across the night sky of an icy polar world.\n\n-A binary star system entwined in a delicate orbital waltz amid drifting cosmic dust.\n\n-An asteroid silhouetted against a distant quasar, streaking silently through deep space.\n\nUse the uploaded image and matching description to generate\none short prompt in this\nstyle.",
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "chatgpt-4o-latest",
          "cachedResultName": "CHATGPT-4O-LATEST"
        },
        "options": {
          "detail": "high"
        },
        "resource": "image",
        "imageUrls": "={{ $json.images[0].url }}",
        "operation": "analyze"
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "f1cc898b-6f85-4f38-9eaa-e9c4fcaf0270",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4080,
        -1392
      ],
      "parameters": {
        "color": 3,
        "width": 320,
        "height": 100,
        "content": "## Step 2: Generate Images\n"
      },
      "typeVersion": 1
    },
    {
      "id": "ee58c36c-446a-4116-9a19-a4c241f6cf11",
      "name": "Get Images1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        5504,
        -1392
      ],
      "parameters": {
        "url": "=https://queue.fal.run/fal-ai/flux/requests/{{ $json.request_id }}",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Key APIKEY"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "8b819c5c-3939-4142-9000-f5e49f56c75a",
      "name": "Create Images1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        4608,
        -1392
      ],
      "parameters": {
        "url": "https://queue.fal.run/fal-ai/flux/schnell",
        "body": "={\n  \"prompt\": \"{{ $json.prompt }}\",\n  \"image_size\": \"portrait_16_9\"\n}",
        "method": "POST",
        "options": {
          "batching": {
            "batch": {
              "batchSize": 1,
              "batchInterval": 2000
            }
          }
        },
        "sendBody": true,
        "contentType": "raw",
        "sendHeaders": true,
        "rawContentType": "application/json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Key APIKEY"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "b6fd4153-abf9-44c6-ba02-45702ccc3840",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4208,
        -1568
      ],
      "parameters": {
        "color": 6,
        "width": 320,
        "height": 100,
        "content": "## Step 1: Generate prompts\n"
      },
      "typeVersion": 1
    },
    {
      "id": "dbf9c5dd-f7a3-4d85-8270-eaeacf778ac6",
      "name": "Unbundle prompts1",
      "type": "n8n-nodes-base.code",
      "position": [
        5504,
        -1568
      ],
      "parameters": {
        "jsCode": "// 1) Pull out the segments \nconst segments = items[0].json.message.content.scenes;\nif (!Array.isArray(segments)) {\n  throw new Error(\"Expected an array at items[0].json.message.content.segments\");\n}\n\n// 2) Map each segment to its own output item\nreturn segments.map(segment => {\n  if (typeof segment.prompt !== \"string\") {\n    throw new Error(\"Each segment must have a prompt string\");\n  }\n  return {\n    json: {\n      scene:   segment.scene,\n      start:   segment.start,\n      end:     segment.end,\n      prompt:  segment.prompt.trim()\n    }\n  };\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "26d4b225-a478-4a7d-835b-b86c10d2cf1a",
      "name": "Create New Idea1",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        5120,
        -1776
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1",
          "cachedResultName": "GPT-4.1"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "content": "=You are a highly intelligent AI designed to generate 1 immersive, viral idea. Your output must be formatted as a JSON array (single line) and follow all the rules below exactly.\n\nRULES:\n\nOnly return 1 idea at a time.\n\nThe Idea must:\nBe under 13 words.\nDescribe a realistic setting involving black holes or spatial bodies.\nDescribe a general setting or phenomenon, not a specific event or action.\nFocus on real-life.\nNo fantasy elements (no alien-to-astronaut rescues, no magical events).\nThis idea will be used to create a voiceover about fun facts related to the idea.\n\nThe Title must be: short, punchy, and viral-friendly.\nInclude one relevant emoji.\nInclude exactly 8 hashtags in this order:\n\n#4 hashtags relevant to the idea\n#4 all-time most popular hashtags\n\n4 idea related hashtags \n4 all-time most popular hashtags\nAll hashtags must be lowercase.\n\nSet Status to \"for production\" (always).\n\nThe Environment must:\nBe under 20 words.\nMatch the action in the Idea exactly (same participants and setting).\nClearly describe:\nWhere it's happening \nMain background details (starfield glow, Earth\u2019s curvature, nebula clouds, cosmic dust, etc.).\nparticipants (not necessary to be included) \nStyle of scene (cinematic realism, gritty documentary, aerial view, etc.).\n\nOUTPUT FORMAT (single-line JSON array):\n\n[\n{\n\"title\": \"Summarized viral idea title with emoji #4_relevant_hashtags #4_all_time_popular_hashtags,     \"idea\": \"Short description idea\",\n\"brief\": \"Brief vivid setting under 20 words matching the action\",\n\"status\": \"for production\",\n\"name\": \"2 word name for the idea in the format video_name\"\n}\n]"
            }
          ]
        },
        "jsonOutput": true
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "10a7f701-feaf-4a96-87e1-0c21d3e7ac50",
      "name": "Generating scenes1",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        5104,
        -1568
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1",
          "cachedResultName": "GPT-4.1"
        },
        "options": {
          "temperature": 0.7
        },
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "=You are a highly intelligent cinematic still-image prompt-generation AI.  "
            },
            {
              "content": "=Your task: For each of the 12 Scene text strings, write one frozen-moment image prompt.\n\nGLOBAL RULES\n1. **Length**\u2003\u2264 500 characters (count everything, including commas and \u201c8 K\u201d).  \n2. **Voice**\u2003Cinematic third-person, understated documentary tone.  \n3. **Detail**\u2003Highlight tactile textures, lighting, and scale.  \n4. **Relevance**\u2003Visually embody the *specific scientific or narrative idea* named in the Scene text:\n   \u2022 If a line mentions a substance or process, show it manifestly (e.g., carbon atoms compressed into a diamond-like lattice).  \n   \u2022 If a celestial body is named, include its full, explicit designation in the first clause (\u201cTitan, Saturn\u2019s moon\u201d).  \n5. **Language bans**\u2003No movement verbs (\u201corbiting,\u201d \u201cswirling\u201d), no camera jargon (\u201cpan,\u201d \u201cdolly\u201d), no fantasy elements.  \n6. **Framing**  \n   \u2022 One static, self-contained moment\u2014no set-ups or transitions.  \n   \u2022 No extreme close-ups.  \n   \u2022 Scene 1 and Scene 12 (or Scene 2 if preferred) must be wide, zoomed-out tableaux that introduce and close the sequence.  \n7. **Abbreviations**  \n   \u2022 Do *not* shorten proper names (write \u201cInternational Space Station,\u201d not \u201cISS\u201d, always write, \"Saturn's moon Titan\" not \"Titan\").  \n   \u2022 Technical tags \u201c8 K, 16-bit HDR\u201d stay exactly as written.  \n8. **Credible science**\u2003Keep visuals physically plausible; evocative realism beats strict textbook accuracy when they clash.  \n9.**Prompt format (flux/schnell):**\n\u201c[Tech framework] \u2014 [Subject], [Style], [Composition], [Lighting], [Colour palette], [Mood], [Extra].\u201d\n- **Tech framework** e.g. \u201cSpace-telescope capture on 30 cm f/2 refractor, simulated high resolution sensor, upscaled to 8 K, 16-bit HDR source\u201d  \n- **Use** `num_steps=3` (or 4 for extra micro-detail). \n\nFor each 5-second segment below, make the scene prompt so it reflects the vibe of each scene:\n\nScene 1:{{ $json.message.content.segments[0].text }}\nScene 2:{{ $json.message.content.segments[1].text }}\nScene 3:{{ $json.message.content.segments[2].text }}\nScene 4: {{ $json.message.content.segments[3].text }}\nScene 5: {{ $json.message.content.segments[4].text }}\nScene 6: {{ $json.message.content.segments[5].text }}\nScene 7: {{ $json.message.content.segments[6].text }}\nScene 8: {{ $json.message.content.segments[7].text }}\nScene 9: {{ $json.message.content.segments[8].text }}\nScene 10: {{ $json.message.content.segments[9].text }}\nScene 11: {{ $json.message.content.segments[10].text }}\nScene 12: {{ $json.message.content.segments[11].text }}\n\nOutput as a JSON array of 12 objects called scenes"
            },
            {
              "role": "assistant",
              "content": "=[\n  {\n    \"scene\": 1,\n    \"start\": \"0:00\",\n    \"end\": \"0:05\",\n    \"prompt\": \"Simulated Cassini orbiter camera, NASA-grade photo-realism \u2014 high-altitude oblique view above Saturn\u2019s ring plane, pale sunlight grazing endless black space, golden rings curving in broad arcs with the Cassini Division crisp, fine cosmic dust haze beyond, icy ring facets shimmering like crystalline prisms, awe-inspiring vastness, 16-bit HDR source\"\n  },\n  {\n    \"scene\": 2,\n    \"start\": \"0:05\",\n    \"end\": \"0:10\",\n    \"prompt\": \"Panoramic Cassini spacecraft capture, NASA-grade photo-realism \u2014 edge-to-edge view of Saturn\u2019s rings, thousands of parallel ringlets stretching to the horizon, mosaic of platinum, chalk-white and muted gold reflections, tactile grooves and ridges for sculpted depth, serene monumental scale, 16-bit HDR source\"\n  },\n  {\n    \"scene\": 3,\n    \"start\": \"0:10\",\n    \"end\": \"0:15\",\n    \"prompt\": \"Close-range spacecraft capture, NASA-grade photo-realism \u2014 razor-sharp terminator where Saturn\u2019s shadow meets sunlit rings, high-contrast boundary slicing across icy particles, glittering ice fragments and charcoal rock chips in stark relief, isolated crystals glowing like cold beacons, dramatic chiaroscuro effect, 16-bit HDR source\"\n  },\n  {\n    \"scene\": 4,\n    \"start\": \"0:15\",\n    \"end\": \"0:20\",\n    \"prompt\": \"Orbital macro capture, NASA-grade photo-realism \u2014 dense cluster of ring particles with house-sized ice boulders, muted sunlight diffusing through silvery haze, pock-marked frost-scored textures, long shadows draping the debris field, ancient dust softening chipped edges, finely detailed, 16-bit HDR source\"\n  },\n  {\n    \"scene\": 5,\n    \"start\": \"0:20\",\n    \"end\": \"0:25\",\n    \"prompt\": \"Narrow-angle spacecraft capture, NASA-grade photo-realism \u2014 extreme edge-on view of Saturn\u2019s rings as a razor-fine band of brilliant light, ethereal vertical spokes casting fleeting shadows on softly blurred cloud tops, gentle pale yellow to beige gradient in the atmosphere, minimalist elegance, 16-bit HDR source\"\n  },\n  {\n    \"scene\": 6,\n    \"start\": \"0:25\",\n    \"end\": \"0:30\",\n    \"prompt\": \"Simulated occultation capture, NASA-grade photo-realism \u2014 backlit cross-section of a sparsely populated ring region, paper-thin veil of ice particles glowing like embers, translucent layer against absolute black, subtle smoky aurora effect, ghostly luminosity fading toward darkness, 16-bit HDR source\"\n  },\n  {\n    \"scene\": 7,\n    \"start\": \"0:30\",\n    \"end\": \"0:35\",\n    \"prompt\": \"High-orbit spacecraft capture, NASA-grade photo-realism \u2014 Saturn\u2019s pale golden cloud bands in razor clarity, intricate ring shadows casting lace-like patterns on the upper atmosphere, pinpoint stars punctuating infinite dark, quiet cosmic grandeur, 16-bit HDR source\"\n  },\n  {\n    \"scene\": 8,\n    \"start\": \"0:35\",\n    \"end\": \"0:40\",\n    \"prompt\": \"Nadir spacecraft capture, NASA-grade photo-realism \u2014 overhead view revealing the Encke Division and wave-like ridges in icy bands, sharp-edged corrugations sculpted by shepherd moons, precise concentric order, scientific clarity, 16-bit HDR source\"\n  },\n  {\n    \"scene\": 9,\n    \"start\": \"0:40\",\n    \"end\": \"0:45\",\n    \"prompt\": \"Deep-space orbiter capture, NASA-grade photo-realism \u2014 Pandora and Prometheus near the F ring boundary, gravitationally sculpted edge where orderly ice meets frost-dusted moon surfaces, pocked craters and jagged ridges under grazing sunlight, 16-bit HDR source\"\n  },\n  {\n    \"scene\": 10,\n    \"start\": \"0:45\",\n    \"end\": \"0:50\",\n    \"prompt\": \"Panoramic outer-ring capture, NASA-grade photo-realism \u2014 diffuse fringe of Saturn\u2019s rings with faint streaks and scattered ice motes soft-blurred into the surrounding void, lingering dust wisps above the plane, soft edges dissolving into emptiness, serene ethereal mood, 16-bit HDR source\"\n  },\n  {\n    \"scene\": 11,\n    \"start\": \"0:50\",\n    \"end\": \"0:55\",\n    \"prompt\": \"Side-by-side comparative capture, NASA-grade photo-realism \u2014 left sector gleaming with fresh white ice, right sector draped in subtle reddish graphite veil, vertical structures casting threadlike shadows, highlighting slow chemical and physical evolution, scientific tone, 16-bit HDR source\"\n  },\n  {\n    \"scene\": 12,\n    \"start\": \"0:55\",\n    \"end\": \"1:00\",\n    \"prompt\": \"Grand top-down spacecraft capture, NASA-grade photo-realism \u2014 fully illuminated rings fanning outward in perfect concentric order, intense white fire atop cloud decks, diffuse glow on upper atmosphere, stars and wispy nebulae framing cosmic scale, majestic and profound, 16-bit HDR source\"\n  }\n]\n"
            }
          ]
        },
        "jsonOutput": true
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "ffbac481-add5-42a0-872c-316782beb11b",
      "name": "Organise idea, caption etc1",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        4608,
        -1568
      ],
      "parameters": {
        "columns": {
          "value": {
            "id": "==ROW()-1",
            "idea": "={{ $json.message.content.idea }}",
            "caption": "={{ $json.message.content.title }}",
            "production": "for production",
            "environment_prompt": "={{ $json.message.content.brief }}"
          },
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "id",
              "defaultMatch": true,
              "canBeUsedToMatch": true
            },
            {
              "id": "idea",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "idea",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "caption",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "caption",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "production",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "production",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "environment_prompt",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "environment_prompt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "final_output",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "final_output",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "id"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1bDfwrU6m7UmR9b3pYKRh3tkM9Y-g4CAMo7Q_x1Pbx-k/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1bDfwrU6m7UmR9b3pYKRh3tkM9Y-g4CAMo7Q_x1Pbx-k",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1bDfwrU6m7UmR9b3pYKRh3tkM9Y-g4CAMo7Q_x1Pbx-k/edit?usp=drivesdk",
          "cachedResultName": "Sheet tt auto"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "136ca028-9b42-4f1b-8f38-e892ff66b36c",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4640,
        -1776
      ],
      "parameters": {
        "color": 4,
        "height": 100,
        "content": "## Input\nStarting idea"
      },
      "typeVersion": 1
    },
    {
      "id": "788fbc81-cd89-4279-aba3-0f407139b5a1",
      "name": "Combine Voice and Video",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        5952,
        -1376
      ],
      "parameters": {
        "url": "https://queue.fal.run/fal-ai/ffmpeg-api/compose",
        "body": "={\n  \"tracks\": [\n    {\n      \"id\": \"1\",\n      \"type\": \"video\",\n      \"keyframes\": [\n        {\n          \"url\": \"{{ $('Get Final video').item.json.video_url }}\",\n          \"timestamp\": 0,\n          \"duration\": 65\n        }\n      ]\n    },\n    {\n      \"id\": \"2\",\n      \"type\": \"audio\",\n      \"keyframes\": [\n        {\n          \"url\": \"{{ $json.audio.url }}\",\n          \"timestamp\": 0,\n          \"duration\": 65\n        }\n      ]\n    }\n  ]\n}",
        "method": "POST",
        "options": {
          "batching": {
            "batch": {
              "batchSize": 1,
              "batchInterval": 5000
            }
          }
        },
        "sendBody": true,
        "contentType": "raw",
        "sendHeaders": true,
        "rawContentType": "application/json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Key APIKEY"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "9d2de0c8-68c4-4565-bb1d-610cefa5e164",
      "name": "Get Voice and Video",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        6560,
        -1376
      ],
      "parameters": {
        "url": "=https://queue.fal.run/fal-ai/elevenlabs/\nrequests/{{ $json.request_id }}",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Key APIKEY"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "56bce7d8-5783-46de-a18c-6915724223a0",
      "name": "Wait10",
      "type": "n8n-nodes-base.wait",
      "position": [
        6272,
        -1376
      ],
      "parameters": {
        "amount": 280
      },
      "typeVersion": 1.1
    },
    {
      "id": "dbf802be-231d-4a63-a3a6-1f00e79103b5",
      "name": "Get Voiceover",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        6560,
        -1568
      ],
      "parameters": {
        "url": "=https://queue.fal.run/fal-ai/elevenlabs/\nrequests/{{ $json.request_id }}",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Key APIKEY"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "0696cd4b-1d73-4ef2-a15e-f0208b9251ad",
      "name": "Create Voiceover",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        5952,
        -1568
      ],
      "parameters": {
        "url": "https://queue.fal.run/fal-ai/elevenlabs/tts/turbo-v2.5",
        "body": "={\n\n\"text\": \"{{ $json.paragraph }}\",\n\n\"voice\": \"nPczCjzI2devNBz1zQrb\",\n\n\"stability\": 0.5,\n\n\"similarity_boost\": 0.75,\n\n\"speed\": 1\n\n}",
        "method": "POST",
        "options": {
          "batching": {
            "batch": {
              "batchSize": 1,
              "batchInterval": 5000
            }
          }
        },
        "sendBody": true,
        "contentType": "raw",
        "sendHeaders": true,
        "rawContentType": "application/json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Key APIKEY"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "8fd256af-b26d-4a5c-b6e0-1e199bedfdbf",
      "name": "Wait9",
      "type": "n8n-nodes-base.wait",
      "position": [
        6272,
        -1568
      ],
      "parameters": {
        "amount": 280
      },
      "typeVersion": 1.1
    },
    {
      "id": "7ad22553-871b-47d6-a7fe-fe484849fde0",
      "name": "Final Video (Longest)",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        5952,
        -1184
      ],
      "parameters": {
        "columns": {
          "value": {
            "idea": "={{ $('Organise idea, caption etc1').first().json.idea }}",
            "production": "done",
            "final_output": "={{ $json.video_url }}"
          },
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "id",
              "defaultMatch": true,
              "canBeUsedToMatch": true
            },
            {
              "id": "idea",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "idea",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "caption",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "caption",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "production",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "production",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "environment_prompt",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "environment_prompt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "final_output",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "final_output",
              "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": [
            "idea"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1bDfwrU6m7UmR9b3pYKRh3tkM9Y-g4CAMo7Q_x1Pbx-k/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1bDfwrU6m7UmR9b3pYKRh3tkM9Y-g4CAMo7Q_x1Pbx-k",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1bDfwrU6m7UmR9b3pYKRh3tkM9Y-g4CAMo7Q_x1Pbx-k/edit?usp=drivesdk",
          "cachedResultName": "Sheet tt auto"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "893d73b8-8c75-41e6-81a7-636cf09b2c7f",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        4928,
        -1776
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "4083ca2c-d18d-45ae-a00a-9f57b48e1792",
      "name": "Generate Timed Script",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        4784,
        -1568
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1",
          "cachedResultName": "GPT-4.1"
        },
        "options": {
          "temperature": 0.8
        },
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "=You are a highly intelligent Eleven Labs Voiceover Script AI"
            },
            {
              "content": "=Generate exactly twelve segments of documentary-style narration all of these segments must combine seemlessly, each 5 seconds long, as a JSON array. Each element must have keys: start (mm:ss), end (mm:ss), text (8\u201312 words). No line breaks or extras. \n\nYour goal should be to tell an interesting story based on true facts in a present tense outside perspective. Always start by introducing the thing thats being talked about and make sure it has an engaging hook. And sign off at the end with a call to action, similar to \"If you found this interesting, comment your thoughts below and follow for more.\"\n\nMatch the general idea: Title: {{$('Create New Idea1').first().json.message.content.title}} Idea: {{$('Create New Idea1').first().json.message.content.idea}}.\n\nSCRIPTS SHOULD BE IN 5 SECOND SEGMENTS\n\n"
            },
            {
              "role": "assistant",
              "content": "{\n{\n  \"segments\": [\n    {\n      \"start\": \"0:00\",\n      \"end\": \"0:05\",\n      \"text\": \"This is Europa, Jupiter's fourth-largest moon,\"\n    },\n    {\n      \"start\": \"0:05\",\n      \"end\": \"0:10\",\n      \"text\": \"and the only celestial object in our solar system that might contain alien lifeforms.\"\n    },\n    {\n      \"start\": \"0:10\",\n      \"end\": \"0:15\",\n      \"text\": \"Europa not only has a vast ocean that is five times deeper than the Earth's, even though it's smaller than our Moon,\"\n    },\n    {\n      \"start\": \"0:15\",\n      \"end\": \"0:20\",\n      \"text\": \"but also oxygen, nitrogen, carbon dioxide, and sulfur\u2014gases necessary for life.\"\n    },\n    {\n      \"start\": \"0:20\",\n      \"end\": \"0:25\",\n      \"text\": \"Europa gets its heat from the Sun, and mostly through Jupiter's gravity,\"\n    },\n    {\n      \"start\": \"0:25\",\n      \"end\": \"0:30\",\n      \"text\": \"which stretches and squeezes Europa as it orbits the giant planet.\"\n    },\n    {\n      \"start\": \"0:30\",\n      \"end\": \"0:35\",\n      \"text\": \"This friction warms Europa\u2019s interior, keeping its hidden ocean liquid\u2014just like Earth\u2019s tides.\"\n    },\n    {\n      \"start\": \"0:35\",\n      \"end\": \"0:40\",\n      \"text\": \"However, NASA is launching the Europa Clipper this year to probe beneath the 15-mile-thick ice crust,\"\n    },\n    {\n      \"start\": \"0:40\",\n      \"end\": \"0:45\",\n      \"text\": \"and possibly detect signs of marine life in that vast ocean.\"\n    },\n    {\n      \"start\": \"0:45\",\n      \"end\": \"0:50\",\n      \"text\": \"The more we learn about the cosmos, the more we realize we are not alone.\"\n    },\n    {\n      \"start\": \"0:50\",\n      \"end\": \"0:55\",\n      \"text\": \"The universe is alive\u2014and we are part of its grand story.\"\n    },\n    {\n      \"start\": \"0:55\",\n      \"end\": \"1:00\",\n      \"text\": \"If you found this interesting, comment your thoughts below and follow for more.\"\n    }\n  ]\n}\n"
            }
          ]
        },
        "jsonOutput": true
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "d9f1dda7-d315-4fc7-92fd-c5864be299be",
      "name": "Get Final video",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        5504,
        -960
      ],
      "parameters": {
        "url": "=https://queue.fal.run/fal-ai/ffmpeg-api/requests/{{ $json.request_id }}",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Key APIKEY"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "b84cf97a-2c35-4954-ad90-97e93f318d77",
      "name": "Create Final Video",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        4608,
        -960
      ],
      "parameters": {
        "url": "https://queue.fal.run/fal-ai/ffmpeg-api/compose",
        "body": "={\n  \"tracks\": [\n    {\n      \"id\": \"1\",\n      \"type\": \"video\",\n      \"keyframes\": [\n        {\n          \"url\": \"{{ $json.video_urls[0] }}\",\n          \"timestamp\": 0,\n          \"duration\": 5\n        },\n        {\n          \"url\": \"{{ $json.video_urls[1] }}\",\n          \"timestamp\": 5,\n          \"duration\": 5\n        },\n        {\n          \"url\": \"{{ $json.video_urls[2] }}\",\n          \"timestamp\": 10,\n          \"duration\": 5\n        },\n        {\n          \"url\": \"{{ $json.video_urls[3] }}\",\n          \"timestamp\": 15,\n          \"duration\": 5\n        },\n        {\n          \"url\": \"{{ $json.video_urls[4] }}\",\n          \"timestamp\": 20,\n          \"duration\": 5\n        },\n        {\n          \"url\": \"{{ $json.video_urls[5] }}\",\n          \"timestamp\": 25,\n          \"duration\": 5\n        },\n        {\n          \"url\": \"{{ $json.video_urls[6] }}\",\n          \"timestamp\": 30,\n          \"duration\": 5\n        },\n        {\n          \"url\": \"{{ $json.video_urls[7] }}\",\n          \"timestamp\": 35,\n          \"duration\": 5\n        },\n        {\n          \"url\": \"{{ $json.video_urls[8] }}\",\n          \"timestamp\": 40,\n          \"duration\": 5\n        },\n        {\n          \"url\": \"{{ $json.video_urls[9] }}\",\n          \"timestamp\": 45,\n          \"duration\": 5\n        },\n        {\n          \"url\": \"{{ $json.video_urls[10] }}\",\n          \"timestamp\": 50,\n          \"duration\": 5\n        },\n        {\n          \"url\": \"{{ $json.video_urls[11] }}\",\n          \"timestamp\": 55,\n          \"duration\": 5\n        }\n      ]\n    }\n  ]\n}",
        "method": "POST",
        "options": {
          "batching": {
            "batch": {
              "batchSize": 1,
              "batchInterval": 5000
            }
          }
        },
        "sendBody": true,
        "contentType": "raw",
        "sendHeaders": true,
        "rawContentType": "application/json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Key APIKEY"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "699268b3-8ad2-41fc-b923-eab121d8294a",
      "name": "Wait3",
      "type": "n8n-nodes-base.wait",
      "position": [
        5040,
        -960
      ],
      "parameters": {
        "amount": 200
      },
      "typeVersion": 1.1
    },
    {
      "id": "6129b11e-b5de-42c4-bf37-5d944698b7fc",
      "name": "Workflow Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5072,
        -2688
      ],
      "parameters": {
        "color": 4,
        "width": 600,
        "height": 450,
        "content": "## \ud83d\ude80 AI Viral Video Factory - Overview\n\nThis workflow automates the creation of a 60-second, narrated, cinematic video from a single idea.\n\n**1. Ideation & Scripting (OpenAI)**\n* A viral concept, title, and hashtags are generated.\n* A detailed 12-scene script is written to match a 60-second runtime.\n* The full script is converted into a voiceover audio file.\n\n**2. Visual Generation Loop (Fal.ai & OpenAI)**\n* The workflow loops through each of the 12 scenes.\n* For each scene, it generates a photorealistic image using **Fal.ai Flux**.\n* **OpenAI Vision** analyzes the image to create a cinematic animation prompt.\n* The image is animated into a 5-second clip using **Fal.ai Kling**.\n\n**3. Assembly & Finalization (Fal.ai & Google)**\n* All 12 video clips are stitched together into one seamless video using **Fal.ai FFMPEG**.\n* The voiceover audio is merged with the final video.\n* The completed video is uploaded to **Google Drive**."
      },
      "typeVersion": 1
    },
    {
      "id": "d24c5bab-09f6-42bf-833a-2f5e2d645767",
      "name": "Critical Setup",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4592,
        -2192
      ],
      "parameters": {
        "color": 5,
        "width": 380,
        "height": 376,
        "content": "## \u26a0\ufe0f CRITICAL SETUP \u26a0\ufe0f\n\nThis workflow will **FAIL** without the correct credentials.\n\n1.  **Add Credentials in n8n:**\n    * OpenAI API Key\n    * Google Account (for Sheets & Drive)\n    * Fal.ai API Key\n\n2.  **Configure Fal.ai Key in HTTP Nodes:**\n    * You **MUST** manually update all HTTP Request nodes calling `fal.run`.\n    * In each node, go to `Headers` and replace the placeholder `Authorization` value with your own Fal.ai key."
      },
      "typeVersion": 1
    },
    {
      "id": "6f182fa4-a4ef-499d-ae20-b92f16e20122",
      "name": "Scene Generation Loop",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5440,
        -2192
      ],
      "parameters": {
        "color": 3,
        "width": 420,
        "height": 346,
        "content": "## \ud83c\udfac The Scene Generation Loop\n\nThis section runs 12 times (once per scene) to create the visuals.\n\n1.  **Image Generation `(Create Images1)`**: Creates a still image from the script's text prompt using **Fal.ai Flux**.\n\n2.  **Animation Prompt `(Video Prompts1)`**: **OpenAI Vision** analyzes the new image and writes a *new* prompt specifically for animating it.\n\n3.  **Image-to-Video `(Create Video1)`**: Animates the still image into a 5-second clip using **Fal.ai Kling** and the new animation prompt."
      },
      "typeVersion": 1
    },
    {
      "id": "469968fa-6fe9-414d-a331-89ae5aab6497",
      "name": "How to Customize",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5024,
        -2192
      ],
      "parameters": {
        "color": 6,
        "width": 350,
        "height": 284,
        "content": "## \ud83d\udd27 How to Customize & Run\n\n**To Run the Workflow:**\n* Click `Execute Workflow` to generate one full video based on the current prompt.\n\n**To Change the Video Topic:**\n1.  Select the **`Create New Idea1`** (OpenAI) node.\n2.  Edit the main prompt inside to change the core theme (e.g., from `\"black holes\"` to `\"ocean life\"` or `\"ancient Rome\"`)."
      },
      "typeVersion": 1
    },
    {
      "id": "1699ce4f-49e3-464f-85c2-ac5435ab568f",
      "name": "Fal.ai API Reference",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5920,
        -2192
      ],
      "parameters": {
        "width": 360,
        "height": 404,
        "content": "## Fal.ai API Reference\n\nThis workflow uses several Fal.ai models via the HTTP Request node.\n\n* **`fal-ai/flux/schnell`**\n    * *Purpose*: High-speed text-to-image generation.\n\n* **`fal-ai/kling-video`**\n    * *Purpose*: Animates a still image based on a prompt.\n\n* **`fal-ai/ffmpeg-api`**\n    * *Purpose*: Used for video/audio manipulation (`concatenate` to stitch clips, `compose` to add audio)."
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Wait1": {
      "main": [
        [
          {
            "node": "Get Images1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait3": {
      "main": [
        [
          {
            "node": "Get Final video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait9": {
      "main": [
        [
          {
            "node": "Get Voiceover",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge1": {
      "main": [
        [
          {
            "node": "List Elements1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait10": {
      "main": [
        [
          {
            "node": "Get Voice and Video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait11": {
      "main": [
        [
          {
            "node": "Get Video1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Video1": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Images1": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 1
          },
          {
            "node": "Video Prompts1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "URL to file": {
      "main": [
        [
          {
            "node": "Upload file to drive",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Video1": {
      "main": [
        [
          {
            "node": "Wait11",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Voiceover": {
      "main": [
        [
          {
            "node": "Combine Voice and Video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Images1": {
      "main": [
        [
          {
            "node": "Wait1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "List Elements1": {
      "main": [
        [
          {
            "node": "Create Final Video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Video Prompts1": {
      "main": [
        [
          {
            "node": "Create Video1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Final video": {
      "main": [
        [
          {
            "node": "Get Full Voiceover Prompt",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create New Idea1": {
      "main": [
        [
          {
            "node": "Organise idea, caption etc1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Voiceover": {
      "main": [
        [
          {
            "node": "Wait9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Unbundle prompts1": {
      "main": [
        [
          {
            "node": "Create Images1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Final Video": {
      "main": [
        [
          {
            "node": "Wait3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generating scenes1": {
      "main": [
        [
          {
            "node": "Unbundle prompts1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Voice and Video": {
      "main": [
        [
          {
            "node": "URL to file",
            "type": "main",
            "index": 0
          },
          {
            "node": "Final Video (Longest)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Timed Script": {
      "main": [
        [
          {
            "node": "Generating scenes1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Combine Voice and Video": {
      "main": [
        [
          {
            "node": "Wait10",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Full Voiceover Prompt": {
      "main": [
        [
          {
            "node": "Create Voiceover",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Organise idea, caption etc1": {
      "main": [
        [
          {
            "node": "Generate Timed Script",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Create New Idea1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow automates the entire process of creating short, cinematic, fact-based videos ready for social media. It takes a single concept, generates a script and visuals, creates video clips, adds a voiceover, and assembles a final video, which is then uploaded directly to…

Source: https://n8n.io/workflows/6918/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

The Problem That it Solves

Google Drive Trigger, OpenAI, Google Drive +5
AI & RAG

Scrape ads – Pulls Facebook Ad Library data for "ai automation" keywords using Apify Filter & sort – Filters ads by page likes (&gt;1,000) and separates into videos, images, and text ads Analyze creat

HTTP Request, Google Drive, OpenAI +3
AI & RAG

This workflow converts emailed timesheets into structured invoice rows in Google Sheets and stores them in the correct Google Drive folder structure.

Gmail Trigger, OpenAI, Google Sheets +2
AI & RAG

Content creators, YouTubers, and social media managers who want to repurpose long form videos into short clips without doing it manually. Works on self hosted n8n instances.

Google Drive Trigger, Google Drive, N8N Nodes Renderio +3
AI & RAG

[Template] Viral Video Factory - Fal.ai + GPT-4. Uses googleDrive, httpRequest, openAi, googleSheets. Event-driven trigger; 39 nodes.

Google Drive, HTTP Request, OpenAI +1