{
  "nodes": [
    {
      "id": "a10c960f-e25e-4bca-911d-0b7f4bbee975",
      "name": "On form submission",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        3248,
        1408
      ],
      "parameters": {
        "options": {
          "path": "7eefa8a2-fe80-46ce-b86c-acd138eb6941",
          "buttonLabel": "Generate Learning Notes",
          "appendAttribution": false
        },
        "formTitle": "YouTube to Active Learning Notes",
        "formFields": {
          "values": [
            {
              "fieldName": "URL",
              "fieldLabel": "YouTube Video URL",
              "placeholder": "input your link youtube",
              "requiredField": true
            }
          ]
        },
        "formDescription": "Transform any YouTube video into structured Active Learning study sheets powered by AI"
      },
      "typeVersion": 2.4
    },
    {
      "id": "0a27dd78-5c4d-4e3e-acb4-646889b385ba",
      "name": "Sticky Note - Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3200,
        656
      ],
      "parameters": {
        "width": 420,
        "height": 544,
        "content": "## \ud83d\ude80 Overview & Setup\n**Turn YouTube videos into Active Learning study sheets.**\n\n### \u2699\ufe0f How it works\n1.  **Input:** Submit a YouTube Link.\n2.  **Process:** The workflow fetches metadata, transcribes audio, and analyzes it using the ICAP framework.\n3.  **Output:** A structured Notion page with learning goals and practice tasks.\n\n### \ud83d\udccb Prerequisites\n* **Notion Template:** [Click here to duplicate](https://www.notion.so/YouTube-to-Notion-Active-Learning-Assistant-Beginner-2db1fc5a596381b1b5dec683689d3d1d?source=copy_link)\n* **API Keys:** RapidAPI, Google Gemini, YouTube Data API.\n\n### \u26a0\ufe0f Before Running\n1.  Paste your **RapidAPI Key** in the *HTTP - Get YouTube Audio* node.\n2.  Paste your **Database ID** in the *Function - Parse Notion JSON* node."
      },
      "typeVersion": 1
    },
    {
      "id": "4462a719-70ef-4aa0-a253-4485c48b2ebd",
      "name": "Sticky Note - Fetch",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3200,
        1216
      ],
      "parameters": {
        "color": 7,
        "width": 888,
        "height": 396,
        "content": "## \ud83d\udce5  Step 1: Get Video Data\nHere, the bot receives your YouTube Link.\n\n**What happens?**\n- It separates the Video ID from the link.\n- It fetches the Title, Channel Name, and Thumbnail image to make your Notion header look good."
      },
      "typeVersion": 1
    },
    {
      "id": "656a39f9-c80b-4167-97c1-e10f8d7d4fe1",
      "name": "Sticky Note - Audio",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4112,
        1248
      ],
      "parameters": {
        "color": 2,
        "width": 880,
        "height": 688,
        "content": "## \ud83c\udfa7 Step 2: Listen & Note-take\nSince AI cannot \"watch,\" we convert the video into text.\n\n**The Process:**\n1. **Download:** Grabs the audio file (.m4a) from YouTube via RapidAPI.\n2. **Transcribe:** Sends the audio file to **Gemini Flash**. This model is chosen because it's fast, cheap, and handles long audio well."
      },
      "typeVersion": 1
    },
    {
      "id": "e473e386-b06f-4b5f-a7f3-fb1425239056",
      "name": "Sticky Note - AI",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5024,
        1152
      ],
      "parameters": {
        "color": 2,
        "width": 676,
        "height": 672,
        "content": "## \ud83e\udd16 Step 3: \"Active Learning\" Analysis\nThis is the brain of the system. The AI acts as your **Private Tutor**, not just a summarizer.\n\n**AI Tasks (based on Instructions):**\n- Create **Micro-goals** (Specific learning targets).\n- Generate **Cornell Notes** (Critical Q&A).\n- Perform the **Feynman Test** (Explain complex concepts simply).\n- Design a **Simulation Task** for you to practice immediately."
      },
      "typeVersion": 1
    },
    {
      "id": "01ba8b94-8c62-4b81-b43e-a4ecb849d99b",
      "name": "Sticky Note - Storage",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5728,
        1152
      ],
      "parameters": {
        "color": 2,
        "width": 472,
        "height": 428,
        "content": "## \ud83d\udcbe Step 4: Build Notion Page\nThis part arranges the \"furniture\" in your Notion page to keep it tidy.\n\n**Features:**\n- Uses custom code (JavaScript) to create Checkboxes, Toggles, and Colored Boxes.\n- Sends the structured data to your Notion Database via API."
      },
      "typeVersion": 1
    },
    {
      "id": "afa15c61-be81-4a6b-ba4d-badbc6d74241",
      "name": "Sticky Note - Security",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5728,
        1600
      ],
      "parameters": {
        "color": 3,
        "width": 400,
        "height": 900,
        "content": "## \ud83d\udee0\ufe0f Checklist Before Running (Must Check!)\n\nIf the workflow fails (red error), check these 3 items first:\n\n### 0. Get the Notion Template \ud83d\udcc4\n*First, duplicate this database to your Notion workspace.*\n- [**\ud83d\udc49 Click Here to Open Template**](https://www.notion.so/YouTube-to-Notion-Active-Learning-Assistant-Beginner-2db1fc5a596381b1b5dec683689d3d1d?source=copy_link)\n- Click **Duplicate** (top-right corner) to save it.\n\n### 1. Notion Database ID \ud83d\uddc2\ufe0f\n*Ensure the ID inside the \"Function\" Node matches your new Notion Database.*\n- **How to Find:** Open your Notion database in a browser -> Check the URL.\n- **Format:** `notion.so/username/[DATABASE_ID]?v=...` (The long string between the username and the question mark).\n- **Example:** `2db1fc5a...`\n\n### 2. API Keys & Quota \ud83d\udd11\n*Ensure your keys are active and you have available quota.*\n\n* **RapidAPI (YouTube Downloader):**\n  - [Get Key Here](https://rapidapi.com/ytdlfree/api/youtube-video-fast-downloader-24-7)\n  - Check the \"My Apps\" menu in RapidAPI to view your remaining monthly quota.\n\n* **Google Gemini API:**\n  - [Create Free API Key](https://aistudio.google.com/app/apikey)\n  - Ensure your Google Cloud project has billing linked (even for the free tier).\n\n### 3. Notion Connection (Integration) \ud83d\udd0c\n*The \"HTTP Request\" Node must be connected to your Notion account.*\n- **How to Check:** Click the HTTP Request Node -> \"Credential\" Tab -> Ensure status is **\"Connected\"**.\n- **Important:** Inside Notion, click the three dots `...` at the top right of your Database page -> `Connections` -> `Connect to` -> Select your n8n integration name."
      },
      "typeVersion": 1
    },
    {
      "id": "46fd1111-9807-44ca-b81b-e1d867f5192e",
      "name": "Set - Prepare Video Metadata",
      "type": "n8n-nodes-base.set",
      "position": [
        3920,
        1408
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "field1",
              "name": "videoId",
              "type": "string",
              "value": "={{ $json.id }}"
            },
            {
              "id": "field2",
              "name": "title",
              "type": "string",
              "value": "={{ $json.snippet.title }}"
            },
            {
              "id": "field3",
              "name": "description",
              "type": "string",
              "value": "={{ $json.snippet.description }}"
            },
            {
              "id": "field4",
              "name": "publishedAt",
              "type": "string",
              "value": "={{ $json.snippet.publishedAt }}"
            },
            {
              "id": "field5",
              "name": "thumbnailUrl",
              "type": "string",
              "value": "={{ $json.snippet.thumbnails.maxres?.url || $json.snippet.thumbnails.high?.url || $json.snippet.thumbnails.default.url }}"
            },
            {
              "id": "field6",
              "name": "videoUrl",
              "type": "string",
              "value": "={{ 'https://www.youtube.com/watch?v=' + $json.id }}"
            },
            {
              "id": "field7",
              "name": "channelTitle",
              "type": "string",
              "value": "={{ $json.snippet.channelTitle }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "4bec85e9-d4dc-461c-8674-3466a9096c45",
      "name": "HTTP - Download Audio File",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        4496,
        1520
      ],
      "parameters": {
        "url": "={{ $json.file }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "f7dcab68-667c-4abf-a9f2-adca1b4bde27",
      "name": "IF - Skip if No Transcript",
      "type": "n8n-nodes-base.if",
      "position": [
        4768,
        1760
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "condition1",
              "operator": {
                "type": "string",
                "operation": "notEmpty"
              },
              "leftValue": "={{ $json.content?.parts?.[0]?.text }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "8eac35a4-8269-4b77-80cd-f876957219e1",
      "name": "Merge - Attach Metadata + Transcript",
      "type": "n8n-nodes-base.merge",
      "position": [
        5104,
        1408
      ],
      "parameters": {
        "mode": "combine",
        "options": {
          "includeUnpaired": true
        },
        "combineBy": "combineByPosition"
      },
      "retryOnFail": false,
      "typeVersion": 3,
      "alwaysOutputData": false
    },
    {
      "id": "6315aa12-cdad-43d9-a5c6-6d18b2314b88",
      "name": "HTTP - Get YouTube Audio",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        4240,
        1520
      ],
      "parameters": {
        "url": "={{ 'https://youtube-video-fast-downloader-24-7.p.rapidapi.com/download_audio/' + $json.videoId + '?quality=140' }}",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "x-rapidapi-host",
              "value": "youtube-video-fast-downloader-24-7.p.rapidapi.com"
            },
            {
              "name": "x-rapidapi-key",
              "value": "PASTE_YOUR_RAPIDAPI_KEY_HERE"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "6a2a6bc0-8c90-4e51-9a7c-7296845f03c7",
      "name": "YouTube - Fetch Video Details",
      "type": "n8n-nodes-base.youTube",
      "position": [
        3680,
        1408
      ],
      "parameters": {
        "options": {},
        "videoId": "={{ $json.VIdeoID }}",
        "resource": "video",
        "operation": "get"
      },
      "typeVersion": 1
    },
    {
      "id": "459a4568-c7cb-429e-8d52-7bdde7bffab7",
      "name": "Memory - Conversation Buffer",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        5344,
        1648
      ],
      "parameters": {
        "sessionKey": "active-learning-session",
        "sessionIdType": "customKey"
      },
      "typeVersion": 1.3
    },
    {
      "id": "91546d20-4d78-41bc-a735-2308eae843cb",
      "name": "Output Parser - Structured JSON",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        5536,
        1648
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"micro_goals\": [\n    \"Goal 1: Mampu menjelaskan konsep X...\",\n    \"Goal 2: Mampu mempraktikkan Y tanpa panduan...\"\n  ],\n  \"cornell_notes\": [\n    {\n      \"trigger\": \"Pertanyaan pemicu (Misal: Mengapa harus X?)\",\n      \"concept\": \"Penjelasan inti atau logika di baliknya...\"\n    }\n  ],\n  \"feynman_explanation\": \"Penjelasan konsep inti dengan bahasa yang sangat sederhana (untuk anak 5 tahun).\",\n  \"simulation_task\": \"Tugas konkret untuk mempraktikkan materi pada kasus/data yang berbeda (bukan menyalin contoh).\",\n  \"key_topics\": [\"Topic 1\", \"Topic 2\"]\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "ac6457de-491b-4dc2-b6d9-213d24f47ecf",
      "name": "Transcribe a recording",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "position": [
        4496,
        1760
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "id",
          "value": "models/gemini-2.5-flash"
        },
        "options": {},
        "resource": "audio",
        "inputType": "binary"
      },
      "retryOnFail": true,
      "typeVersion": 1.1,
      "waitBetweenTries": 5000
    },
    {
      "id": "fe37039f-34e4-4ae5-b392-8fed7165f7db",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        5152,
        1648
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "64b5a9a2-00a0-4b3c-b3ac-dd2d29db39fa",
      "name": "AI Agent - Active Learning",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        5312,
        1408
      ],
      "parameters": {
        "text": "=# INPUT DATA\nTitle: {{ $json.title }}\nChannel: {{ $('Set - Prepare Video Metadata').item.json.channelTitle }}\nTranscript: {{ $json.content?.parts?.[0]?.text || 'No transcript available' }}\n\n# ROLE\nYou are an Expert Learning Scientist specializing in the ICAP Framework (Interactive, Constructive, Active, Passive).\nYour goal is NOT to summarize the content. Your goal is to create an **Active Learning Worksheet** that forces the user to construct knowledge, not just consume it.\n\n# TASK\nAnalyze the transcript and generate a structured JSON output based on the Active Learning Protocol.\n\n# CRITICAL INSTRUCTIONS (Fill these specific fields):\n1. \"micro_goals\": Extract 2-3 specific, measurable learning outcomes. What should the user BE ABLE TO DO after this? (e.g., \"Build a Pivot Table from scratch\", not \"Understand Pivot Tables\").\n2. \"cornell_notes\": Extract key concepts but format them as a \"Dialogue\".\n   - \"trigger\": A critical question, a 'Why', or a keyword.\n   - \"concept\": The logic, answer, or insight (in user's own words style).\n3. \"feynman_explanation\": Explain the *single most complex concept* in the video using simple language/analogies (No jargon).\n4. \"simulation_task\": Create a specific \"Lab Challenge\". Ask the user to apply the concept to a **DIFFERENT** scenario/dataset than the one in the video.\n5. \"key_topics\": 2-3 main tags.",
        "options": {
          "systemMessage": "You are an Elite Productivity Strategist & Coach.\nYou do not just summarize; you convert information into aggressive, high-impact ACTION PLANS.\nYour goal is to \"Upgrade\" the user's life by extracting the specific \"How-To\", frameworks, and tactical steps from the content.\nAvoid generic advice. Be specific, direct, and \"no-nonsense\"."
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.1
    },
    {
      "id": "7f6762ee-5049-4f06-b13b-222c4014b6f8",
      "name": "SET - Get YT ID",
      "type": "n8n-nodes-base.set",
      "position": [
        3456,
        1408
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "8ba34655-8879-4f7a-8a29-8c6ae34f0575",
              "name": "VIdeoID",
              "type": "string",
              "value": "={{ $json.URL.match(/(?:v=|youtu.be\\/)([a-zA-Z0-9_-]{11})/)?.[1] || $json.URL }}"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "90ead700-ad81-4402-bc8e-f53a1b68dc40",
      "name": "Create Notion Page",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        6000,
        1408
      ],
      "parameters": {
        "url": "https://api.notion.com/v1/pages",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ $json }}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "headerParameters": {
          "parameters": [
            {
              "name": "Notion-Version",
              "value": "2022-06-28"
            }
          ]
        },
        "nodeCredentialType": "notionApi"
      },
      "typeVersion": 4.3
    },
    {
      "id": "fbc07f2c-96e6-4617-a0cf-8575996e9c5d",
      "name": "Set Audio MimeType",
      "type": "n8n-nodes-base.code",
      "position": [
        4240,
        1760
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\n\n// Loop semua item yang masuk\nfor (const item of items) {\n  // Cek apakah ada data binary (biasanya bernama 'data')\n  if (item.binary && item.binary.data) {\n    // Kita paksa ubah label MIME type-nya agar dikenali Gemini\n    // Karena sumber dari RapidAPI biasanya .m4a, kita pakai audio/mp4\n    item.binary.data.mimeType = 'audio/mp4';\n    item.binary.data.fileExtension = 'm4a';\n    item.binary.data.fileName = 'audio_downloaded.m4a';\n  }\n}\n\nreturn items;"
      },
      "typeVersion": 2
    },
    {
      "id": "24f07c3f-613c-456b-be64-ecbca17d9299",
      "name": "Build Page Structure",
      "type": "n8n-nodes-base.code",
      "position": [
        5792,
        1408
      ],
      "parameters": {
        "jsCode": "// 1. Ambil data\nconst rawAi = $input.item.json.output || $input.item.json;\nconst ai = typeof rawAi === 'string' ? JSON.parse(rawAi) : rawAi;\n\n// Fallback Metadata\nconst youtubeNode = $('YouTube - Fetch Video Details').first();\nconst youtubeData = youtubeNode ? youtubeNode.json : {};\nconst setNode = $('Set - Prepare Video Metadata').first();\nconst setData = setNode ? setNode.json : {};\n\nconst videoTitle = youtubeData.snippet?.title || setData.title || \"Untitled\";\nconst videoUrl = `https://www.youtube.com/watch?v=${youtubeData.id || setData.videoId}`;\nconst channelName = youtubeData.snippet?.channelTitle || setData.channelTitle || \"Unknown\";\nconst publishedAt = youtubeData.snippet?.publishedAt || setData.publishedAt || new Date().toISOString();\nconst thumbnailUrl = youtubeData.snippet?.thumbnails?.maxres?.url || youtubeData.snippet?.thumbnails?.high?.url || setData.thumbnailUrl;\n\n// 2. ID DATABASE\nconst database_id = \"PASTE_YOUR_NOTION_DATABASE_ID_HERE\";\n\n// 3. Properties Header\nconst properties = {\n  \"Name\": { \"title\": [{ \"text\": { \"content\": videoTitle.substring(0, 2000) } }] },\n  \"URL\": { \"url\": videoUrl },\n  \"Channel\": { \"select\": { \"name\": channelName.replace(/,/g, '') } },\n  \"Topics\": { \"multi_select\": (ai.key_topics || [\"Learning\"]).map(t => ({ \"name\": t })) },\n  \"Status\": { \"status\": { \"name\": \"\ud83d\udfe2 Processed\" } },\n  \"Summary\": { \"rich_text\": [{ \"text\": { \"content\": ai.feynman_explanation || \"-\" } }] },\n  \"Published Date\": { \"date\": { \"start\": publishedAt } },\n  \"Thumbnail\": { \"files\": [{ \"type\": \"external\", \"name\": \"Cover\", \"external\": { \"url\": thumbnailUrl } }] }\n};\n\n// 4. Page Content (Active Learning Structure)\nconst children = [\n  // --- Header Filosofi (FIXED ANNOTATIONS) ---\n  {\n    \"object\": \"block\",\n    \"type\": \"callout\",\n    \"callout\": {\n      \"rich_text\": [{ \n        \"text\": { \"content\": \"Active Learning Mode: Jangan cuma nonton. Konstruksi pengetahuanmu.\" },\n        \"annotations\": { \"italic\": true } // Fixed: Annotations diluar text\n      }],\n      \"icon\": { \"emoji\": \"\ud83e\udde0\" },\n      \"color\": \"gray_background\"\n    }\n  },\n\n  // --- 1. TARGET (Micro-Goals) ---\n  {\n    \"object\": \"block\",\n    \"type\": \"heading_2\",\n    \"heading_2\": { \"rich_text\": [{ \"text\": { \"content\": \"\ud83c\udfaf Preparation & Micro-Goals\" } }] }\n  },\n  ...(ai.micro_goals || []).map(goal => ({\n    \"object\": \"block\",\n    \"type\": \"to_do\",\n    \"to_do\": { \"rich_text\": [{ \"text\": { \"content\": goal } }], \"checked\": false }\n  })),\n\n  // --- 2. NOTES (Cornell Style) ---\n  {\n    \"object\": \"block\",\n    \"type\": \"heading_2\",\n    \"heading_2\": { \"rich_text\": [{ \"text\": { \"content\": \"\ud83d\udcdd Constructive Notes (Cornell)\" } }] }\n  },\n  ...(ai.cornell_notes || []).map(note => ({\n    \"object\": \"block\",\n    \"type\": \"toggle\",\n    \"toggle\": {\n      \"rich_text\": [{ \n        \"text\": { \"content\": \"\u2753 \" + (note.trigger || \"Pemicu\") }, \n        \"annotations\": { \"bold\": true } \n      }],\n      \"children\": [\n        {\n          \"object\": \"block\",\n          \"type\": \"paragraph\",\n          \"paragraph\": { \"rich_text\": [{ \"text\": { \"content\": \"\ud83d\udca1 \" + (note.concept || \"...\") } }] }\n        }\n      ]\n    }\n  })),\n\n  // --- 3. FEYNMAN TEST ---\n  {\n    \"object\": \"block\",\n    \"type\": \"heading_2\",\n    \"heading_2\": { \"rich_text\": [{ \"text\": { \"content\": \"\ud83d\udde3\ufe0f The Feynman Test\" } }] }\n  },\n  {\n    \"object\": \"block\",\n    \"type\": \"quote\",\n    \"quote\": {\n      \"rich_text\": [{ \"text\": { \"content\": ai.feynman_explanation || \"Penjelasan tidak tersedia.\" } }],\n      \"color\": \"blue_background\"\n    }\n  },\n  {\n    \"object\": \"block\",\n    \"type\": \"paragraph\",\n    \"paragraph\": { \n      \"rich_text\": [{ \n        \"text\": { \"content\": \"Apakah penjelasan di atas sudah cukup sederhana? Bagian mana yang masih macet?\" }, \n        \"annotations\": { \"italic\": true, \"color\": \"gray\" } \n      }] \n    }\n  },\n\n  // --- 4. IMMEDIATE EXECUTION (FIXED ANNOTATIONS) ---\n  {\n    \"object\": \"block\",\n    \"type\": \"heading_2\",\n    \"heading_2\": { \"rich_text\": [{ \"text\": { \"content\": \"\ud83d\udee0\ufe0f Immediate Execution (The Lab)\" } }] }\n  },\n  {\n    \"object\": \"block\",\n    \"type\": \"callout\",\n    \"callout\": {\n      \"rich_text\": [\n        { \n          \"text\": { \"content\": \"Tantangan Simulasi: \" }, \n          \"annotations\": { \"bold\": true } // Fixed: Annotations diluar text\n        },\n        { \"text\": { \"content\": ai.simulation_task || \"Coba terapkan konsep ini sekarang.\" } }\n      ],\n      \"icon\": { \"emoji\": \"\ud83e\uddea\" },\n      \"color\": \"red_background\"\n    }\n  },\n  {\n    \"object\": \"block\",\n    \"type\": \"to_do\",\n    \"to_do\": { \"rich_text\": [{ \"text\": { \"content\": \"Saya sudah mencoba tantangan di atas tanpa melihat tutorial.\" } }], \"checked\": false }\n  }\n];\n\nreturn {\n  json: {\n    parent: { database_id: database_id },\n    properties: properties,\n    children: children\n  }\n};"
      },
      "typeVersion": 2
    }
  ],
  "connections": {
    "SET - Get YT ID": {
      "main": [
        [
          {
            "node": "YouTube - Fetch Video Details",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "On form submission": {
      "main": [
        [
          {
            "node": "SET - Get YT ID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Audio MimeType": {
      "main": [
        [
          {
            "node": "Transcribe a recording",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Page Structure": {
      "main": [
        [
          {
            "node": "Create Notion Page",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Transcribe a recording": {
      "main": [
        [
          {
            "node": "IF - Skip if No Transcript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent - Active Learning",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "HTTP - Get YouTube Audio": {
      "main": [
        [
          {
            "node": "HTTP - Download Audio File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent - Active Learning": {
      "main": [
        [
          {
            "node": "Build Page Structure",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP - Download Audio File": {
      "main": [
        [
          {
            "node": "Set Audio MimeType",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF - Skip if No Transcript": {
      "main": [
        [
          {
            "node": "Merge - Attach Metadata + Transcript",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Memory - Conversation Buffer": {
      "ai_memory": [
        [
          {
            "node": "AI Agent - Active Learning",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Set - Prepare Video Metadata": {
      "main": [
        [
          {
            "node": "Merge - Attach Metadata + Transcript",
            "type": "main",
            "index": 0
          },
          {
            "node": "HTTP - Get YouTube Audio",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "YouTube - Fetch Video Details": {
      "main": [
        [
          {
            "node": "Set - Prepare Video Metadata",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Output Parser - Structured JSON": {
      "ai_outputParser": [
        [
          {
            "node": "AI Agent - Active Learning",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Merge - Attach Metadata + Transcript": {
      "main": [
        [
          {
            "node": "AI Agent - Active Learning",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}