{
  "name": "\uc218\ub2ec \uc1fc\uce20 \uc790\ub3d9\ud654 \uc6cc\ud06c\ud50c\ub85c\uc6b0",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 9 * * *"
            }
          ]
        }
      },
      "id": "node-trigger",
      "name": "\ub9e4\uc77c \uc624\uc804 9\uc2dc \ud2b8\ub9ac\uac70",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.1,
      "position": [
        240,
        300
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.anthropic.com/v1/messages",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "x-api-key",
              "value": "={{ $credentials.httpHeaderAuth.value }}"
            },
            {
              "name": "anthropic-version",
              "value": "2023-06-01"
            },
            {
              "name": "content-type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "bodyParameters": {
          "parameters": []
        },
        "specifyBody": "json",
        "jsonBody": "{\n  \"model\": \"claude-sonnet-4-5\",\n  \"max_tokens\": 2000,\n  \"system\": \"\ub2f9\uc2e0\uc740 '\ucde8\uc900\ud558\ub294 \uc218\ub2ec\uc774' \uc1fc\uce20 \uc601\uc0c1 \ucf58\ud150\uce20 \ud06c\ub9ac\uc5d0\uc774\ud130\uc785\ub2c8\ub2e4.\\n\\n[\uce90\ub9ad\ud130 \uc124\uc815]\\n- \uc774\ub984: \uc218\ub2ec\uc774\\n- \ucee8\uc149: \ucde8\uc5c5 \uc900\ube44 \uc911\uc778 \uadc0\uc5ec\uc6b4 3D \uc218\ub2ec\\n- \ub9d0\ud22c: \uacf5\uac10\uac00\uace0 \uadc0\uc5fd\uace0 \ub530\ub73b\ud55c \ud1a4\\n- \ud0c0\uac9f: \ucde8\uc900\uc0dd, \uc9c1\uc7a5\uc778 \uacf5\uac10 \ucf58\ud150\uce20\\n\\n[\ucd9c\ub825 \ud615\uc2dd - \ubc18\ub4dc\uc2dc JSON\uc73c\ub85c\ub9cc \uc751\ub2f5]\\n{\\n  \\\"title\\\": \\\"\uc601\uc0c1 \uc81c\ubaa9\\\",\\n  \\\"concept\\\": \\\"\uc624\ub298\uc758 \ucee8\uc149 \ud55c \uc904 \uc124\uba85\\\",\\n  \\\"bgm_mood\\\": \\\"bgm \ubd84\uc704\uae30 \ud0a4\uc6cc\ub4dc (\uc608: lofi, \ub530\ub73b\ud55c, \uac10\uc131\uc801)\\\",\\n  \\\"scenes\\\": [\\n    {\\n      \\\"scene_number\\\": 1,\\n      \\\"duration_sec\\\": 4,\\n      \\\"narration\\\": \\\"\ub098\ub808\uc774\uc158 \ud14d\uc2a4\ud2b8\\\",\\n      \\\"image_prompt_en\\\": \\\"Gemini \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc6a9 \uc601\uc5b4 \ud504\ub86c\ud504\ud2b8. \ubc18\ub4dc\uc2dc \ud3ec\ud568: cute 3D otter with big dark eyes, brown fur, white cheeks, chubby face, Pixar-style animation, warm soft lighting, vertical 9:16 format\\\",\\n      \\\"subtitle\\\": \\\"\uc601\uc0c1\uc5d0 \ud45c\uc2dc\ub420 \uc790\ub9c9 \ud14d\uc2a4\ud2b8\\\"\\n    }\\n  ],\\n  \\\"srt_content\\\": \\\"SRT \uc790\ub9c9 \ud30c\uc77c \uc804\uccb4 \ub0b4\uc6a9\\\"\\n}\",\n  \"messages\": [\n    {\n      \"role\": \"user\",\n      \"content\": \"\uc624\ub298 \ub0a0\uc9dc: {{ $now.toFormat('yyyy-MM-dd') }}\\n\\n\ucde8\uc900\ud558\ub294 \uc218\ub2ec\uc774 \uc1fc\uce20 \uc601\uc0c1 1\ud3b8\uc744 \uae30\ud68d\ud574\uc8fc\uc138\uc694.\\n- \ucd1d 4~5\uac1c \uc52c\\n- \uac01 \uc52c 4~5\ucd08\\n- \uc804\uccb4 \uc601\uc0c1 15~20\ucd08\\n- \uc624\ub298\uc758 \ucde8\uc900 \uacf5\uac10 \uc8fc\uc81c\ub85c \uc2a4\ud1a0\ub9ac \uad6c\uc131\\n- SRT \uc790\ub9c9 \ud30c\uc77c\ub3c4 \ud568\uaed8 \uc0dd\uc131 (\uac01 \uc52c \ud0c0\uc784\ucf54\ub4dc \ud3ec\ud568)\\n\\nJSON \ud615\uc2dd\uc73c\ub85c\ub9cc \uc751\ub2f5\ud558\uc138\uc694. \ub9c8\ud06c\ub2e4\uc6b4 \ucf54\ub4dc\ube14\ub85d \uc5c6\uc774 \uc21c\uc218 JSON\ub9cc.\"\n    }\n  ]\n}",
        "options": {}
      },
      "id": "node-claude",
      "name": "Claude - \uc2a4\ud06c\ub9bd\ud2b8 \uc0dd\uc131",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        460,
        300
      ],
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// Claude \uc751\ub2f5\uc5d0\uc11c JSON \ud30c\uc2f1\nconst response = $input.first().json;\nconst content = response.content[0].text;\n\n// JSON \ud30c\uc2f1 (\ub9c8\ud06c\ub2e4\uc6b4 \ucf54\ub4dc\ube14\ub85d \uc81c\uac70 \ud6c4)\nconst cleanJson = content\n  .replace(/```json\\n?/g, '')\n  .replace(/```\\n?/g, '')\n  .trim();\n\nlet scriptData;\ntry {\n  scriptData = JSON.parse(cleanJson);\n} catch(e) {\n  throw new Error('Claude \uc751\ub2f5 \ud30c\uc2f1 \uc2e4\ud328: ' + content);\n}\n\n// \uc52c\ubcc4\ub85c \uac1c\ubcc4 \uc544\uc774\ud15c \uc0dd\uc131 (Gemini \uc774\ubbf8\uc9c0 \uc0dd\uc131\uc6a9)\nconst scenes = scriptData.scenes;\nconst results = [];\n\nfor (const scene of scenes) {\n  results.push({\n    json: {\n      // \uc804\uccb4 \uc2a4\ud06c\ub9bd\ud2b8 \ub370\uc774\ud130\n      title: scriptData.title,\n      concept: scriptData.concept,\n      bgm_mood: scriptData.bgm_mood,\n      srt_content: scriptData.srt_content,\n      total_scenes: scenes.length,\n      // \ud604\uc7ac \uc52c \ub370\uc774\ud130\n      scene_number: scene.scene_number,\n      duration_sec: scene.duration_sec,\n      narration: scene.narration,\n      image_prompt_en: scene.image_prompt_en,\n      subtitle: scene.subtitle,\n      // \ud30c\uc77c\uba85\uc6a9 \ub0a0\uc9dc\n      date_str: new Date().toISOString().split('T')[0]\n    }\n  });\n}\n\nreturn results;"
      },
      "id": "node-parse",
      "name": "\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        680,
        300
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.1-flash-image-preview:generateContent",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpQueryAuth",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "{\n  \"contents\": [\n    {\n      \"parts\": [\n        {\n          \"text\": \"{{ $json.image_prompt_en }}, vertical 9:16 aspect ratio, for YouTube Shorts\"\n        }\n      ]\n    }\n  ],\n  \"generationConfig\": {\n    \"responseModalities\": [\"IMAGE\", \"TEXT\"],\n    \"responseMimeType\": \"image/png\"\n  }\n}",
        "options": {}
      },
      "id": "node-gemini",
      "name": "Gemini - \uc774\ubbf8\uc9c0 \uc0dd\uc131",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        900,
        300
      ],
      "credentials": {
        "httpQueryAuth": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// Gemini \uc751\ub2f5\uc5d0\uc11c base64 \uc774\ubbf8\uc9c0 \ucd94\ucd9c\nconst response = $input.first().json;\nconst sceneData = $input.first().json;\n\n// Gemini \uc774\ubbf8\uc9c0 \uc751\ub2f5 \ud30c\uc2f1\nlet base64Image = null;\nlet mimeType = 'image/png';\n\ntry {\n  const parts = response.candidates[0].content.parts;\n  for (const part of parts) {\n    if (part.inlineData) {\n      base64Image = part.inlineData.data;\n      mimeType = part.inlineData.mimeType || 'image/png';\n      break;\n    }\n  }\n} catch(e) {\n  throw new Error('Gemini \uc774\ubbf8\uc9c0 \ud30c\uc2f1 \uc2e4\ud328: ' + JSON.stringify(response));\n}\n\nif (!base64Image) {\n  throw new Error('\uc774\ubbf8\uc9c0 \ub370\uc774\ud130\ub97c \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4');\n}\n\nreturn [{\n  json: {\n    title: $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.title,\n    concept: $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.concept,\n    bgm_mood: $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.bgm_mood,\n    srt_content: $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.srt_content,\n    scene_number: $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.scene_number,\n    subtitle: $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.subtitle,\n    date_str: $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.date_str,\n    total_scenes: $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.total_scenes,\n    image_base64: base64Image,\n    mime_type: mimeType,\n    file_name: `scene_${ $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.scene_number }_${ $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.date_str }.png`\n  },\n  binary: {\n    image: {\n      data: base64Image,\n      mimeType: mimeType,\n      fileName: `scene_${ $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.scene_number }_${ $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').item.json.date_str }.png`\n    }\n  }\n}];"
      },
      "id": "node-extract-image",
      "name": "\uc774\ubbf8\uc9c0 \ucd94\ucd9c",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1120,
        300
      ]
    },
    {
      "parameters": {
        "operation": "upload",
        "name": "={{ $json.file_name }}",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "GOOGLE_DRIVE_FOLDER_ID"
        },
        "binaryData": true,
        "binaryPropertyName": "image",
        "options": {}
      },
      "id": "node-drive-image",
      "name": "Google Drive - \uc774\ubbf8\uc9c0 \uc800\uc7a5",
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        1340,
        180
      ],
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict"
          },
          "conditions": [
            {
              "id": "last-scene-check",
              "leftValue": "={{ $json.scene_number }}",
              "rightValue": "={{ $json.total_scenes }}",
              "operator": {
                "type": "number",
                "operation": "equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "node-if-last",
      "name": "\ub9c8\uc9c0\ub9c9 \uc52c?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        1560,
        300
      ]
    },
    {
      "parameters": {
        "operation": "upload",
        "name": "={{ $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').first().json.date_str }}_subtitle.srt",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "GOOGLE_DRIVE_FOLDER_ID"
        },
        "binaryData": false,
        "fileContent": "={{ $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').first().json.srt_content }}",
        "options": {}
      },
      "id": "node-drive-srt",
      "name": "Google Drive - \uc790\ub9c9 \uc800\uc7a5",
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        1780,
        180
      ],
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// BGM \uc120\ud0dd \ub85c\uc9c1 - \ubd84\uc704\uae30 \ud0a4\uc6cc\ub4dc\ub85c \ub9e4\uce6d\nconst bgmMood = $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').first().json.bgm_mood;\nconst dateStr = $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').first().json.date_str;\nconst title = $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').first().json.title;\nconst concept = $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').first().json.concept;\n\n// BGM \ud480 (Drive\uc5d0 \ubbf8\ub9ac \uc800\uc7a5\ud574\ub454 \ud30c\uc77c\uba85 \ubaa9\ub85d)\n// \u26a0\ufe0f \uc18c\uc815\ub2d8\uc774 Suno\uc5d0\uc11c \ub9cc\ub4e0 BGM \ud30c\uc77c\uba85\uc73c\ub85c \uad50\uccb4\ud574\uc8fc\uc138\uc694\nconst bgmPool = {\n  lofi: 'bgm_lofi_chill.mp3',\n  \uac10\uc131: 'bgm_emotional_warm.mp3',\n  \ub530\ub73b\ud55c: 'bgm_warm_cozy.mp3',\n  \uc2e0\ub098\ub294: 'bgm_upbeat_fun.mp3',\n  \uc794\uc794\ud55c: 'bgm_calm_peaceful.mp3',\n  default: 'bgm_lofi_chill.mp3'\n};\n\n// \ud0a4\uc6cc\ub4dc \ub9e4\uce6d\nlet selectedBgm = bgmPool.default;\nfor (const [keyword, filename] of Object.entries(bgmPool)) {\n  if (bgmMood && bgmMood.includes(keyword)) {\n    selectedBgm = filename;\n    break;\n  }\n}\n\nreturn [{\n  json: {\n    date_str: dateStr,\n    title: title,\n    concept: concept,\n    bgm_mood: bgmMood,\n    selected_bgm: selectedBgm,\n    total_scenes: $('\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac').first().json.total_scenes\n  }\n}];"
      },
      "id": "node-bgm",
      "name": "BGM \ub9e4\uce6d",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1780,
        420
      ]
    },
    {
      "parameters": {
        "chatId": "YOUR_TELEGRAM_CHAT_ID",
        "text": "=\ud83e\udda6 \uc218\ub2ec\uc774 \ucf58\ud150\uce20 \uc900\ube44 \uc644\ub8cc!\n\n\ud83d\udcc5 \ub0a0\uc9dc: {{ $('BGM \ub9e4\uce6d').item.json.date_str }}\n\ud83c\udfac \uc81c\ubaa9: {{ $('BGM \ub9e4\uce6d').item.json.title }}\n\ud83d\udca1 \ucee8\uc149: {{ $('BGM \ub9e4\uce6d').item.json.concept }}\n\ud83c\udfb5 BGM \ubd84\uc704\uae30: {{ $('BGM \ub9e4\uce6d').item.json.bgm_mood }}\n\ud83c\udfb6 \uc120\ud0dd\ub41c BGM: {{ $('BGM \ub9e4\uce6d').item.json.selected_bgm }}\n\n\ud83d\udcc1 \uad6c\uae00 \ub4dc\ub77c\uc774\ube0c \ud655\uc778\n\u2192 \uc774\ubbf8\uc9c0 {{ $('BGM \ub9e4\uce6d').item.json.total_scenes }}\uc7a5 \uc800\uc7a5 \uc644\ub8cc\n\u2192 \uc790\ub9c9 \ud30c\uc77c(.srt) \uc800\uc7a5 \uc644\ub8cc\n\n\u2705 \ub2e4\uc74c \ub2e8\uacc4\n1. Drive\uc5d0\uc11c \uc774\ubbf8\uc9c0 \ud655\uc778\n2. Genspark R2V\ub85c \ud074\ub9bd \uc0dd\uc131\n3. CapCut\uc5d0\uc11c .srt \uc790\ub9c9 \uc784\ud3ec\ud2b8 \ud6c4 \ud3b8\uc9d1\n4. BGM \ucd94\uac00 \ud6c4 \uc5c5\ub85c\ub4dc",
        "additionalFields": {}
      },
      "id": "node-telegram",
      "name": "Telegram - \uc644\ub8cc \uc54c\ub9bc",
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        2000,
        300
      ],
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      }
    }
  ],
  "connections": {
    "\ub9e4\uc77c \uc624\uc804 9\uc2dc \ud2b8\ub9ac\uac70": {
      "main": [
        [
          {
            "node": "Claude - \uc2a4\ud06c\ub9bd\ud2b8 \uc0dd\uc131",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude - \uc2a4\ud06c\ub9bd\ud2b8 \uc0dd\uc131": {
      "main": [
        [
          {
            "node": "\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc2f1 + \uc52c \ubd84\ub9ac": {
      "main": [
        [
          {
            "node": "Gemini - \uc774\ubbf8\uc9c0 \uc0dd\uc131",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gemini - \uc774\ubbf8\uc9c0 \uc0dd\uc131": {
      "main": [
        [
          {
            "node": "\uc774\ubbf8\uc9c0 \ucd94\ucd9c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\uc774\ubbf8\uc9c0 \ucd94\ucd9c": {
      "main": [
        [
          {
            "node": "Google Drive - \uc774\ubbf8\uc9c0 \uc800\uc7a5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Drive - \uc774\ubbf8\uc9c0 \uc800\uc7a5": {
      "main": [
        [
          {
            "node": "\ub9c8\uc9c0\ub9c9 \uc52c?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ub9c8\uc9c0\ub9c9 \uc52c?": {
      "main": [
        [
          {
            "node": "Google Drive - \uc790\ub9c9 \uc800\uc7a5",
            "type": "main",
            "index": 0
          },
          {
            "node": "BGM \ub9e4\uce6d",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Google Drive - \uc790\ub9c9 \uc800\uc7a5": {
      "main": [
        [
          {
            "node": "Telegram - \uc644\ub8cc \uc54c\ub9bc",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "BGM \ub9e4\uce6d": {
      "main": [
        [
          {
            "node": "Telegram - \uc644\ub8cc \uc54c\ub9bc",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "staticData": null,
  "tags": [
    "\uc218\ub2ec\uc774",
    "\uc1fc\uce20\uc790\ub3d9\ud654"
  ],
  "triggerCount": 1,
  "updatedAt": "2026-05-19T00:00:00.000Z",
  "versionId": "1"
}