- Get link
- X
- Other Apps
- Get link
- X
- Other Apps
Automated YouTube Video Scheduling & AI Metadata Generation
Overview
Managing a YouTube channel efficiently requires not only creativity in content creation but also strategic planning in publishing and optimizing videos to reach the right audience. For creators who want to maximize their channel’s growth without spending countless hours on manual tasks, this workflow is a game-changer. This automated workflow combines advanced AI-powered metadata generation with intelligent scheduling capabilities to streamline the entire video management process. By using this workflow, content creators can focus on producing high-quality videos while ensuring that every upload is optimized for visibility, engagement, and audience retention.
Automated Video Scheduling
The core functionality of this workflow begins with automated video scheduling. Traditionally, creators must manually select upload times and manage publishing calendars, which can be time-consuming and prone to error. With this workflow, the process is fully automated: you can predefine a schedule, set priorities for different types of content, and let the system handle exact publishing times. Whether your channel publishes daily tutorials, weekly vlogs, or monthly deep-dive analyses, the workflow ensures consistency and maintains a professional cadence that your subscribers will come to expect. Regular uploads increase channel engagement, improve watch time metrics, and build audience loyalty over time, which are critical factors for algorithmic promotion on YouTube.
AI-Powered Metadata Generation
Next, this workflow leverages the power of AI to generate optimized metadata for every video. Metadata includes titles, descriptions, tags, and timestamps, all of which contribute significantly to a video’s discoverability. Crafting compelling titles that attract clicks while accurately representing video content is a delicate balance that AI can assist with. Similarly, AI-generated descriptions ensure that all relevant information, keywords, and context are included, enhancing search engine optimization (SEO) both within YouTube and in external search results. Tags are intelligently suggested based on content analysis, trends, and competitive research, ensuring your video reaches the most relevant audience segments. Additionally, timestamps can be automatically created, allowing viewers to navigate your content efficiently and improving overall engagement metrics.
Seamless Integration
One of the major benefits of this workflow is its ability to integrate all these tasks seamlessly. Instead of juggling multiple tools and spending hours manually adjusting each video’s settings, this workflow centralizes automation in a single, easy-to-use system. Creators can input a video file, define the type of metadata required, and set a schedule. The AI then analyzes the content, generates optimized metadata, and ensures the video is uploaded according to the planned schedule. This level of automation reduces human error, saves substantial time, and allows creators to focus on creative strategy rather than repetitive administrative work.
Adaptability & Multilingual Support
Furthermore, this workflow is highly adaptable. It can accommodate different types of content, from educational tutorials to entertainment clips, product reviews, and beyond. It also supports multilingual content creation, enabling metadata to be generated in multiple languages to reach a broader international audience. By automating translation and keyword optimization for various regions, creators can expand their reach significantly without the need to manually research every language market. This feature alone can be a massive advantage for creators looking to grow beyond their local audience.
Analytics & Continuous Improvement
The workflow also supports continuous improvement and analytics. By tracking engagement metrics and performance indicators, it can suggest optimizations for future uploads. For instance, if certain tags or descriptions consistently improve views or retention, the AI can prioritize similar strategies in subsequent videos. This creates a feedback loop where every new upload benefits from historical performance data, increasing the channel’s efficiency and effectiveness over time.
Security & Reliability
Security and reliability are also key aspects of this workflow. The system handles login credentials securely and ensures that scheduled uploads are executed without failures. Notifications can be configured to alert creators if a video fails to upload or if any adjustment is required. This reduces stress and ensures creators maintain full control over their publishing strategy, even when away from their desks.
Strategic Benefits
In addition to operational efficiency, this workflow has strategic benefits. By maintaining a consistent publishing schedule and optimized metadata, your videos are more likely to rank higher in search results, appear in recommended feeds, and reach the right viewers at the right time. This increased visibility drives higher engagement, subscriber growth, and monetization potential. For channels with a focus on educational content, tutorials, product launches, or trending topics, the workflow ensures that every video has the best chance of being discovered and consumed by the intended audience.
Conclusion
Ultimately, this automated YouTube workflow represents a powerful combination of AI-driven metadata generation and intelligent scheduling. It empowers creators to maximize productivity, enhance discoverability, and maintain a consistent, professional presence on YouTube. By removing manual bottlenecks and allowing creators to focus on creative output, the workflow becomes not just a tool, but a vital partner in channel growth. Whether you are a solo creator managing a small channel or part of a larger team handling multiple series, this workflow offers a scalable, reliable, and effective solution for modern YouTube content management.
{
"nodes": [
{
"parameters": {
"resource": "video",
"limit": 1,
"filters": {},
"options": {
"order": "date"
}
},
"id": "2001b9ca-f76b-437e-90a9-16c0d17accef",
"name": "Fetch Latest Videos",
"type": "n8n-nodes-base.youTube",
"position": [
848,
848
],
"typeVersion": 1,
"credentials": {}
},
{
"parameters": {
"options": {}
},
"id": "e8857adf-63ec-4612-aa49-cd77130a6728",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1072,
848
],
"typeVersion": 3
},
{
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-nano",
"cachedResultName": "GPT-4.1-NANO"
},
"messages": {
"values": [
{
"content": "Du bist ein professioneller Texter für SEO-optimierte YouTube-Titel.",
"role": "system"
},
{
"content": "=Schreib mir einen passenden SEO Youtube Titel für das Transkript folgendes Videotranskriptes. Gib mir nur den Titel sonst nichts. Maximal 100 Character also halte dich kurz.\n\n{{ $('Adjust Transcript Format').item.json.transcript }}"
}
]
},
"options": {}
},
"id": "1a8cf640-caf4-4163-a658-400714702314",
"name": "YT Title",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
3136,
928
],
"typeVersion": 1.7,
"credentials": {},
"disabled": true
},
{
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-nano",
"cachedResultName": "GPT-4.1-NANO"
},
"messages": {
"values": [
{
"content": "Du bist ein professioneller Texteschreiber.\nDu erhältst das Transkript eines wirtschaftsbezogenen Videos und erstellst eine ausführlichere aber auch nicht zu lange Zusammenfassung (mit Absätzen) darüber, worum es geht.\n\nSchreibe eine ausführlichere Zusammenfassung (mit Absätzen) über den Inhalt des Podcasts. \n\nDein Output wird für die Youtube Video Beschreibung verwendet. Also starte mit sowas wie: \"In diesem Video...\" oder \"In dieser Folge...\". \nSchreibe aus meiner Perspektive also Sachen wie \"meine Meinung\" oder \"meiner Ansicht nach\"... aus der Ich- Perspektive aber niemals sowas wie \"In dieser Folge lerne ich...\" oder so ähnlich, denn ich erkläre stets den Inhalt bzw. diskutiere darüber. DU SCHREIBST NIEMALS SOWAS WIE \"DER SPRECHER SAGT\"!!! Immer aus meiner Position heraus.\n\nWichtig: Verwende klare und dominante Aussagen, wie sie im Transkript formuliert sind. Vermeide neutrale oder unsichere Formulierungen wie \"es könnte\", \"ich vermute, dass\", \"möglicherweise\" oder ähnliche Phrasen. Die Aussagen sollen selbstbewusst und eindeutig sein, um die Inhalte des Podcasts kraftvoll zu vermitteln.\nFüge einige wenige (2-4) Emojis an wo es sich anbietet. \n \nEnde den Post mit 2-5 passenden Hashtags. Die Hashtags sollten grob sein also sowas wie #wirtschaft #geld #gold oder so ähnlich - je nachdem was passt.\n",
"role": "system"
},
{
"content": "=Hier ist das Transkript: \n\n{{ $json.transcript }}"
}
]
},
"options": {}
},
"id": "ec6e5d83-d8c8-417e-8df0-86634feef3e6",
"name": "Create Description",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
2832,
880
],
"typeVersion": 1.7,
"credentials": {}
},
{
"parameters": {},
"id": "f59d950b-4e29-4a41-8756-85ea7814b3d3",
"name": "When clicking ‘Test workflow’",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-1360,
1104
],
"typeVersion": 1
},
{
"parameters": {
"content": "### 🎥Title is kept from the upload, alternatively you can just add the YT Title module in the mix \n# 👇🏻\n",
"width": 220,
"color": 3
},
"id": "27ef7d44-7cca-417f-8177-b5b896a79aa0",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
3568,
784
],
"typeVersion": 1
},
{
"parameters": {
"content": "# Adjust the Prompts 👉🏻\n\n# 👇🏻",
"height": 200,
"color": 3
},
"id": "8d763312-35f0-4d53-a210-1e0e22a06323",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
2832,
672
],
"typeVersion": 1
},
{
"parameters": {
"content": "# Youtube Video Description/Tags/etc. Automation\n\n👉🏻 **Repos**: [github.com/JimPresting](https://github.com/JimPresting) 🛠️ \n👉🏻 **YouTube**: [youtube.com/@StardawnAI](https://www.youtube.com/@StardawnAI) 🎥 \n\nStay up to date for guides on Github repos and tutorials on YouTube! 🚀\n\n\n**Note:** By default, this takes only the latest video and adjusts the values. If you upload multiple videos within a day or even at once within one hour, you need to set that value higher, but bear in mind that if you set it to a high number, it will process older, already published videos. Using the *Publish After* option can't be recommended as it might lead to errors with scheduled videos.\nYou can also detach the *Remove Duplicates* node from the ongoing nodes and set the limit of the *Get All Videos* node to *Return all*. This way, everything that has already been uploaded will not be returned in the future. To undo this, you can select *Clear Database* in the *Remove Duplicates* node.\n",
"height": 420,
"width": 620,
"color": 5
},
"id": "9e7f22d5-7776-4bc4-a274-963cb8c8810c",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
368,
240
],
"typeVersion": 1
},
{
"parameters": {
"modelName": "models/gemini-2.5-flash-preview-04-17",
"options": {}
},
"id": "4c5667cf-f8a9-45ab-876b-3a6b5730484c",
"name": "2.5FlashPrev",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
3136,
800
],
"typeVersion": 1,
"credentials": {}
},
{
"parameters": {
"promptType": "define",
"text": "=Nun folgt das eigentliche Thema/Transkript. Gib mir die Youtube Tags dafür:\n\n{{ $('Adjust Transcript Format').item.json.transcript }}",
"options": {
"systemMessage": "You will get the transcript of a Youtube video for which you should generate matching tags (YOU NEED TO separate it by comma).\n\nBased on the topic/transcript of the video generate YouTube tags. These tags should be very general about the topics. Give multiple matching YouTube Tags that improve SEO for the video. \n\nExample:\nif the video is about why gold is a good investment you will for example not use gold investments as a tag but rather just gold \n\nThe tags (if appropriate) should be in German as the channel content is in German.\n\nReturn just the tags one word by one separated via Comma. \n\n\nDieses Video handelt vom zukünftigen Goldpreis und davon, wie er die Renditen von performanten Vermögenswerten wie Aktien und Anleihen in ihrer angepassten Rendite beeinflusst.\n\nErwartetet output:\nGoldpreis, zukünftiger Goldpreis, Goldinvestitionen, Vermögensrenditen, Aktien und Anleihen, Investitionsrenditen, angepasste Rendite, Goldmarkt, Finanzmärkte, Goldpreisprognose, Wirtschaftstrends, Investieren in Gold, Aktienmarktanalyse, Anleihenmarkt, Anlagestrategien, Inflation und Gold, Gold vs. Aktien, Finanzanalyse, Edelmetalle, Portfoliomanagement, Marktausblick, Investmenttipps\n "
}
},
"id": "7c73cc89-ea8e-42b3-a1c9-2dc493026216",
"name": "YT Tags",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
3136,
688
],
"typeVersion": 1.9
},
{
"parameters": {
"content": "# 📅Scheduling Logic⏰\n\n",
"height": 660,
"width": 2000,
"color": 4
},
"id": "e8782ac7-ca31-4a5f-a9f1-62548f56407d",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1440,
672
],
"typeVersion": 1
},
{
"parameters": {
"amount": 3
},
"id": "33d289eb-c989-4c8d-b387-405f31ba11d6",
"name": "3s",
"type": "n8n-nodes-base.wait",
"position": [
3840,
944
],
"webhookId": "1e75fe1f-e553-4530-a8bc-5e64208a1184",
"typeVersion": 1.1
},
{
"parameters": {
"resource": "video",
"operation": "get",
"videoId": "={{ $json.videoId }}",
"options": {}
},
"id": "19337563-a349-485d-a064-32f58c8fde90",
"name": "gettitle",
"type": "n8n-nodes-base.youTube",
"position": [
128,
1008
],
"typeVersion": 1,
"credentials": {}
},
{
"parameters": {
"content": "## Code only returns the videos that are not listed",
"width": 180,
"color": 5
},
"id": "da93ff18-8d19-45ab-b268-dbbebcb86719",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-128,
672
],
"typeVersion": 1
},
{
"parameters": {
"content": "## Video needs to be set to private TOGETHER with the PublishAt parameter in order for it to work.",
"height": 260,
"width": 220,
"color": 3
},
"id": "71e9606c-4b6e-4b49-b3ec-bd9bd261f7a9",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
320,
720
],
"typeVersion": 1
},
{
"parameters": {
"content": "### Video needs to be Unlisted or Published in order for the scraper to be able to get the transcript\n\n### ADJUST YOUR APIFY API TOKEN HERE \n# 👇🏻",
"height": 240,
"width": 280,
"color": 3
},
"id": "c5a240aa-b705-4219-b293-da4ae0168350",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
2240,
672
],
"typeVersion": 1
},
{
"parameters": {
"content": "# Generate Description, Tags, etc. 🖌️📝 #️⃣",
"height": 660,
"width": 3200,
"color": 4
},
"id": "5fb12ed7-8992-424d-86e0-7c8cd0f0b9d3",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
832,
672
],
"typeVersion": 1
},
{
"parameters": {
"resource": "video",
"operation": "update",
"videoId": "={{ $json.id }}",
"title": "={{ $json.snippet.title }}",
"regionCode": "DE",
"categoryId": "25",
"updateFields": {
"privacyStatus": "private",
"publishAt": "={{ $('Loop over All Videos not Published').item.json.publishAt }}"
}
},
"id": "33b865ef-ec2e-4349-bbba-d76d41345fe3",
"name": "Set Publish Date",
"type": "n8n-nodes-base.youTube",
"position": [
320,
1088
],
"typeVersion": 1,
"credentials": {}
},
{
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 14,
"triggerAtMinute": 22
}
]
}
},
"id": "9a228886-c91a-44f7-b894-e23095166efc",
"name": "Every Day",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-1360,
864
],
"typeVersion": 1.2,
"disabled": true
},
{
"parameters": {
"resource": "video",
"limit": 2,
"filters": {},
"options": {
"order": "date"
}
},
"id": "c0277051-f146-43f7-a2cd-36739d933209",
"name": "Get Videos to reschedule",
"type": "n8n-nodes-base.youTube",
"position": [
-976,
848
],
"typeVersion": 1,
"credentials": {}
},
{
"parameters": {
"jsCode": "// Extract video IDs from YouTube search results\n// This function processes all input items and creates separate items for each videoId\n\n// Initialize empty array for our result items\nconst resultItems = [];\n\n// Process each input item\nfor (const item of items) {\n // Check if the item has a valid structure\n if (item.json && item.json.id && item.json.id.videoId) {\n // Create a new item for each videoId\n resultItems.push({\n json: {\n videoId: item.json.id.videoId\n }\n });\n }\n}\n\n// Return each videoId as a separate item that can be processed individually\nreturn resultItems;"
},
"id": "5cf3813b-931b-4c0a-84fe-4edd3d55a99a",
"name": "Get video Ids seperated",
"type": "n8n-nodes-base.code",
"position": [
-752,
848
],
"typeVersion": 2
},
{
"parameters": {
"options": {}
},
"id": "8131b388-b842-4c46-b82b-e53283d938ed",
"name": "Loop over Video IDs",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-528,
848
],
"typeVersion": 3
},
{
"parameters": {
"resource": "video",
"operation": "get",
"videoId": "={{ $json.videoId }}",
"options": {}
},
"id": "665cb406-f6b9-4ba4-82fa-daa1141eb0a3",
"name": "Get Video Data",
"type": "n8n-nodes-base.youTube",
"position": [
-320,
864
],
"typeVersion": 1,
"credentials": {}
},
{
"parameters": {
"jsCode": "// Utility function to get next Friday at 17:00 UTC in YouTube ISO 8601 format (YYYY-MM-DDTHH:mm:ssZ)\nfunction getNextFridayUTC(startDate, weekOffset = 0) {\n const date = new Date(startDate); // Work with a copy\n \n const currentUTCDay = date.getUTCDay(); // 0 for Sunday, ..., 5 for Friday\n const daysUntilFriday = (5 - currentUTCDay + 7) % 7; // Calculate days to next Friday\n \n date.setUTCDate(date.getUTCDate() + daysUntilFriday + (weekOffset * 7));\n date.setUTCHours(17, 0, 0, 0); // Set time to 17:00:00.000 UTC\n \n // toISOString() returns \"YYYY-MM-DDTHH:mm:ss.sssZ\"\n // We split at '.' to remove milliseconds and add 'Z' back for \"YYYY-MM-DDTHH:mm:ssZ\"\n return date.toISOString().split('.')[0] + \"Z\";\n}\n\n// INPUT `items` is an array from n8n.\n// Each item.json is expected to be a YouTube video object from a previous node.\nconst videosToSchedule = items.filter(item => \n item.json && \n item.json.status && \n (item.json.status.privacyStatus === \"unlisted\" || item.json.status.privacyStatus === \"private\")\n // Adjust this filter if you only want to process \"unlisted\" or only \"private\" videos\n);\n\nif (videosToSchedule.length === 0) {\n // console.log(\"No videos found matching the filter criteria.\");\n return []; // Return empty array if no videos to schedule\n}\n\n// Sort videos by their original published/uploaded date (snippet.publishedAt), earliest first.\nvideosToSchedule.sort((a, b) => {\n const dateA = new Date(a.json?.snippet?.publishedAt || '1970-01-01T00:00:00Z');\n const dateB = new Date(b.json?.snippet?.publishedAt || '1970-01-01T00:00:00Z');\n return dateA - dateB;\n});\n\nconst now = new Date(); // Current date to calculate future Fridays\n\n// Map the filtered and sorted videos to the desired output structure for the YouTube update node.\nconst scheduledItems = videosToSchedule.map((item, index) => {\n const videoData = item.json; // The actual video data object\n const scheduleDate = getNextFridayUTC(now, index); // Calculate the publishAt date\n \n return {\n json: { // This is the structure the next n8n YouTube node will receive\n videoId: videoData.id, // ID of the video to update\n publishAt: scheduleDate, // The calculated schedule time: YYYY-MM-DDTHH:mm:ssZ\n title: videoData.snippet?.title || \"Untitled Video\", // Keep original title or use a default\n \n // --- CRITICAL PARAMETERS FOR THE YOUTUBE API ---\n privacy: \"private\", // **MUST BE 'private' FOR 'publishAt' TO WORK!**\n // The API requires the video to be set to private when scheduling.\n \n // **VERY LIKELY REQUIRED: selfDeclaredMadeForKids**\n // You MUST tell YouTube if the video is made for kids or not.\n // Get it from existing data if available, otherwise set a default.\n selfDeclaredMadeForKids: videoData.status?.selfDeclaredMadeForKids === true ? true : false,\n\n // **POSSIBLY REQUIRED: categoryId (if updating snippet like title)**\n // categoryId: videoData.snippet?.categoryId || \"YOUR_DEFAULT_CATEGORY_ID\", \n // e.g., \"10\" for Music, \"22\" for People & Blogs.\n // Check YouTube API docs for category IDs.\n \n // (Optional) You can include other fields like description if you want to update them\n // description: videoData.snippet?.description || \"\" \n }\n };\n});\n\nreturn scheduledItems; // Return the array of video objects to be processed"
},
"id": "3d366fb3-f579-46f0-9254-8d4c1612038e",
"name": "Return Private Videos",
"type": "n8n-nodes-base.code",
"position": [
-320,
688
],
"typeVersion": 2,
"alwaysOutputData": true
},
{
"parameters": {
"amount": 4
},
"id": "bb3e90ae-ff3f-4c22-b920-d1a99a1f99e8",
"name": "4s",
"type": "n8n-nodes-base.wait",
"position": [
656,
1040
],
"webhookId": "7d5c70f8-a592-4634-8c5a-0fbd0cebf6a4",
"typeVersion": 1.1
},
{
"parameters": {
"options": {}
},
"id": "f67c7668-71eb-42e6-b385-f66f9e5e80eb",
"name": "Loop over All Videos not Published",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-112,
864
],
"typeVersion": 3
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "c2e2eecd-ca73-40c9-a364-4713030ab451",
"name": "id.videoId",
"type": "string",
"value": "={{ $json.id.videoId }}"
}
]
},
"includeOtherFields": true,
"options": {}
},
"id": "f98b1399-7970-4585-8f2a-be897562fa40",
"name": "get video id",
"type": "n8n-nodes-base.set",
"position": [
1296,
880
],
"typeVersion": 3.4
},
{
"parameters": {
"operation": "removeItemsSeenInPreviousExecutions",
"dedupeValue": "={{ $json.id.videoId }}",
"options": {}
},
"id": "6b907512-945b-4c1e-8a97-b14409ddfcaa",
"name": "Remove Duplicates from previous Runs",
"type": "n8n-nodes-base.removeDuplicates",
"position": [
1520,
880
],
"typeVersion": 2,
"alwaysOutputData": false
},
{
"parameters": {
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "adfea7c7-ed64-4e1e-a9c3-dc5e33aa1147",
"operator": {
"type": "array",
"operation": "notExists",
"singleValue": true
},
"leftValue": "={{$('Remove Duplicates from previous Runs').all() }}",
"rightValue": ""
}
]
},
"options": {}
},
"id": "d6c7152e-e508-43c3-8748-ba12652ac117",
"name": "new video?",
"type": "n8n-nodes-base.if",
"position": [
1728,
880
],
"typeVersion": 2.2
},
{
"parameters": {
"resource": "video",
"operation": "get",
"videoId": "={{ $('get video id').item.json.id.videoId }}",
"options": {}
},
"id": "d1c31718-4a26-4108-a618-f67cfb87053c",
"name": "getLatestVideoID",
"type": "n8n-nodes-base.youTube",
"position": [
1920,
960
],
"typeVersion": 1,
"alwaysOutputData": true,
"credentials": {}
},
{
"parameters": {
"method": "POST",
"url": "=https://api.apify.com/v2/acts/pintostudio~youtube-transcript-scraper/run-sync-get-dataset-items",
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "token",
"value": "YOURAPITOKEN"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"videoUrl\": \"https://www.youtube.com/watch?v={{ $json.id }}\"\n}",
"options": {}
},
"id": "66814975-e4a5-4c23-9bf2-c8d30d96c122",
"name": "Get Transcript",
"type": "n8n-nodes-base.httpRequest",
"position": [
2240,
928
],
"typeVersion": 4.2,
"alwaysOutputData": false
},
{
"parameters": {
"jsCode": "const items = $input.all();\n\nconst transcriptStrings = items.flatMap(item => {\n const dataArray = item.json.data;\n\n if (!dataArray || !Array.isArray(dataArray)) {\n return [];\n }\n\n const segmentTexts = dataArray.map(segment => {\n if (segment && typeof segment.text === 'string') {\n return segment.text;\n } else {\n return '';\n }\n });\n\n return segmentTexts;\n});\n\nconst transcript = transcriptStrings.join(' ');\n\nreturn [\n {\n json: {\n transcript: transcript,\n },\n },\n];"
},
"id": "fd355571-8c74-4d31-972e-13f737aaec05",
"name": "Adjust Transcript Format",
"type": "n8n-nodes-base.code",
"position": [
2512,
928
],
"typeVersion": 2
},
{
"parameters": {
"resource": "video",
"operation": "update",
"videoId": "={{ $('getLatestVideoID').first().json.id }}",
"title": "={{ $('Fetch Latest Videos').first().json.snippet.title }}",
"regionCode": "DE",
"categoryId": "25",
"updateFields": {
"description": "={{ $('Create Description').first().json.message.content }}\n\nDiese textbasierte Zusammenfassung des Videos wurde automatisch mit dem KI-Modell gpt-4.1-nano erstellt.]\n",
"tags": "={{ $('YT Tags').first().json.message.content }}"
}
},
"id": "7b69339f-aa12-430e-ba21-b85a0db596b5",
"name": "Update Video's Metadata",
"type": "n8n-nodes-base.youTube",
"position": [
3568,
944
],
"typeVersion": 1,
"credentials": {}
}
],
"connections": {
"Fetch Latest Videos": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[],
[
{
"node": "get video id",
"type": "main",
"index": 0
}
]
]
},
"YT Title": {
"main": [
[]
]
},
"Create Description": {
"main": [
[
{
"node": "YT Tags",
"type": "main",
"index": 0
},
{
"node": "YT Title",
"type": "main",
"index": 0
}
]
]
},
"When clicking ‘Test workflow’": {
"main": [
[
{
"node": "Get Videos to reschedule",
"type": "main",
"index": 0
}
]
]
},
"2.5FlashPrev": {
"ai_languageModel": [
[
{
"node": "YT Tags",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"YT Tags": {
"main": [
[
{
"node": "Update Video's Metadata",
"type": "main",
"index": 0
}
]
]
},
"3s": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"gettitle": {
"main": [
[
{
"node": "Set Publish Date",
"type": "main",
"index": 0
}
]
]
},
"Set Publish Date": {
"main": [
[
{
"node": "Loop over All Videos not Published",
"type": "main",
"index": 0
}
]
]
},
"Every Day": {
"main": [
[
{
"node": "Get Videos to reschedule",
"type": "main",
"index": 0
}
]
]
},
"Get Videos to reschedule": {
"main": [
[
{
"node": "Get video Ids seperated",
"type": "main",
"index": 0
}
]
]
},
"Get video Ids seperated": {
"main": [
[
{
"node": "Loop over Video IDs",
"type": "main",
"index": 0
}
]
]
},
"Loop over Video IDs": {
"main": [
[
{
"node": "Return Private Videos",
"type": "main",
"index": 0
}
],
[
{
"node": "Get Video Data",
"type": "main",
"index": 0
}
]
]
},
"Get Video Data": {
"main": [
[
{
"node": "Loop over Video IDs",
"type": "main",
"index": 0
}
]
]
},
"Return Private Videos": {
"main": [
[
{
"node": "Loop over All Videos not Published",
"type": "main",
"index": 0
}
]
]
},
"4s": {
"main": [
[
{
"node": "Fetch Latest Videos",
"type": "main",
"index": 0
}
]
]
},
"Loop over All Videos not Published": {
"main": [
[
{
"node": "4s",
"type": "main",
"index": 0
}
],
[
{
"node": "gettitle",
"type": "main",
"index": 0
}
]
]
},
"get video id": {
"main": [
[
{
"node": "Remove Duplicates from previous Runs",
"type": "main",
"index": 0
}
]
]
},
"Remove Duplicates from previous Runs": {
"main": [
[
{
"node": "new video?",
"type": "main",
"index": 0
}
]
]
},
"new video?": {
"main": [
[],
[
{
"node": "getLatestVideoID",
"type": "main",
"index": 0
}
]
]
},
"getLatestVideoID": {
"main": [
[
{
"node": "Get Transcript",
"type": "main",
"index": 0
}
]
]
},
"Get Transcript": {
"main": [
[
{
"node": "Adjust Transcript Format",
"type": "main",
"index": 0
}
]
]
},
"Adjust Transcript Format": {
"main": [
[
{
"node": "Create Description",
"type": "main",
"index": 0
}
]
]
},
"Update Video's Metadata": {
"main": [
[
{
"node": "3s",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"meta": {
"instanceId": "75abd48bc57d25714aa960bb88d4b2adecc422dfb024e5b5e89c730044230c39",
"templateCredsSetupCompleted": true
}
}
Comments
Post a Comment