N
n8n Store
Workflow Market
YouTube Video Summaries with GPT-4o, Slack Approvals & Reddit Posting

YouTube Video Summaries with GPT-4o, Slack Approvals & Reddit Posting

by yaron-nofluff0 views

Description

Categories

🤖 AI & Machine Learning📢 Marketing

Nodes Used

n8n-nodes-base.coden8n-nodes-base.slackn8n-nodes-base.redditn8n-nodes-base.stickyNoten8n-nodes-base.stickyNoten8n-nodes-base.stickyNoten8n-nodes-base.stickyNoten8n-nodes-base.stickyNoten8n-nodes-base.stickyNoten8n-nodes-base.stickyNote
PriceGratuit
Views0
Last Updated11/28/2025
workflow.json
{
  "meta": {
    "instanceId": "5aaf4236c70e34e423fbdb2c7b754d19253a933bb1476d548f75848a01e473cf"
  },
  "nodes": [
    {
      "id": "dc53327e-392e-44db-b633-657f1edbad9d",
      "name": "YouTube RSS Trigger",
      "type": "n8n-nodes-base.rssFeedReadTrigger",
      "position": [
        2120,
        500
      ],
      "parameters": {
        "feedUrl": "https://www.youtube.com/feeds/videos.xml?channel_id=UCf3dc-Y3k5vBTCVpPCAfG6g",
        "pollTimes": {
          "item": [
            {}
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "d0665878-6c71-4994-9e24-410d6c8dfe94",
      "name": "Extract Channel ID",
      "type": "n8n-nodes-base.code",
      "position": [
        2340,
        500
      ],
      "parameters": {
        "jsCode": "// 'items' is already defined in n8n and contains incoming data\n\nreturn items.map(item => {\n  const link = item.json.link; // e.g., \"https://www.youtube.com/watch?v=Y0DYmRnfHlc\"\n  const videoId = link.split(\"v=\")[1].split(\"&\")[0];\n  return {\n    json: {\n      videoId,\n    },\n  };\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "8b22e2ec-9710-4c61-8a4b-bf86fb10db68",
      "name": "Fetch Video Details",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2720,
        500
      ],
      "parameters": {
        "url": "https://www.googleapis.com/youtube/v3/videos",
        "options": {},
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "part",
              "value": "snippet"
            },
            {
              "name": "id",
              "value": "={{ $json.videoId }}"
            },
            {
              "name": "key",
              "value": "YOUR_API_KEY"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "d3bc260c-ec32-44ac-9cb5-22cefe3dd124",
      "name": "Summarize Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        3140,
        500
      ],
      "parameters": {
        "text": "=Title: {{ $json.items[0].snippet.title }}\nDescription: {{ $json.items[0].snippet.description }}",
        "options": {
          "systemMessage": "You are a YouTube video summarizer. If the description is not available just tell that it is not availablee. Summarize the following video description"
        },
        "promptType": "define"
      },
      "typeVersion": 1.9
    },
    {
      "id": "6ffc23a3-5a6d-4333-b2b5-5ca89d6f0003",
      "name": "OpenAI GPT Summary Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        3100,
        720
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "028dbd84-3e46-4a88-8c04-33fa4c14db73",
      "name": "Store results to Google Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        3600,
        500
      ],
      "parameters": {
        "columns": {
          "value": {
            "Title": "={{ $('Fetch Video Details').item.json.items[0].snippet.title }}",
            "Summary": "={{ $json.output }}",
            "Video URL": "={{ $('YouTube RSS Trigger').item.json.link }}",
            "Video Published Date": "={{ $('YouTube RSS Trigger').item.json.isoDate }}"
          },
          "schema": [
            {
              "id": "Title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Video URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Video URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Summary",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Summary",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Video Published Date",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Video Published Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ImEKVtyBlxVvXzWKQw4wGbp4IzT_L2EUVqVj5txqY8A/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1ImEKVtyBlxVvXzWKQw4wGbp4IzT_L2EUVqVj5txqY8A",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ImEKVtyBlxVvXzWKQw4wGbp4IzT_L2EUVqVj5txqY8A/edit?usp=drivesdk",
          "cachedResultName": "Youtube video summarizer"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "a8583d95-e8da-41e3-ac2b-1f33cdedfd71",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2060,
        20
      ],
      "parameters": {
        "color": 3,
        "width": 440,
        "height": 680,
        "content": "### 🔹 Section 1: **Trigger & Metadata Extraction**\n\n#### 1. `Trigger: New YouTube Video via RSS`\n\n* **Type**: RSS Trigger\n* **Purpose**: Listens for new videos published on a YouTube channel using its RSS feed.\n* **Output**: Latest video feed item including URL, title, and publication date.\n\n#### 2. `Function: Extract Channel ID from RSS`\n\n* **Type**: Function Node\n* **Purpose**: Parses the video URL from the RSS feed and extracts the YouTube Channel ID or Video ID.\n* **Why**: Required to fetch full video metadata using YouTube Data API in the next step.\n\n---\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "8629cc8d-9f91-4a02-a243-02255338cc02",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        220,
        -120
      ],
      "parameters": {
        "color": 4,
        "width": 1300,
        "height": 320,
        "content": "=======================================\n            WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n    [email protected]\n\nExplore more tips and tutorials here:\n   - YouTube: https://www.youtube.com/@YaronBeen/videos\n   - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"
      },
      "typeVersion": 1
    },
    {
      "id": "f423c1f0-4a5d-4c5c-a32d-e2e4818de5a8",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        220,
        220
      ],
      "parameters": {
        "color": 4,
        "width": 1289,
        "height": 2378,
        "content": "# 📺 YouTube Video Summary Workflow – Documentation\n\n## 🧩 Overview\n\nThis n8n workflow automates the process of:\n\n* Monitoring a YouTube channel for new videos via RSS\n* Extracting video metadata\n* Summarizing the video description using GPT\n* Logging the summary in a Google Sheet\n* Requesting human approval via Slack\n* Posting the approved summary to a Discord channel\n\n---\n\n## 🔗 Workflow Breakdown\n\n### 🔹 Group 1: **Trigger & Metadata Extraction**\n\n#### 1. `Trigger: New YouTube Video via RSS`\n\n* **Type**: RSS Trigger\n* **Purpose**: Listens for new videos published on a YouTube channel using its RSS feed.\n* **Output**: Latest video feed item including URL, title, and publication date.\n\n#### 2. `Function: Extract Channel ID from RSS`\n\n* **Type**: Function Node\n* **Purpose**: Parses the video URL from the RSS feed and extracts the YouTube Channel ID or Video ID.\n* **Why**: Required to fetch full video metadata using YouTube Data API in the next step.\n\n---\n\n### 🔹 Group 2: **Video Metadata Retrieval**\n\n#### 3. `HTTP Request: Fetch Video Metadata from YouTube API`\n\n* **Type**: HTTP Request Node\n* **Purpose**: Fetches detailed video data like description, title, and published date using the YouTube Data API.\n* **Key Output Fields**:\n\n  * `videoTitle`\n  * `videoDescription`\n  * `videoPublishedAt`\n  * `videoURL`\n\n---\n\n### 🔹 Group 3: **AI Summary Generation**\n\n#### 4. `Agent: Summarize Video Description (GPT)`\n\n* **Type**: OpenAI GPT Agent Node\n* **Purpose**: Uses OpenAI GPT model to generate a concise summary from the video description.\n* **Model Used**: OpenAI GPT (e.g., gpt-4 or gpt-3.5)\n* **Inputs**: Raw video description\n* **Outputs**: Clean, readable summary\n\n---\n\n### 🔹 Group 4: **Storage & Human Approval**\n\n#### 5. `Google Sheets: Append Summary Record`\n\n* **Type**: Google Sheets Node\n* **Purpose**: Logs each video’s summary to a Google Sheet.\n* **Fields Stored**:\n\n  * `Title`\n  * `Video URL`\n  * `Summary`\n  * `Video Published Date`\n\n#### 6. `Slack: Send Summary for Approval`\n\n* **Type**: Slack (sendAndWait) Node\n* **Purpose**: Sends the summary to a Slack channel for human review.\n* **Interactivity**: Waits for a response (approve or reject) from the user.\n\n---\n\n### 🔹 Group 5: **Final Publishing**\n\n#### 7. `Reddit: Post Approved Summary`\n\n* **Type**: Reddit Post Node\n* **Purpose**: Publishes the final approved summary to a specific Reddit subreddit.\n* **Condition**: Only posts if approved via Slack interaction.\n\n---\n\n## ✅ Benefits\n\n* **Automation**: Saves time by reducing manual video summarization.\n* **Human-in-the-loop**: Ensures quality control via Slack approval.\n* **Cross-platform updates**: Automatically updates both internal (Google Sheets) and external (Reddit) channels.\n\n---\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "896302ec-7449-4cb7-a318-06c80d3bec0e",
      "name": "Send Summary for Approval",
      "type": "n8n-nodes-base.slack",
      "position": [
        3780,
        500
      ],
      "webhookId": "24d232e5-aaa6-49e4-b070-479d86ed0aee",
      "parameters": {
        "select": "channel",
        "message": "=The summary of a video titled \"{{ $json.Title }}\" is given below:\n\n{{ $json.Summary }}",
        "options": {
          "appendAttribution": false
        },
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C08TTV0CC3E",
          "cachedResultName": "all-nathing"
        },
        "operation": "sendAndWait"
      },
      "typeVersion": 2.3
    },
    {
      "id": "db3482aa-eb72-45fb-951b-8f979b092e7a",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2580,
        120
      ],
      "parameters": {
        "color": 2,
        "width": 380,
        "height": 580,
        "content": "### 🔹 Section 2: **Video Metadata Retrieval**\n\n#### 3. `HTTP Request: Fetch Video Metadata from YouTube API`\n\n* **Type**: HTTP Request Node\n* **Purpose**: Fetches detailed video data like description, title, and published date using the YouTube Data API.\n* **Key Output Fields**:\n\n  * `videoTitle`\n  * `videoDescription`\n  * `videoPublishedAt`\n  * `videoURL`\n\n---\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "d7695161-f1fd-4ae2-95d7-471ce387842e",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3040,
        160
      ],
      "parameters": {
        "color": 4,
        "width": 400,
        "height": 700,
        "content": "### 🔹 Section 3: **AI Summary Generation**\n\n#### 4. `Agent: Summarize Video Description (GPT)`\n\n* **Type**: OpenAI GPT Agent Node\n* **Purpose**: Uses OpenAI GPT model to generate a concise summary from the video description.\n* **Model Used**: OpenAI GPT (e.g., gpt-4 or gpt-3.5)\n* **Inputs**: Raw video description\n* **Outputs**: Clean, readable summary\n\n---\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "36d3ed80-e31b-4154-b433-5fd2c5f37405",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3520,
        -100
      ],
      "parameters": {
        "color": 5,
        "width": 400,
        "height": 820,
        "content": "### 🔹 Section 4: **Storage & Human Approval**\n\n#### 5. `Google Sheets: Append Summary Record`\n\n* **Type**: Google Sheets Node\n* **Purpose**: Logs each video’s summary to a Google Sheet.\n* **Fields Stored**:\n\n  * `Title`\n  * `Video URL`\n  * `Summary`\n  * `Video Published Date`\n\n#### 6. `Slack: Send Summary for Approval`\n\n* **Type**: Slack (sendAndWait) Node\n* **Purpose**: Sends the summary to a Slack channel for human review.\n* **Interactivity**: Waits for a response (approve or reject) from the user.\n\n---\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "ef7f236c-0fa1-4049-889e-1eacbdef5bb2",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4000,
        220
      ],
      "parameters": {
        "color": 6,
        "width": 320,
        "height": 480,
        "content": "### 🔹 Section 5: **Final Publishing**\n\n#### 7. `Reddit: Post Approved Summary`\n\n* **Type**: Reddit Post Node\n* **Purpose**: Publishes the final approved summary to a specific Reddit subreddit.\n* **Condition**: Only posts if approved via Slack interaction.\n\n---\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "c942edf3-ed74-4fe8-970c-e9600b6912ce",
      "name": "Publish To Reddit",
      "type": "n8n-nodes-base.reddit",
      "position": [
        4100,
        500
      ],
      "parameters": {
        "text": "={{ $('Store results to Google Sheet').item.json.Summary }}",
        "title": "={{ $('Store results to Google Sheet').item.json.Title }}",
        "subreddit": "Youtube"
      },
      "typeVersion": 1
    }
  ],
  "pinData": {},
  "connections": {
    "Summarize Agent": {
      "main": [
        [
          {
            "node": "Store results to Google Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Channel ID": {
      "main": [
        [
          {
            "node": "Fetch Video Details",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Video Details": {
      "main": [
        [
          {
            "node": "Summarize Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "YouTube RSS Trigger": {
      "main": [
        [
          {
            "node": "Extract Channel ID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI GPT Summary Model": {
      "ai_languageModel": [
        [
          {
            "node": "Summarize Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Send Summary for Approval": {
      "main": [
        [
          {
            "node": "Publish To Reddit",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Store results to Google Sheet": {
      "main": [
        [
          {
            "node": "Send Summary for Approval",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

相关工作流