{"id":51223144,"url":"https://github.com/muckybuzzwoo/claude-code-youtube-extract","last_synced_at":"2026-07-09T07:00:30.637Z","repository":{"id":352071063,"uuid":"1212675085","full_name":"muckybuzzwoo/claude-code-youtube-extract","owner":"muckybuzzwoo","description":"Turn any YouTube video into a searchable Markdown file with structured summary, chapter-aligned screenshots, and multi-video synthesis — from inside Claude Code.","archived":false,"fork":false,"pushed_at":"2026-07-08T16:44:13.000Z","size":263,"stargazers_count":4,"open_issues_count":0,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-08T18:09:03.867Z","etag":null,"topics":["ai-tool","claude-code","claude-code-plugin","claude-plugins","ffmpeg","markdown","video-summary","youtube","youtube-summarizer","youtube-transcript","yt-dlp"],"latest_commit_sha":null,"homepage":"https://www.buzzwoo.de","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/muckybuzzwoo.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-16T16:04:58.000Z","updated_at":"2026-07-08T16:44:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/muckybuzzwoo/claude-code-youtube-extract","commit_stats":null,"previous_names":["muckybuzzwoo/claude-code-youtube-extract"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/muckybuzzwoo/claude-code-youtube-extract","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muckybuzzwoo%2Fclaude-code-youtube-extract","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muckybuzzwoo%2Fclaude-code-youtube-extract/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muckybuzzwoo%2Fclaude-code-youtube-extract/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muckybuzzwoo%2Fclaude-code-youtube-extract/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/muckybuzzwoo","download_url":"https://codeload.github.com/muckybuzzwoo/claude-code-youtube-extract/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muckybuzzwoo%2Fclaude-code-youtube-extract/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35290235,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-09T02:00:07.329Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-tool","claude-code","claude-code-plugin","claude-plugins","ffmpeg","markdown","video-summary","youtube","youtube-summarizer","youtube-transcript","yt-dlp"],"created_at":"2026-06-28T09:00:31.117Z","updated_at":"2026-07-09T07:00:30.629Z","avatar_url":"https://github.com/muckybuzzwoo.png","language":"Python","funding_links":[],"categories":["Source Catalog"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/claude-jumping.svg\" alt=\"Jumping Claude mascot\" width=\"140\" height=\"126\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eyt-extract\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cem\u003eExtract transcripts, metadata, screenshots, and comments from YouTube videos — all in one Claude Code command.\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"version\" src=\"https://img.shields.io/badge/version-1.10.1-blue\"\u003e\n  \u003cimg alt=\"claude-code\" src=\"https://img.shields.io/badge/Claude%20Code-plugin-purple\"\u003e\n  \u003cimg alt=\"license\" src=\"https://img.shields.io/badge/license-Apache%202.0-green\"\u003e\n  \u003cimg alt=\"platform\" src=\"https://img.shields.io/badge/platform-macOS%20%7C%20Linux%20%7C%20Windows-lightgrey\"\u003e\n  \u003cimg alt=\"python\" src=\"https://img.shields.io/badge/python-3.8%2B-yellow\"\u003e\n  \u003cimg alt=\"youtube\" src=\"https://img.shields.io/badge/YouTube-FF0000?logo=youtube\u0026logoColor=white\"\u003e\n\u003c/p\u003e\n\n## The Problem\n\nTutorial videos are trapped knowledge. The content is valuable, but it sits behind 30 minutes of playback — no searchable text, no copy-paste. You watch once, forget half, and can't easily cite or reuse what you heard.\n\n`yt-extract` pulls the full value out of a YouTube video in one command: structured metadata, a filtered description, the complete transcript (summarized or raw), the top comments, and — if you want — screenshots at scene changes, chapter markers, or custom timestamps. Everything lands in a dated folder as a single Markdown file you can search, cite, or feed back into Claude.\n\n## Components\n\n| Type  | Name             | Version | Description                                                                 |\n|-------|------------------|---------|-----------------------------------------------------------------------------|\n| Skill | `yt-extract`     | 1.10.1  | Extract transcripts, metadata, screenshots, and comments from YouTube videos |\n| Agent | `extract-worker` | 1.10.1  | Internal restricted worker the skill dispatches per URL (run only — no delegation) |\n\nThis plugin has no dependencies on other Claude Code plugins.\n\n## Features\n\n- 📝 **Structured summary** — Key thesis, main points, tools \u0026 resources, quotes \u0026 numbers\n- 📄 **Full transcript** — Raw text with preserved chapter markers (opt-in via `--full-transcript`)\n- 📃 **Transcript-only** — Just the raw transcript, fast — no summary, metadata, or extras (opt-in via `--transcript-only`); runs without a subagent\n- 🏷️ **Metadata** — Title, channel, upload date, duration, view/like counts, chapters\n- 🔎 **Filtered description** — Subscribe/social boilerplate stripped, tool links preserved\n- 📸 **Screenshots** — Frames at scene changes (default — every slide/screen change, ideal for tutorials), chapter markers, or custom timestamps, embedded in transcript (opt-in via `--screenshots`)\n- 💬 **Comments** — Top 10 comments sorted by likes (opt-in via `--comments`)\n- 🎞️ **Multi-video mode** — 2-3 URLs in one call, with a synthesis section across all videos\n- 💾 **Auto-save** — Dated folder with Markdown file, YAML frontmatter, organized screenshots\n- ⚡ **Parallel extraction** — Each URL runs in its own subagent, so 3 videos take the time of 1\n- 🛠️ **Install-on-demand** — Missing `yt-dlp` or `ffmpeg`? The skill offers to install them for you, per-OS.\n\n## Quick Start\n\n### 1. Add the marketplace\n\n```bash\n/plugin marketplace add muckybuzzwoo/claude-code-youtube-extract\n```\n\nOr clone and add the local path:\n\n```bash\ngit clone https://github.com/muckybuzzwoo/claude-code-youtube-extract.git\n# then in Claude Code:\n/plugin marketplace add /path/to/claude-code-youtube-extract\n```\n\n### 2. Install the plugin\n\n```bash\n/plugin install yt-extract\n```\n\n### 3. (Optional) Verify install\n\n```bash\n/yt-extract --check\n```\n\nThis runs the dependency check (`yt-dlp`, plus `ffmpeg` if you add `--screenshots`) and triggers the install-on-demand flow when something is missing — without doing any video extraction. Since v1.5.0, Windows installs from `winget` are recovered automatically when `winget` does not put the binary on PATH; a Claude Code restart is rarely needed (see [Troubleshooting](#troubleshooting) for the rare last-resort case).\n\n### 4. Run it\n\n```bash\n/yt-extract https://www.youtube.com/watch?v=VIDEO_ID\n```\n\nIf you skipped step 3, the first real run will offer to install any missing dependency when it's needed.\n\n## Usage \u0026 Flags\n\n```\n/yt-extract \u003cyoutube-url\u003e [\u003curl2\u003e [\u003curl3\u003e]] [flags]\n```\n\n| Flag | Effect |\n|---|---|\n| *(none)* | Metadata + description + structured summary + auto-save |\n| `--comments` | Also fetch the top 10 comments |\n| `--full-transcript` | Return the raw transcript instead of a summary |\n| `--transcript-only` | Output only the raw transcript — no metadata, summary, comments, or screenshots; no subagent. Folder/file named by video ID. |\n| `--screenshots` | Extract screenshots at **scene changes** via ffmpeg scene detection — captures every slide/screen change, ideal for tutorials. Works without chapter markers (requires ffmpeg) |\n| `--screenshots scenes=0.05` | Scene detection with a custom threshold (default `0.04`; higher = fewer captures) |\n| `--screenshots chapters` | Extract screenshots at chapter markers (the pre-1.8.0 default) |\n| `--screenshots 0:30,2:15,5:00` | Extract screenshots at custom timestamps |\n| `--visual` | Let the summarizer look at 4 evenly-spaced keyframes so the summary can address on-screen content (diagrams, code, slides). Frames are ephemeral — extracted to a temp dir, read, then deleted; nothing is saved to the output folder. Requires ffmpeg. Ignored with `--full-transcript` / `--transcript-only` (no summary to ground). |\n\n\u003e **⚠ Breaking change in 1.8.0:** bare `--screenshots` used to mean chapter markers. It now means scene detection — pass `--screenshots chapters` to restore the old behavior. Scene detection caps output at 50 screenshots (4 s minimum gap, even thinning beyond that) and notes it in `## Screenshot Status`. Since 1.9.0, near-identical scene captures (held slides, sub-threshold flicker) are removed automatically by a perceptual dedup pass, reported as `N near-duplicate(s) removed` in the same section. Chapter and custom-timestamp captures are left untouched.\n| `--no-save` | Skip auto-save; ask before writing to disk |\n| `--check` | Verify dependencies only — no video extraction, no output file. Use this to trigger the install-on-demand flow for `yt-dlp` (and `ffmpeg` when combined with `--screenshots`) without doing a real run. |\n\n### Examples\n\n```bash\n# Verify install only — no extraction, no output file\n/yt-extract --check\n/yt-extract --check --screenshots       # also verifies ffmpeg\n\n# Single video — structured summary, auto-saved\n/yt-extract https://www.youtube.com/watch?v=dQw4w9WgXcQ\n\n# With comments and screenshots at every scene change (slides, screen shares)\n/yt-extract https://youtu.be/abc123 --comments --screenshots\n\n# Fewer scene captures (higher threshold), or classic chapter-aligned frames\n/yt-extract https://youtu.be/abc123 --screenshots scenes=0.05\n/yt-extract https://youtu.be/abc123 --screenshots chapters\n\n# Full raw transcript with custom screenshot timestamps\n/yt-extract https://youtu.be/abc123 --full-transcript --screenshots 1:30,5:00,12:45\n\n# Just the raw transcript, fast — no summary, no metadata fetch\n/yt-extract https://youtu.be/abc123 --transcript-only\n\n# Ground the summary in a few keyframes (diagrams, code, slides)\n/yt-extract https://youtu.be/abc123 --visual\n\n# Compare 3 videos on the same topic\n/yt-extract https://youtu.be/a https://youtu.be/b https://youtu.be/c --comments\n```\n\n## How It Works\n\n### Default flow (no screenshots)\n\n```\n  User\n    │  /yt-extract \u003curl1\u003e [\u003curl2\u003e [\u003curl3\u003e]]\n    ▼\n┌──────────────────────────────────────────────┐\n│  SKILL.md orchestrator                       │\n│  parses flags, dispatches N subagents         │\n└────────────────────┬─────────────────────────┘\n                     │  parallel: one subagent per URL\n       ┌─────────────┼─────────────┐\n       ▼             ▼             ▼\n   ┌──────┐      ┌──────┐      ┌──────┐\n   │ SA 1 │      │ SA 2 │      │ SA 3 │       each runs:\n   └──┬───┘      └──┬───┘      └──┬───┘       python yt-extract.py \u003curl\u003e\n      │             │             │            ├─ yt-dlp → metadata / description\n      │             │             │            ├─ yt-dlp → transcript (VTT)\n      │             │             │            └─ yt-dlp → top comments (optional)\n      ▼             ▼             ▼\n┌──────────────────────────────────────────────┐\n│  Structured Markdown (per URL)               │\n│  ### Metadata      ### Description            │\n│  ### Chapters      ### Transcript             │\n│  ### Comments                                 │\n└────────────────────┬─────────────────────────┘\n                     │  each subagent summarizes its transcript\n                     ▼\n┌──────────────────────────────────────────────┐\n│  Assemble output (+ Synthesis for 2-3 URLs)  │\n│  Core Thesis · Main Points · Tools · Quotes  │\n└────────────────────┬─────────────────────────┘\n                     ▼\n┌──────────────────────────────────────────────┐\n│  Auto-save                                   │\n│  yt-extract_2026-04-17_video-title-slug/     │\n│    └─ yt-extract_2026-04-17_*.md             │\n└──────────────────────────────────────────────┘\n```\n\n### Flow with `--screenshots`\n\nScreenshots land in two places: **embedded inside the transcript** at their matching timestamps (so you can read and see in context), and **listed separately** in a `## Screenshots` section (for quick visual skimming).\n\n```\n  User\n    │  /yt-extract \u003curl\u003e --screenshots\n    ▼\n┌──────────────────────────────────────────────┐\n│  SKILL.md orchestrator                       │\n│  dispatches subagent with --screenshots       │\n└────────────────────┬─────────────────────────┘\n                     ▼\n┌──────────────────────────────────────────────┐\n│  Subagent runs:                              │\n│  python yt-extract.py \u003curl\u003e --screenshots    │\n│    --output-base .                           │\n│                                              │\n│  Backend pipeline:                           │\n│  1. yt-dlp  → metadata + VTT transcript      │\n│  2. yt-dlp  → chapter markers (if present)   │\n│  3. Create yt-extract_DATE_slug/             │\n│     + screenshots/ subfolder                 │\n│  4. ffmpeg  → capture frame at each marker   │\n│               → \u003cfolder\u003e/screenshots/*.png   │\n│  5. VTT parser INTERLEAVES image refs        │\n│     at matching transcript timestamps        │\n│                                              │\n│  stderr stream: [1/5] [2/5] … progress       │\n└────────────────────┬─────────────────────────┘\n                     ▼\n┌──────────────────────────────────────────────┐\n│  Markdown output (stdout)                    │\n│                                              │\n│  ### Transcript                              │\n│  [00:00] Welcome to the video...             │\n│  [00:30] Today we'll cover Docker            │\n│          ![](screenshots/001_00m30s.png)     │\n│  [02:15] First step: install Docker...       │\n│          ![](screenshots/002_02m15s.png)     │\n│                                              │\n│  ### Screenshots                             │\n│  - [00:30] Intro — 001_00m30s.png            │\n│  - [02:15] Docker install — 002_02m15s.png   │\n│                                              │\n│  ### Screenshot Status                       │\n│  2 screenshots requested, 2 extracted        │\n│                                              │\n│  OUTPUT_FOLDER: ./yt-extract_2026-04-20_slug │\n└────────────────────┬─────────────────────────┘\n                     ▼\n┌──────────────────────────────────────────────┐\n│  Skill reads OUTPUT_FOLDER, prepends         │\n│  YAML frontmatter, writes the .md file       │\n│  into the folder the script already created. │\n│  No moves, no rewrites for single-video.     │\n│                                              │\n│  yt-extract_2026-04-20_slug/                 │\n│    ├─ yt-extract_2026-04-20_*.md             │\n│    └─ screenshots/                           │\n│       ├─ 001_00m30s_intro.png                │\n│       ├─ 002_02m15s_docker.png               │\n│       └─ 003_05m00s_config.png               │\n└──────────────────────────────────────────────┘\n```\n\n### Modes and where screenshots appear\n\n| Mode | Where screenshots appear in the saved file |\n|---|---|\n| Summary + `--screenshots` (scene detection, default) | Standalone `## Screenshots` section at the bottom — scene timestamps are never chapter-aligned. Timestamps that fall inside a chapter still get the chapter title in their caption. |\n| Summary + `--screenshots chapters` | Embedded inline **under each `## Chapters` entry** (1:1 mapping). The standalone `## Screenshots` section is suppressed. |\n| Summary + `--screenshots 0:30,2:15,...` (custom timestamps) | Standalone `## Screenshots` section at the bottom (no chapter alignment possible). |\n| `--full-transcript` + `--screenshots` (scene detection or custom timestamps) | Each screenshot is embedded inline in the transcript with a preceding `### [HH:MM]` h3 heading (or `### [HH:MM] — Chapter Title` if the timestamp falls inside a chapter). Standalone `## Screenshots` section is suppressed. |\n| `--full-transcript` + `--screenshots chapters` | Transcript is pre-structured as `### [HH:MM] Chapter Title` h3 blocks — each heading is followed by the matching screenshot and the transcript text for that interval. `## Chapters` renders as a plain TOC. Standalone `## Screenshots` section is suppressed. |\n\nThe `## Screenshot Status` line (`\"N screenshots requested, M successfully extracted\"`) is always rendered when `--screenshots` was used, regardless of which mode.\n\n### After a run completes\n\nEvery extraction ends with a concise **\"What next?\"** invitation that lists concrete follow-up queries you can fire at the extracted data — extract all tools as a checklist, translate the summary, drill into a specific chapter, write a blog draft, and so on — plus re-run hints for any flags you didn't use this time (`--comments`, `--full-transcript`, `--screenshots`). The transcript and summary stay in the current Claude Code session's context, so you can chain follow-ups without re-running anything.\n\n### Components\n\n- **`skills/yt-extract/SKILL.md`** — The skill definition. Parses URLs and flags, detects the host OS, checks dependencies, dispatches one `extract-worker` subagent per URL for summarization, assembles the final Markdown output, handles auto-save and folder layout.\n- **`scripts/yt-extract.py`** — The Python backend. Calls `yt-dlp` for metadata/subtitles/comments, parses VTT with timestamps, calls `ffmpeg` for screenshots, and owns deterministic markdown rendering details such as section ordering, timestamp formatting, screenshot filename conventions, and screenshot/transcript layout.\n- **`agents/extract-worker.md`** — A restricted leaf worker (tools: `Bash, Read, Glob, Grep` only — no `Skill`/`Agent` tool). The skill dispatches it per URL so the work runs in an isolated context, and because it cannot invoke skills or spawn subagents it cannot recurse back into the skill (the 1.8.1 fix).\n\n## Anatomy of a Saved File\n\nEvery saved analysis is a single Markdown file with YAML frontmatter. Here's the abstract skeleton for a **single-video** run with `--screenshots --comments`:\n\n```markdown\n---\ntitle: \"\u003cvideo title\u003e\"\nchannel: \"\u003cchannel name\u003e\"\ndate: \"\u003cupload date YYYY-MM-DD\u003e\"\nurl: \"\u003cyoutube url\u003e\"\nanalyzed: \"\u003ctoday's date YYYY-MM-DD\u003e\"\nflags: [screenshots, comments]\n---\n\n## \u003cVideo Title\u003e\n**Channel:** \u003c…\u003e | **Date:** \u003c…\u003e | **Duration:** \u003cHH:MM:SS\u003e | **Views:** \u003cn\u003e | **Likes:** \u003cn\u003e\n\n---\n\n## Description\n\u003ccleaned description — subscribe/social boilerplate stripped, tool links kept\u003e\n\n## Chapters\n- [00:00] \u003cchapter title\u003e\n\n  ![\u003cchapter title\u003e](screenshots/001_00m00s_\u003cslug\u003e.png)\n\n- [02:15] \u003cchapter title\u003e\n\n  ![\u003cchapter title\u003e](screenshots/002_02m15s_\u003cslug\u003e.png)\n\n…\n\n## Transcript Summary\n\u003e ℹ️ Auto-generated subtitles (\u003clang\u003e)\n\n#### Core Thesis\n\u003c1-2 sentences: central claim of the video\u003e\n\n#### Main Points\n1. \u003cinsight\u003e\n2. \u003cinsight\u003e\n…\n\n#### Tools \u0026 Resources Mentioned\n- \u003ctool or link\u003e\n- …\n\n#### Key Quotes \u0026 Numbers\n- \u003cmetric, statistic, verbatim quote\u003e\n- …\n\n\u003e 💡 Full transcript available — re-run with `--full-transcript` if needed.\n\n## Screenshot Status\n\u003cN\u003e screenshots requested, \u003cM\u003e successfully extracted\n\n## Top Comments\n1. \u003ccomment author\u003e — \u003ctop comment text\u003e\n2. …\n```\n\n### Folder structure\n\n**Single video:**\n\n```\nyt-extract_2026-04-16_video-title-slug/\n├── yt-extract_2026-04-16_video-title-slug.md\n└── screenshots/                     ← only with --screenshots\n    ├── 001_00m30s_intro.png\n    ├── 002_02m15s_installing-docker.png\n    └── 003_05m00s_configuration.png\n```\n\n**Multi-video (2-3 URLs):**\n\n```\nyt-extract_2026-04-20_3-videos/\n├── yt-extract_2026-04-20_3-videos.md            ← consolidated output\n├── yt-extract_2026-04-20_video-one-slug/        ← per-video folder (from subagent 1)\n│   └── screenshots/\n│       └── 001_00m30s.png\n├── yt-extract_2026-04-20_video-two-slug/        ← per-video folder (from subagent 2)\n│   └── screenshots/\n│       └── 001_01m00s.png\n└── yt-extract_2026-04-20_video-three-slug/\n    └── screenshots/\n        └── 001_02m45s.png\n```\n\nEach per-video folder is a complete, standalone extraction unit — you can\nmove or rename any one of them independently. The consolidated `.md` at the\ntop references screenshots via the per-video folder path\n(`yt-extract_2026-04-20_video-one-slug/screenshots/001_00m30s.png`).\n\n### Multi-video frontmatter\n\n```yaml\n---\nanalyzed: \"2026-04-16\"\nflags: [screenshots]\nvideos:\n  - title: \"Video 1 Title\"\n    channel: \"Channel A\"\n    date: \"2024-01-10\"\n    url: \"https://youtu.be/aaa\"\n  - title: \"Video 2 Title\"\n    channel: \"Channel B\"\n    date: \"2024-02-22\"\n    url: \"https://youtu.be/bbb\"\n---\n```\n\n## Multi-Video Mode\n\nWhen you pass 2 or 3 URLs, each video is extracted in parallel (one subagent per URL), and a final **Synthesis** section compares them:\n\n- **Shared themes** — topics shared across videos\n- **Differences \u0026 contradictions** — diverging approaches, conflicting statements\n- **Overall key takeaways** — the most important insights across all videos\n- **Tools \u0026 resources mentioned** — consolidated list of all tools, repos, links\n\nDependency checks still fire exactly once per run, not once per URL — so three parallel subagents with `--screenshots` produce a single ffmpeg prompt (or no prompt at all if ffmpeg is already installed).\n\n## How yt-extract compares\n\nThere's no shortage of YouTube-summarization tools. Here's an honest, feature-by-feature comparison against five of the most popular alternatives. All data verified against the official product pages, official store listings, or neutral third-party reviews as of April 2026.\n\n| Tool | Summary | Full transcript | Screenshots (video frames) | Multi-video batch + synthesis | Local Markdown export | Follow-up queries on extracted data |\n|------|:-------:|:---------------:|:---:|:---:|:---:|:---:|\n| **yt-extract** | ✅ structured (Thesis · Points · Tools · Quotes) | ✅ `--full-transcript` | ✅ scene detection + chapters + custom timestamps | ✅ 2–3 URLs with cross-video synthesis | ✅ auto-saves `.md` with YAML frontmatter | ✅ Claude-native — ask follow-ups without copy-paste |\n| [Summarize.tech](https://www.summarize.tech/) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |\n| [NoteGPT](https://notegpt.io/) | ✅ | ✅ | ❌ | ❌ | ⚠️¹ | ✅ |\n| [Eightify](https://eightify.app/) | ✅ | ✅² | ❌ | ❌ | ❌ | ❌ |\n| [Glasp YT Summary](https://glasp.co/youtube-summary) | ✅ | ✅² | ❌ | ❌ | ⚠️³ | ⚠️⁴ |\n| [Merlin AI](https://www.getmerlin.in/) | ✅ | ✅ | ❌ | ❌ | ❌ | ⚠️⁵ |\n\n**Footnotes:**\n\n¹ NoteGPT has a `PDF → Markdown` converter, but no explicit `.md` download for transcripts or summaries.\n² Eightify / Glasp: \"Copy Transcript\" puts the text on your clipboard — no file download.\n³ Glasp: highlights can be exported as `.md` to Roam, Notion, or Obsidian — but full summary/transcript-to-`.md` export is not explicit.\n⁴ Glasp uses your own ChatGPT / Claude / Gemini / Mistral account — follow-up questions happen inside that chat, not within the extension itself.\n⁵ Merlin is a general-purpose AI chat assistant — so follow-up on extracted YouTube data is *possible* through its broader chat, but not documented as a dedicated feature.\n\n### What this table honestly shows\n\n- **Commodity features** (summary, transcript): nearly every tool has these. Anything else is table stakes.\n- **Chapter-aligned screenshots** and **multi-video batch with synthesis**: the two columns where yt-extract appears to stand alone — no mainstream competitor markets these features.\n- **Local Markdown export**: only yt-extract saves a full dated folder with YAML frontmatter by default. Others keep the result in a browser or clipboard.\n- **Follow-up queries**: because yt-extract runs *inside* Claude Code, the extracted data is already in the assistant's context — you can immediately ask \"summarize these 3 videos in one paragraph\" or \"extract all tools mentioned in point 4\" without re-feeding anything.\n\n### The honest trade-off\n\nyt-extract requires [Claude Code](https://claude.com/claude-code) and two CLI dependencies (`yt-dlp`, optionally `ffmpeg`). Every tool in the table above works inside a browser with no setup. If you want a zero-install summary in 10 seconds and don't need transcripts, screenshots, batch mode, local files, or agent-native follow-ups — one of the browser tools will serve you faster. yt-extract is optimized for the case where you want the full extracted payload as a local artifact you can reuse, edit, search, and chain into further AI work.\n\n## Prerequisites\n\nCross-platform: macOS, Linux, and Windows are all supported. Python 3.8+ is required (use `python3` on macOS/Linux, `python` on Windows — the skill picks the right one automatically).\n\n**Required — [yt-dlp](https://github.com/yt-dlp/yt-dlp)** — YouTube data extraction:\n\n```bash\n# macOS\nbrew install yt-dlp\n\n# Linux\npip install --user yt-dlp          # or: pipx install yt-dlp\n\n# Windows\npip install yt-dlp                 # or: winget install yt-dlp\n```\n\n**Optional (for `--screenshots`) — [ffmpeg](https://ffmpeg.org/)** — frame extraction:\n\n```bash\n# macOS\nbrew install ffmpeg\n\n# Linux\nsudo apt install ffmpeg            # Debian/Ubuntu\nsudo dnf install ffmpeg            # Fedora/RHEL\n\n# Windows\nwinget install Gyan.FFmpeg\n```\n\n### Install-on-demand\n\nIf either dependency is missing when you run `/yt-extract`, the skill detects the host OS and offers to install it for you. When more than one install method is valid on your OS (e.g. `pip` vs `winget` on Windows for yt-dlp), you pick which one to run. On failure the skill shows a clear error with a link to the official documentation and the manual install commands.\n\n- **yt-dlp** is always checked. Declining the install prompt aborts the run with a pointer to the [yt-dlp installation wiki](https://github.com/yt-dlp/yt-dlp/wiki/Installation).\n- **ffmpeg** is only checked when you pass `--screenshots`. Declining the install proceeds without screenshots; the saved Markdown notes that screenshots were skipped. See the [ffmpeg download page](https://ffmpeg.org/download.html) for manual install.\n\n## Troubleshooting\n\n### `\"Installation completed but \u003cdep\u003e is still not on PATH\"` — Windows\nRare since v1.5.0. The skill's automatic Windows PATH recovery (Step W) normally finds the freshly installed binary in `%LOCALAPPDATA%\\Microsoft\\WinGet\\Packages` and either copies it into Python's Scripts directory (immediate, no restart) or stages it in `WinGet\\Links` while adding that directory to the user PATH (Claude Code restart needed once). If you still see this message, recovery could not locate the binary or could not write to a destination on PATH. Restart Claude Code and re-run `/yt-extract --check`; if it persists, install the dependency manually with `pip install yt-dlp` (yt-dlp) or by copying `ffmpeg.exe` and `ffprobe.exe` from `%LOCALAPPDATA%\\Microsoft\\WinGet\\Packages\\Gyan.FFmpeg_*\\...\\bin\\` into a directory on your PATH.\n\n### `ffmpeg` install hangs or asks for a sudo password — Linux\nThe skill probes `sudo -n true` before attempting any sudo install. If you have no active sudo session, the skill aborts safely and prints the exact manual command instead of hanging. Open your terminal, run `sudo apt install -y ffmpeg` (or `dnf`), then re-run `/yt-extract`. To avoid sudo entirely for `yt-dlp`, use `pip install --user yt-dlp` or `pipx install yt-dlp`.\n\n### `winget install` returns exit code 43\nThis means the package is already installed — not an error. As of v1.1.0, Step 0.6.C treats exit 43 the same as exit 0 and proceeds to verify PATH. Combined with v1.5.0's PATH recovery, exit 43 now resolves transparently when the binary is present in the WinGet packages directory: Step W locates it and either copies it to Python's Scripts dir (immediate) or stages a permanent PATH entry (one-time restart).\n\n### No transcript shown\nThe video has no subtitles (neither manual nor auto-generated), or the language is not detected by yt-dlp. The analysis continues with metadata, description, and comments; the summary section shows `❌ No transcript available.`\n\n### No chapter markers — only `--screenshots chapters` asks where to take frames\nDefault scene detection works without chapter markers, so bare `--screenshots` never prompts. Only the explicit `--screenshots chapters` on a video without chapters triggers the question: auto-distribute evenly (1 screenshot per 2 minutes, max 10) or enter custom timestamps. You can also pass timestamps up front with `--screenshots 0:30,2:15,5:00`.\n\n### Private / age-restricted / members-only videos\nNot supported. `yt-dlp` requires authentication for these, which yt-extract does not configure. Use `yt-dlp` manually with cookies if you need this.\n\n### Playlists\nNot supported. Pass individual video URLs only. Multi-video mode accepts up to 3 URLs in one call.\n\n### Screenshot image links appear broken after moving the folder\nThe saved MD uses **relative** image paths (`screenshots/001_….png`). As long as the folder stays intact, links work. Moving only the `.md` out of its folder breaks the links — keep the whole folder together.\n\n## FAQ\n\n**Q: Does this work for YouTube Shorts?**\nA: Yes, Shorts are treated as normal videos. No special handling needed.\n\n**Q: Can I process livestreams?**\nA: Only after they end — the transcript becomes available when the stream is archived. An ongoing live stream shows a `\"Ongoing livestream — transcript available only after it ends\"` note; metadata is still extracted.\n\n**Q: Can I feed cookies to yt-dlp for age-gated content?**\nA: Not currently. The skill doesn't expose `yt-dlp --cookies` yet. File an issue if you need it.\n\n**Q: Why are screenshots stripped from the summary but kept in the raw transcript?**\nA: The summary aims to be a clean, scannable briefing. Image refs clutter that. The raw transcript preserves them in context, and the separate `## Screenshots` section gives you a visual index either way.\n\n**Q: How does it pick which screenshots to take?**\nA: By default (since 1.8.0), ffmpeg scene detection captures a frame at every screen change — slide flips, screen shares, demo cuts — with a 4 s minimum gap and a cap of 50 (evenly thinned beyond that, noted in `## Screenshot Status`). Since 1.9.0 a perceptual dedup pass then removes near-identical captures, so a slide held across several detected changes collapses to a single frame. Tune sensitivity with `--screenshots scenes=0.05` (higher = fewer). `--screenshots chapters` takes one frame per chapter marker instead, and `--screenshots 0:30,2:15,5:00` uses your exact timestamps.\n\n**Q: Scene detection gave me too many (or too few) screenshots — what now?**\nA: Raise the threshold for fewer captures (`scenes=0.05` or `scenes=0.1`), lower it for more (`scenes=0.01`). The default `0.04` suits most slide-style tutorials. The `## Screenshot Status` warnings tell you which direction to go.\n\n**Q: What does `--visual` do vs `--screenshots`?**\nA: `--visual` gives the summarizer a few ephemeral frames to *look at* while writing the summary — nothing is saved. `--screenshots` extracts and *saves* images that are embedded in the output Markdown. You can combine both, or use either alone.\n\n**Q: Can the output be piped into another tool?**\nA: Yes. The saved Markdown has a YAML frontmatter block and predictable section headings (`## Description`, `## Transcript Summary`, `## Top Comments`, etc.) — easy to parse or feed back into Claude for follow-up analysis.\n\n## Limitations \u0026 Legal Notes\n\n- **YouTube Terms of Service.** Downloading video data via `yt-dlp` may conflict with YouTube's ToS depending on your jurisdiction and use case. This plugin does **not** download video files — it only pulls metadata, subtitles, and comment text. Use responsibly and verify ToS compliance for your workflow.\n- **Copyright \u0026 Fair Use.** Extracted transcripts, comments, and screenshots are copyrighted by their creators. Quoting, summarizing, and personal reference use are generally considered fair use in many jurisdictions; redistribution or commercial reuse typically is not. You are responsible for how you use the output.\n- **Rate limits.** `yt-dlp` may hit YouTube rate limits on heavy batch use. This plugin processes at most 3 URLs per invocation, which is far below typical limits — but repeated back-to-back calls may still trip a temporary soft-block. If that happens, wait a few minutes and retry.\n\n## Contributing\n\nIssues, feature requests, and PRs are welcome on [GitHub](https://github.com/muckybuzzwoo/claude-code-youtube-extract).\n\nBefore opening a PR, please:\n- Open an issue first for non-trivial changes so the design can be discussed before implementation\n- Follow the architectural conventions in [CLAUDE.md](CLAUDE.md) (single skill + single script; English everywhere; `${CLAUDE_PLUGIN_ROOT}/scripts/yt-extract.py` invocation pattern)\n- Update [CHANGELOG.md](CHANGELOG.md) under the `[Unreleased]` heading\n\nGood first issues: additional install methods (e.g. `choco` on Windows, `snap` on Linux), cookie-auth support for private videos, playlist-URL expansion.\n\n## License\n\n[Apache-2.0](LICENSE) © Mucky / [buzzwoo](https://www.buzzwoo.de)\n\n---\n\nVersion: 1.10.1 — [Changelog](CHANGELOG.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmuckybuzzwoo%2Fclaude-code-youtube-extract","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmuckybuzzwoo%2Fclaude-code-youtube-extract","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmuckybuzzwoo%2Fclaude-code-youtube-extract/lists"}