# youtube-transcript
> Download YouTube video transcripts when user provides a YouTube URL or asks to download/get/fetch a transcript from YouTube. Also use when user wants to transcribe or get captions/subtitles from a YouTube video.
- Author: Hisham H. Shihab
- Repository: Hisham-Hussein/claude-forge
- Version: 20260126203931
- Stars: 0
- Forks: 0
- Last Updated: 2026-02-06
- Source: https://github.com/Hisham-Hussein/claude-forge
- Web: https://mule.run/skillshub/@@Hisham-Hussein/claude-forge~youtube-transcript:20260126203931
---
---
name: youtube-transcript
description: Download YouTube video transcripts when user provides a YouTube URL or asks to download/get/fetch a transcript from YouTube. Also use when user wants to transcribe or get captions/subtitles from a YouTube video.
allowed-tools: Bash,Read,Write
---
Download and convert YouTube video transcripts to clean, readable text files using yt-dlp.
Use this skill when the user:
- Provides a YouTube URL and wants the transcript
- Asks to "download transcript from YouTube"
- Wants to "get captions" or "get subtitles" from a video
- Asks to "transcribe a YouTube video"
- Needs text content from a YouTube video
1. Check yt-dlp installed: `which yt-dlp`
2. List available subtitles: `yt-dlp --list-subs "URL"`
3. Download subtitles: `yt-dlp --write-auto-sub --skip-download -o "transcript" "URL"`
4. Convert to plain text (see conversion script below)
- yt-dlp is installed or user instructed how to install
- Subtitles downloaded as .vtt file
- Converted to clean .txt file with video title as filename
- Duplicate lines removed from auto-generated captions
- User shown file location and preview
1. Check available subtitles first (--list-subs)
2. Try manual subtitles (--write-sub) - highest quality
3. Fallback to auto-generated (--write-auto-sub) - usually available
4. Last resort: Whisper transcription (requires user confirmation)
Manual subtitles (preferred):
```bash
yt-dlp --write-sub --skip-download --output "OUTPUT_NAME" "YOUTUBE_URL"
```
Auto-generated subtitles (fallback):
```bash
yt-dlp --write-auto-sub --skip-download --output "OUTPUT_NAME" "YOUTUBE_URL"
```
Get video title for filename:
```bash
yt-dlp --print "%(title)s" "YOUTUBE_URL"
```
YouTube auto-generated VTT files contain duplicate lines due to progressive caption display. Always deduplicate:
```bash
python3 -c "
import sys, re
seen = set()
with open('transcript.en.vtt', 'r') as f:
for line in f:
line = line.strip()
if line and not line.startswith('WEBVTT') and not line.startswith('Kind:') and not line.startswith('Language:') and '-->' not in line:
clean = re.sub('<[^>]*>', '', line)
clean = clean.replace('&', '&').replace('>', '>').replace('<', '<')
if clean and clean not in seen:
print(clean)
seen.add(clean)
" > transcript.txt
```
```bash
which yt-dlp || command -v yt-dlp
```
macOS (Homebrew):
```bash
brew install yt-dlp
```
Linux (apt):
```bash
sudo apt update && sudo apt install -y yt-dlp
```
Any system (pip):
```bash
pip3 install yt-dlp
```
If installation fails, direct user to: https://github.com/yt-dlp/yt-dlp#installation
```bash
VIDEO_URL="https://www.youtube.com/watch?v=VIDEO_ID"
# Get video title for filename
VIDEO_TITLE=$(yt-dlp --print "%(title)s" "$VIDEO_URL" | tr '/' '_' | tr ':' '-' | tr '?' '' | tr '"' '')
OUTPUT_NAME="transcript_temp"
# Check yt-dlp installed
if ! command -v yt-dlp &> /dev/null; then
echo "yt-dlp not found, attempting to install..."
if command -v brew &> /dev/null; then
brew install yt-dlp
elif command -v apt &> /dev/null; then
sudo apt update && sudo apt install -y yt-dlp
else
pip3 install yt-dlp
fi
fi
# Check available subtitles
echo "Checking available subtitles..."
yt-dlp --list-subs "$VIDEO_URL"
# Try manual subtitles first
echo "Attempting manual subtitles..."
if yt-dlp --write-sub --skip-download --output "$OUTPUT_NAME" "$VIDEO_URL" 2>/dev/null; then
echo "Manual subtitles downloaded!"
else
# Fallback to auto-generated
echo "Trying auto-generated subtitles..."
yt-dlp --write-auto-sub --skip-download --output "$OUTPUT_NAME" "$VIDEO_URL"
fi
# Convert to plain text with deduplication
VTT_FILE=$(ls ${OUTPUT_NAME}*.vtt 2>/dev/null | head -n 1)
if [ -f "$VTT_FILE" ]; then
python3 -c "
import sys, re
seen = set()
with open('$VTT_FILE', 'r') as f:
for line in f:
line = line.strip()
if line and not line.startswith('WEBVTT') and not line.startswith('Kind:') and not line.startswith('Language:') and '-->' not in line:
clean = re.sub('<[^>]*>', '', line)
clean = clean.replace('&', '&').replace('>', '>').replace('<', '<')
if clean and clean not in seen:
print(clean)
seen.add(clean)
" > "${VIDEO_TITLE}.txt"
rm "$VTT_FILE"
echo "Saved to: ${VIDEO_TITLE}.txt"
fi
```
Only use if no subtitles available. Requires user confirmation due to download size.
Check file size first:
```bash
yt-dlp --print "%(filesize,filesize_approx)s" -f "bestaudio" "YOUTUBE_URL"
```
Check Whisper installed:
```bash
command -v whisper
```
Install if needed:
```bash
pip3 install openai-whisper
```
Download and transcribe:
```bash
# Download audio
yt-dlp -x --audio-format mp3 --output "audio_%(id)s.%(ext)s" "YOUTUBE_URL"
# Transcribe (use base model for balance of speed/accuracy)
whisper audio_VIDEO_ID.mp3 --model base --output_format vtt
# Clean up audio after
rm audio_VIDEO_ID.mp3
```
Model options: tiny (~1GB), base (~1GB, recommended), small (~2GB), medium (~5GB), large (~10GB)
If --list-subs shows no subtitles:
1. Try both --write-sub and --write-auto-sub
2. If both fail, offer Whisper transcription with file size warning
3. Wait for user confirmation before downloading audio
- Verify URL format: https://www.youtube.com/watch?v=VIDEO_ID
- Video may be private, age-restricted, or geo-blocked
- Show specific error from yt-dlp to user
- May require system dependencies
- Try alternative install method (brew → apt → pip)
- Provide manual installation link as fallback
- Default downloads all available languages
- Specify language: `--sub-langs en` for English only
- List available with `--list-subs` first
- Always check available subtitles before download (--list-subs)
- Verify success at each step before proceeding
- Ask user before large downloads (audio files, Whisper models)
- Clean up temporary files (VTT after conversion, audio after transcription)
- Provide clear feedback about progress
- Use video title for meaningful filenames