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.
How this skill is triggered — by the user, by Claude, or both
Slash command
/media-ingest:media-ingestThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
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.
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.
npx claudepluginhub adamlevoy/claude-plugins --plugin media-ingestPull a YouTube video transcript into a queryable markdown vault with yt-dlp subtitle discovery, VTT cleanup, metadata frontmatter, and capture-seed stubs.
Ingests YouTube video transcripts or channel uploads into the vault as queryable markdown files. Use for capturing talks, podcasts, or keynotes into the knowledge graph.
Processes raw meeting transcripts into structured Obsidian notes with YAML frontmatter, action items, summary, and formatted transcript. Useful for Granola transcripts or direct pastes.