From media-ingest
Ingest YouTube videos, podcast episodes, and Granola meeting transcripts as markdown notes. USE WHEN user asks to: ingest/save/transcribe a YouTube video, ingest/save/transcribe a podcast episode, pull a transcript, convert media to markdown, sync Granola meetings, or export meeting notes. Triggers on YouTube URLs, Apple Podcasts URLs, RSS feed URLs, Granola mentions, or mentions of ingesting/transcribing media content.
npx claudepluginhub adamlevoy/claude-plugins --plugin media-ingestThis skill uses the workspace's default tool permissions.
Convert YouTube videos and podcast episodes into markdown notes with YAML frontmatter and full transcripts. Output directory is configurable via the `--folder` and vault path arguments.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Analyzes BMad project state from catalog CSV, configs, artifacts, and query to recommend next skills or answer questions. Useful for help requests, 'what next', or starting BMad.
Convert YouTube videos and podcast episodes into markdown notes with YAML frontmatter and full transcripts. Output directory is configurable via the --folder and vault path arguments.
Default vault path: /Users/adam/Documents/Obsidian Vault
Run scripts/ingest_youtube.py:
python3 ~/.claude/skills/media-ingest/scripts/ingest_youtube.py "<youtube_url>" "/Users/adam/Documents/Obsidian Vault" --folder YouTube
yt-dlp (title, channel, date, duration, chapters, tags)youtube-transcript-api, falls back to yt-dlp subtitles<vault>/YouTube/<video-title>.mdRun scripts/ingest_podcast.py:
# Latest episode from Apple Podcasts URL
python3 ~/.claude/skills/media-ingest/scripts/ingest_podcast.py "https://podcasts.apple.com/us/podcast/<name>/id<id>" "/Users/adam/Documents/Obsidian Vault"
# List episodes first
python3 ~/.claude/skills/media-ingest/scripts/ingest_podcast.py "<url>" "/Users/adam/Documents/Obsidian Vault" --list
# Specific episode by number (1=latest)
python3 ~/.claude/skills/media-ingest/scripts/ingest_podcast.py "<url>" "/Users/adam/Documents/Obsidian Vault" --episode 3
# Search by title
python3 ~/.claude/skills/media-ingest/scripts/ingest_podcast.py "<url>" "/Users/adam/Documents/Obsidian Vault" --search "keyword"
# Skip transcription (metadata only, fast)
python3 ~/.claude/skills/media-ingest/scripts/ingest_podcast.py "<url>" "/Users/adam/Documents/Obsidian Vault" --skip-transcribe
small model by default)<vault>/Podcasts/<Show Name>/<Episode Title>.md--model tiny for faster transcription, --model medium for higher accuracysmall modelReads the local Granola cache (~/Library/Application Support/Granola/cache-v4.json) directly — no API needed.
# Export all meetings
python3 ~/.claude/skills/media-ingest/scripts/ingest_granola.py --vault "/Users/adam/Documents/Obsidian Vault"
# List meetings (last 30 days)
python3 ~/.claude/skills/media-ingest/scripts/ingest_granola.py --list --days 30
# Only meetings with transcripts
python3 ~/.claude/skills/media-ingest/scripts/ingest_granola.py --vault "/Users/adam/Documents/Obsidian Vault" --transcripts
<vault>/Granola-Meetings/<date>-<title>.mdmeetingspython3 ~/.claude/skills/media-ingest/scripts/check_deps.py
Required: yt-dlp, youtube-transcript-api, feedparser
Required for podcasts: openai-whisper
pip3 install youtube-transcript-api feedparser openai-whisper
Both scripts produce notes with YAML frontmatter containing: title, date, ingested, duration, type (youtube|podcast), url, and source-specific fields (channel for YouTube, show/author for podcasts). The body contains a description/summary section and the full transcript.