AgentSkillsCN

notebooklm-video-research

通过 YouTube 视频自动创建 NotebookLM 笔记本。给定一个 YouTube 视频的 URL,提取视频中出现的人物信息,在线搜索相关资料,以视频和研究作为来源创建一个新的 NotebookLM 笔记本,并生成音频概览。采用“截图优先”的自动化方式,可靠地定位 UI 元素。

SKILL.md
--- frontmatter
name: notebooklm-video-research
description: Automate NotebookLM notebook creation from YouTube videos. Given a YouTube video URL, extract information about people featured in the video, research them online, create a new NotebookLM notebook with the video and research as sources, and generate an audio overview. Uses screenshot-first automation to reliably target UI elements.

NotebookLM Video Research Skill

Automate NotebookLM notebook creation from YouTube videos with automatic research and Audio Overview generation.

Core Principle

Screenshot before every action — verify UI state, identify correct elements, confirm success.

code
📸 Screenshot → 👀 Analyze → 🎯 Target → ✅ Verify → 🖱️ Execute → 📸 Screenshot → ✓ Confirm

Quick Start Workflow

Phase 1: Research

python
# 1. Get video info
Control Chrome:open_url("https://www.youtube.com/watch?v=VIDEO_ID")
Control Chrome:get_page_content()

# 2. Research people mentioned
web_search("[Person Name] background career")

# 3. Create research document (keep under 500k chars)

Phase 2: NotebookLM Automation

python
# 1. Navigate
Control Chrome:open_url("https://notebooklm.google.com/")

# 2. Create notebook
# Click "Create new" button

# 3. Add YouTube source
# Click "Websites" → Enter URL → Click "Insert"

# 4. Add research document  
# Click "Add sources" → "Copied text" → Paste content → Click "Insert"

# 5. Generate audio
# Click "Audio Overview" in Studio panel

Critical: Element Targeting

⚠️ The Main Trap

NotebookLM has multiple textareas. Generic selectors grab the wrong one!

code
SIDEBAR (wrong)          CENTER MODAL (correct)
┌──────────────┐         ┌──────────────────┐
│ Search box   │         │ URL/Text input   │
│ query-input  │         │ "Paste any links"|
└──────────────┘         └──────────────────┘

Correct Selectors

ElementSelector
URL inputtextarea[placeholder="Paste any links"]
Text inputtextarea[placeholder="Paste text here"]
Sidebar (AVOID)textarea[placeholder*="Search"]

Angular Event Pattern

javascript
// Simple .value = doesn't work! Use this:
var setter = Object.getOwnPropertyDescriptor(
    HTMLTextAreaElement.prototype, 'value'
).set;
setter.call(textarea, 'content');
textarea.dispatchEvent(new Event('input', {bubbles: true}));
textarea.dispatchEvent(new Event('change', {bubbles: true}));

Button State Check

javascript
var btn = document.querySelector('button');
if (btn && !btn.disabled && !btn.className.includes('disabled')) {
    btn.click();
}

Complete Code Snippets

Enter YouTube URL

javascript
var urlTextarea = document.querySelector('textarea[placeholder="Paste any links"]');
if (urlTextarea) {
    var setter = Object.getOwnPropertyDescriptor(
        HTMLTextAreaElement.prototype, 'value'
    ).set;
    setter.call(urlTextarea, 'https://www.youtube.com/watch?v=VIDEO_ID');
    urlTextarea.dispatchEvent(new Event('input', {bubbles: true}));
    urlTextarea.dispatchEvent(new Event('change', {bubbles: true}));
}

Enter Research Text

javascript
var pasteTextarea = document.querySelector('textarea[placeholder="Paste text here"]');
if (pasteTextarea) {
    var setter = Object.getOwnPropertyDescriptor(
        HTMLTextAreaElement.prototype, 'value'
    ).set;
    setter.call(pasteTextarea, RESEARCH_CONTENT);
    pasteTextarea.dispatchEvent(new Event('input', {bubbles: true}));
    pasteTextarea.dispatchEvent(new Event('change', {bubbles: true}));
}

Click Button by Text

javascript
var buttons = Array.from(document.querySelectorAll('button'));
var btn = buttons.find(b => b.textContent.includes('Insert'));
if (btn && !btn.disabled) {
    btn.click();
}

Verify State

javascript
// Check what textareas exist
var textareas = Array.from(document.querySelectorAll('textarea'));
textareas.map(t => ({
    placeholder: t.placeholder,
    value: t.value.substring(0, 50)
}));

Checkpoint Summary

StepVerify BeforeVerify After
Navigate-Home page loaded
Create notebookCreate button visibleNotebook opened
Add URLCorrect textarea identifiedURL in center, not sidebar
Click InsertButton ENABLEDSource added
Add textCorrect textarea identifiedText in center, not sidebar
Click InsertButton ENABLED2 sources shown
Audio OverviewStudio panel visibleGeneration started

Anti-Patterns

❌ Don't✅ Do
document.querySelector('textarea')textarea[placeholder="Paste any links"]
Click without checking stateVerify button enabled first
Assume action succeededScreenshot to confirm
Rush through stepsWait for async operations

Wait Times

ActionWait
Page navigation3s
Dialog open2s
YouTube source processing8-10s
Text source processing5s
Audio generation5-10 minutes

Error Recovery

Wrong input targeted:

  1. Clear sidebar: document.querySelectorAll('.query-input').forEach(el => el.value = '')
  2. Re-target with specific selector

Button disabled:

  1. Re-dispatch events on textarea
  2. Verify content actually entered

Modal didn't open:

  1. Wait longer
  2. Click trigger button again