doc-condenser
**DEPRECATED** — Modern Claude models condense and summarize technical documentation natively with comparable quality. The output…
Search YouTube by keyword and return structured video metadata (title, URL, channel, views, duration, date) via yt-dlp. No API keys. Triggers on: "search youtube", "find youtube videos", "top youtube videos on", "trending videos on", "youtube results for", "yt search",
Claude Code
$ npx -y skills add Mathews-Tom/armory --skill youtube-search --agent claude-code
Codex
$ npx skills add Mathews-Tom/armory --skill youtube-search -a codex -y
Cursor
$ npx skills add Mathews-Tom/armory --skill youtube-search -a cursor -y
Gemini CLI
$ npx skills add Mathews-Tom/armory --skill youtube-search -a gemini-cli -y
GitHub Copilot
$ npx skills add Mathews-Tom/armory --skill youtube-search -a github-copilot -y
OpenCode
$ npx skills add Mathews-Tom/armory --skill youtube-search -a opencode -y
Windsurf
$ npx skills add Mathews-Tom/armory --skill youtube-search -a windsurf -y
name: youtube-search description: 'Search YouTube by keyword and return structured video metadata (title, URL, channel, views, duration, date) via yt-dlp. No API keys. Triggers on: "search youtube", "find youtube videos", "top youtube videos on", "trending videos on", "youtube results for", "yt search", "/yt-search".' metadata: version: 1.1.1 category: research tags: [youtube, search, skill] difficulty: beginner
Search YouTube by keyword and return structured video metadata — title, URL, channel, views, duration, upload date. Uses `yt-dlp` for scraping with no API keys or OAuth required.
uv tool install yt-dlp
Verify:
yt-dlp --version
yt-dlp "ytsearch10:claude code skills" --dump-json --flat-playlist --no-warnings 2>/dev/null \ | jq -r '[.title, .url, .channel, .view_count, .duration_string, .upload_date] | @tsv'
yt-dlp "ytsearch5:claude code mcp servers" \
--dump-json --flat-playlist --no-warnings 2>/dev/null \
| jq '{
title: .title,
url: .url,
channel: .channel,
views: .view_count,
duration: .duration_string,
upload_date: .upload_date,
description: (.description // "" | .[0:200])
}'yt-dlp does not support server-side sort. To sort by views or date, capture all results and sort client-side:
# Sort by view count (descending)
yt-dlp "ytsearch20:AI agents 2026" \
--dump-json --flat-playlist --no-warnings 2>/dev/null \
| jq -s 'sort_by(-.view_count) | .[:10][] | {title, url, channel, views: .view_count}'# Sort by upload date (newest first)
yt-dlp "ytsearch20:claude code tutorial" \
--dump-json --flat-playlist --no-warnings 2>/dev/null \
| jq -s 'sort_by(-.upload_date) | .[:10][] | {title, url, channel, upload_date}'The number after `ytsearch` controls how many results to fetch:
| Pattern | Results | | ------------------ | -------------------------------------- | | `ytsearch5:query` | 5 results | | `ytsearch10:query` | 10 results (default recommendation) | | `ytsearch20:query` | 20 results | | `ytsearch50:query` | 50 results (slow, may hit rate limits) |
**Recommendation:** Fetch 15-20 results, then filter/sort client-side to the top N the user wants. This provides enough data for meaningful sorting without being excessive.
User provides search query
|
v
+---------------------+
| Step 0: Deps check |
+----------+----------+
v
+---------------------+
| Step 1: Search |
| (yt-dlp ytsearch) |
+----------+----------+
v
+---------------------+
| Step 2: Parse JSON |
| (jq formatting) |
+----------+----------+
v
+---------------------+
| Step 3: Present |
| results to user |
+---------------------+yt-dlp "ytsearch${COUNT}:${QUERY}" \
--dump-json --flat-playlist --no-warnings 2>/dev/nullExtract relevant fields with `jq`. The full metadata object from yt-dlp contains many fields; the useful subset for search results:
| Field | Description | | ------------------ | ------------------------------------------ | | `.title` | Video title | | `.url` | Full YouTube URL | | `.channel` | Channel name | | `.view_count` | Total views (integer) | | `.duration_string` | Duration as `H:MM:SS` or `MM:SS` | | `.upload_date` | Upload date as `YYYYMMDD` | | `.description` | Video description (can be long — truncate) | | `.like_count` | Likes (may be null) | | `.comment_count` | Comments (may be null) |
Format as a markdown table for the user:
yt-dlp "ytsearch10:${QUERY}" \
--dump-json --flat-playlist --no-warnings 2>/dev/null \
| jq -s 'sort_by(-.view_count) | .[] | "| \(.title[:60]) | \(.channel) | \(.view_count) | \(.duration_string) | \(.upload_date) |"' -rPrefix with a header row:
| Title | Channel | Views | Duration | Date | |-------|---------|-------|----------|------|
# Only videos longer than 10 minutes (600 seconds) yt-dlp "ytsearch20:deep dive AI agents" \ --dump-json --flat-playlist --no-warnings 2>/dev/null \ | jq -s '[.[] | select(.duration >= 600)] | sort_by(-.view_count) | .[:10][]'
# Only videos from the last 30 days CUTOFF=$(date -v-30d +%Y%m%d 2>/dev/null || date -d "30 days ago" +%Y%m%d) yt-dlp "ytsearch20:claude code" \ --dump-json --flat-playlist --no-warnings 2>/dev/null \ | jq -s --arg cutoff "$CUTOFF" '[.[] | select(.upload_date >= $cutoff)] | sort_by(-.view_count) | .[]'
# Search within a specific channel yt-dlp "ytsearch10:skills site:youtube.com/c/ChannelName" \ --dump-json --flat-playlist --no-warnings 2>/dev/null
Or use the channel URL directly:
yt-dlp "https://www.youtube.com/@ChannelName/search?query=skills" \ --dump-json --flat-playlist --no-warnings 2>/dev/null
# Get just URLs for feeding into other tools (watch, notebooklm) yt-dlp "ytsearch10:claude code MCP" \ --dump-json --flat-playlist --no-warnings 2>/dev/null \ | jq -r '.url'
This skill produces URLs and me
Curated, production-grade skills, agents, hooks, rules, commands, utilities, and presets for AI coding agents. No magic, no demos — battle-tested workflows built for developers who use AI seriously.
**DEPRECATED** — Modern Claude models condense and summarize technical documentation natively with comparable quality. The output…
DEPRECATED: The Opus 4.7 migration scanner is retired from the active skill catalog. Retained for archival reference only; not…
**DEPRECATED** — Modern Claude models produce accurate, well-explained regex patterns with edge-case test suites natively,…
**DEPRECATED** — Opus 4.7 uses adaptive thinking (optional at each step) and Sonnet 4.6 handles structured chain-of-thought…
Generates Architecture Decision Records capturing context, rationale, alternatives, and consequences in numbered status-tracked…
Build AI agents and automate Claude Code programmatically via the Claude Agent SDK and headless CLI mode. Covers Python SDK,…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.