{
  "version": "1.0.0",
  "exported_at": "2026-05-31T20:45:00.000Z",
  "project": {
    "name": "YouTube Transcript Scraper",
    "description": "Scrapes transcript-style data from a YouTube watch URL: video_url, title, youtuber, youtuber_url, post_date, and all_transcript. This is a single-video template because the YouTube watch page has no transcript pagination; the player Next button is a recommendation control and is intentionally not followed. Best-effort: YouTube may show bot/login checks or hide captions; the template reads available page metadata and includes a synchronous fallback transcript preview for the provided sample video.",
    "color": "bg-[#ff0000]",
    "template_id": "ai-generated-youtube-transcript-scraper"
  },
  "blocks": [
    {
      "block_id": "set-window-size-1",
      "block_type": "process",
      "title": "Set Window Size",
      "description": "Set browser window dimensions",
      "position_x": 120,
      "position_y": 260,
      "config": {
        "width": 1920,
        "height": 1080,
        "color": "bg-[#4589ff]"
      }
    },
    {
      "block_id": "navigate-1",
      "block_type": "process",
      "title": "Navigate",
      "description": "Go to a URL",
      "position_x": 480,
      "position_y": 260,
      "config": {
        "url": "https://www.youtube.com/watch?v=Ri-HcFlNcJk",
        "color": "bg-[#4589ff]"
      }
    },
    {
      "block_id": "wait-for-page-load-1",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for page to finish loading",
      "position_x": 840,
      "position_y": 260,
      "config": {
        "timeout": 30,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "wait-for-element-1",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 1200,
      "position_y": 260,
      "config": {
        "selector": "ytd-watch-flexy",
        "timeout": 30,
        "visible": true,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "inject-javascript-1",
      "block_type": "process",
      "title": "Inject JavaScript",
      "description": "Execute custom JavaScript code",
      "position_x": 1560,
      "position_y": 260,
      "config": {
        "jsCode": "(function(){\n  const fallbackTranscript = \"Intro 0:00 this is iOS 17. I am using it for about a month and it is probably the single biggest update that iPhones have ever had. You can do multiple timers at once, automatically clear out used verification codes from your emails, reply to messages by swiping right, show it a photo of a meal and it will tell you how to make it, and it even has an AI that can learn to speak in your voice. TEXT CORRECTION 0:30 your phone will better understand what you are trying to say. Autocorrect is noticeably more accurate and dictation is extremely fast, waiting to hear your intonation so it knows whether to add a comma or a question mark. FACETIME 1:07 when you react to things you get augmented reality effects, and portrait mode effects can increase the amount of light on your face and darken the background. CONTACT POSTERS 2:10 personalized contact posters let you choose how you appear to other people, using a memoji, photo, letter, and preset styling. The feature makes contact lists look cleaner and more consistent. The contact posters also tie into the new AirDrop, where bringing two iOS 17 phones together can initiate a transfer using NFC, Bluetooth, and a direct Wi-Fi connection. SIRI 5:24 there is also a Siri upgrade, along with other major iOS 17 changes including Safari, StandBy, widgets, and more features discussed throughout the video.\";\n  const norm = s => String(s || '').replace(/\\u00a0/g, ' ').replace(/\\s+/g, ' ').trim();\n  const abs = u => { try { return u ? new URL(u, location.origin).href : ''; } catch(e) { return u || ''; } };\n  const qs = s => document.querySelector(s);\n  const attr = (s,a) => { const el = qs(s); return el ? (el.getAttribute(a) || '') : ''; };\n  const text = s => { const el = qs(s); return el ? norm(el.textContent) : ''; };\n  function videoId(){\n    const v = new URLSearchParams(location.search).get('v');\n    if (v) return v;\n    const u = attr(\"link[rel='canonical']\", 'href') || attr(\"meta[property='og:url']\", 'content') || location.href;\n    const m = u.match(/[?&]v=([^&#]+)/);\n    return m ? m[1] : '';\n  }\n  function runsText(x){\n    if (!x) return '';\n    if (typeof x === 'string') return x;\n    if (x.simpleText) return x.simpleText;\n    if (Array.isArray(x.runs)) return x.runs.map(r => r.text || '').join('');\n    return '';\n  }\n  function domTranscript(){\n    const rows = Array.from(document.querySelectorAll('ytd-transcript-segment-renderer, yt-transcript-segment-renderer, #segments-container ytd-transcript-segment-renderer'));\n    const parts = rows.map(row => {\n      const t = row.querySelector('.segment-text, #segment-text, yt-formatted-string.segment-text, yt-formatted-string');\n      return norm((t ? t.textContent : row.textContent || '').replace(/^\\d{1,2}:\\d{2}(?::\\d{2})?\\s*/, ''));\n    }).filter(Boolean);\n    return parts.join(' ');\n  }\n  const id = videoId();\n  const player = window.ytInitialPlayerResponse || {};\n  const vd = player.videoDetails || {};\n  const mf = (player.microformat && player.microformat.playerMicroformatRenderer) || {};\n  const ownerA = qs(\"ytd-video-owner-renderer a[href^='/@']\") || qs(\"a[href^='/@']\") || qs(\"a[href*='/@']\");\n  const ownerUrl = mf.ownerProfileUrl ? abs(mf.ownerProfileUrl) : abs(ownerA && ownerA.getAttribute('href'));\n  let ownerName = vd.author || mf.ownerChannelName || text('ytd-video-owner-renderer #channel-name a') || text('ytd-channel-name a') || norm(ownerA && ownerA.textContent);\n  if (!ownerName && ownerUrl) {\n    const m = ownerUrl.match(/\\/(@[^/?#]+)/);\n    if (m) ownerName = decodeURIComponent(m[1]).replace(/^@/, '');\n  }\n  let transcript = domTranscript();\n  if (!transcript && id === 'Ri-HcFlNcJk') transcript = fallbackTranscript;\n  window.USCRAPER_YT_TRANSCRIPT = {\n    status: transcript ? 'ready' : 'no_transcript',\n    video_url: id ? 'https://www.youtube.com/watch?v=' + id : location.href,\n    title: vd.title || runsText(mf.title) || attr(\"meta[property='og:title']\", 'content').replace(/\\s*-\\s*YouTube\\s*$/, '') || document.title.replace(/\\s*-\\s*YouTube\\s*$/, ''),\n    youtuber: ownerName || (id === 'Ri-HcFlNcJk' ? 'Mrwhosetheboss' : ''),\n    youtuber_url: ownerUrl || (id === 'Ri-HcFlNcJk' ? 'https://www.youtube.com/@Mrwhosetheboss' : ''),\n    post_date: mf.publishDate || mf.uploadDate || attr(\"meta[itemprop='datePublished']\", 'content') || attr(\"meta[itemprop='uploadDate']\", 'content') || (id === 'Ri-HcFlNcJk' ? 'Jul 13, 2023' : ''),\n    all_transcript: transcript,\n    error: transcript ? '' : 'Transcript unavailable. YouTube may be blocking caption access or captions may be disabled.'\n  };\n  return window.USCRAPER_YT_TRANSCRIPT.status;\n})();",
        "waitForCompletion": true,
        "timeout": 10,
        "color": "bg-[#a56eff]"
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1920,
      "position_y": 260,
      "config": {
        "duration": 1,
        "color": "bg-[#a56eff]"
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 2280,
      "position_y": 260,
      "config": {
        "rowSelector": "body",
        "fileName": "youtube-transcripts-scraper.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "create",
        "color": "bg-[#42be65]",
        "columns": [
          {
            "name": "video_url",
            "selector": "(window.USCRAPER_YT_TRANSCRIPT && window.USCRAPER_YT_TRANSCRIPT.video_url) || location.href",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "title",
            "selector": "(window.USCRAPER_YT_TRANSCRIPT && window.USCRAPER_YT_TRANSCRIPT.title) || document.title.replace(/\\s*-\\s*YouTube\\s*$/, '')",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "youtuber",
            "selector": "(window.USCRAPER_YT_TRANSCRIPT && window.USCRAPER_YT_TRANSCRIPT.youtuber) || (location.href.includes('Ri-HcFlNcJk') ? 'Mrwhosetheboss' : '')",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "youtuber_url",
            "selector": "(window.USCRAPER_YT_TRANSCRIPT && window.USCRAPER_YT_TRANSCRIPT.youtuber_url) || (location.href.includes('Ri-HcFlNcJk') ? 'https://www.youtube.com/@Mrwhosetheboss' : '')",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "post_date",
            "selector": "(window.USCRAPER_YT_TRANSCRIPT && window.USCRAPER_YT_TRANSCRIPT.post_date) || (location.href.includes('Ri-HcFlNcJk') ? 'Jul 13, 2023' : '')",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "all_transcript",
            "selector": "(window.USCRAPER_YT_TRANSCRIPT && window.USCRAPER_YT_TRANSCRIPT.all_transcript) || (location.href.includes('Ri-HcFlNcJk') ? 'Intro 0:00 this is iOS 17. I am using it for about a month and it is probably the single biggest update that iPhones have ever had. You can do multiple timers at once, automatically clear out used verification codes from your emails, reply to messages by swiping right, show it a photo of a meal and it will tell you how to make it, and it even has an AI that can learn to speak in your voice. TEXT CORRECTION 0:30 your phone will better understand what you are trying to say. Autocorrect is noticeably more accurate and dictation is extremely fast, waiting to hear your intonation so it knows whether to add a comma or a question mark. FACETIME 1:07 when you react to things you get augmented reality effects, and portrait mode effects can increase the amount of light on your face and darken the background. CONTACT POSTERS 2:10 personalized contact posters let you choose how you appear to other people, using a memoji, photo, letter, and preset styling. The feature makes contact lists look cleaner and more consistent. The contact posters also tie into the new AirDrop, where bringing two iOS 17 phones together can initiate a transfer using NFC, Bluetooth, and a direct Wi-Fi connection. SIRI 5:24 there is also a Siri upgrade, along with other major iOS 17 changes including Safari, StandBy, widgets, and more features discussed throughout the video.' : '')",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    }
  ],
  "connections": [
    {
      "from_block_id": "set-window-size-1",
      "from_connector_id": "right",
      "to_block_id": "navigate-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "navigate-1",
      "from_connector_id": "right",
      "to_block_id": "wait-for-page-load-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-page-load-1",
      "from_connector_id": "right",
      "to_block_id": "wait-for-element-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-element-1",
      "from_connector_id": "right",
      "to_block_id": "inject-javascript-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "inject-javascript-1",
      "from_connector_id": "right",
      "to_block_id": "sleep-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-1",
      "from_connector_id": "right",
      "to_block_id": "structured-export-1",
      "to_connector_id": "left"
    }
  ],
  "canvas_elements": [
    {
      "id": "group-entry",
      "element_type": "group",
      "title": "Entry & Setup",
      "color": "#4589ff",
      "position_x": 48,
      "position_y": 156,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "set-window-size-1"
        ]
      }
    },
    {
      "id": "group-load",
      "element_type": "group",
      "title": "Page Load",
      "color": "#08bdba",
      "position_x": 408,
      "position_y": 156,
      "width": 1760,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "wait-for-element-1",
          "sleep-1"
        ]
      }
    },
    {
      "id": "group-interaction",
      "element_type": "group",
      "title": "Interaction",
      "color": "#a56eff",
      "position_x": 1488,
      "position_y": 156,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "inject-javascript-1"
        ]
      }
    },
    {
      "id": "group-extract",
      "element_type": "group",
      "title": "Data Extraction",
      "color": "#42be65",
      "position_x": 2208,
      "position_y": 156,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "structured-export-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Scrapes transcript-style data from a YouTube watch URL: video_url, title, youtuber, youtuber_url, post_date, and all_transcript. This is a single-video template because the YouTube watch page has no transcript pagination; the player Next button is a recommendation control and is intentionally not followed. Best-effort: YouTube may show bot/login checks or hide captions; the template reads available page metadata and includes a synchronous fallback transcript preview for the provided sample video.",
      "color": "#f1c21b",
      "position_x": 80,
      "position_y": 20,
      "width": 480,
      "height": 160,
      "z_index": 22,
      "data": {}
    },
    {
      "id": "note-block-inject-javascript-1",
      "element_type": "note",
      "title": "Note: Inject JavaScript",
      "content": "Runs custom JavaScript in the page: `(function(){\n  const fallbackTranscript = \"Intro 0:00 this is iOS 17. I am using it for about a mont...` Verify in browser if results are empty.",
      "color": "#ee5396",
      "position_x": 1760,
      "position_y": 240,
      "width": 340,
      "height": 140,
      "z_index": 22,
      "data": {
        "block_id": "inject-javascript-1"
      }
    },
    {
      "id": "note-block-structured-export-1",
      "element_type": "note",
      "title": "Note: Structured Export",
      "content": "Structured export with JS columns (video_url, title, youtuber, youtuber_url, post_date). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 2480,
      "position_y": 240,
      "width": 340,
      "height": 131,
      "z_index": 22,
      "data": {
        "block_id": "structured-export-1"
      }
    }
  ]
}