yt-transcripts 🎼
A Python CLI tool for extracting transcripts from YouTube videos, playlists, and channels.
Installation
pip install -e .
Or install dependencies directly:
pip install youtube-transcript-api yt-dlp
With AI Summarization
To enable AI-powered summarization:
pip install -e ".[summarize]"
Usage
yt-transcripts [OPTIONS] SOURCE...
Sources
The tool accepts multiple source types:
- Video URL:
https://www.youtube.com/watch?v=VIDEO_ID - Video ID:
dQw4w9WgXcQ - Channel URL:
https://www.youtube.com/@ChannelName - Playlist URL:
https://www.youtube.com/playlist?list=PLAYLIST_ID
Options
| Option | Description |
|---|---|
-f, --format |
Output format: text, json, srt, vtt (default: text) |
-l, --language |
Preferred language code(s), can be specified multiple times (default: en) |
-o, --output |
Output file or directory (default: stdout) |
--max-videos |
Maximum number of videos to process from channel/playlist |
--list-only |
Only list videos without extracting transcripts |
-v, --verbose |
Verbose output |
-h, --help |
Show help message |
-s, --summarize |
Summarize transcripts using AI |
--model |
LiteLLM model string (default: ollama/llama3.2) |
--api-key |
API key for cloud providers |
--ollama-host |
Ollama server URL (default: http://localhost:11434) |
Examples
Single Video
# By URL
yt-transcripts "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
# By video ID
yt-transcripts dQw4w9WgXcQ
Multiple Videos
yt-transcripts VIDEO_ID1 VIDEO_ID2 VIDEO_ID3
Output Formats
# Plain text (default)
yt-transcripts VIDEO_ID -f text
# JSON with timestamps and metadata
yt-transcripts VIDEO_ID -f json
# SRT subtitles
yt-transcripts VIDEO_ID -f srt
# WebVTT subtitles
yt-transcripts VIDEO_ID -f vtt
Save to File
# Single file
yt-transcripts VIDEO_ID -o transcript.txt
# Multiple videos to separate files in a directory
yt-transcripts VIDEO_ID1 VIDEO_ID2 -o ./transcripts/
Channels
# List all videos from a channel
yt-transcripts "https://www.youtube.com/@anthropic-ai" --list-only
# Extract transcripts from first 10 videos
yt-transcripts "https://www.youtube.com/@anthropic-ai" --max-videos 10
# Save channel transcripts to directory as JSON
yt-transcripts "https://www.youtube.com/@anthropic-ai" --max-videos 5 -f json -o ./transcripts/
Playlists
# List videos in a playlist
yt-transcripts "https://www.youtube.com/playlist?list=PLrAXtmErZgOeiKm4sgNOknGvNjby9efdf" --list-only
# Extract all transcripts from playlist
yt-transcripts "https://www.youtube.com/playlist?list=PLrAXtmErZgOeiKm4sgNOknGvNjby9efdf"
Language Selection
# Prefer Spanish, fall back to English
yt-transcripts VIDEO_ID -l es -l en
# Prefer French
yt-transcripts VIDEO_ID -l fr
AI Summarization
Summarize transcripts using LLMs. Supports Ollama (local), OpenAI, Anthropic, Gemini, and OpenRouter.
# Using local Ollama (default)
yt-transcripts -s VIDEO_ID
# Specify a model
yt-transcripts -s --model openai/gpt-4o-mini VIDEO_ID
# With API key
yt-transcripts -s --model anthropic/claude-sonnet-4-20250514 --api-key sk-ant-... VIDEO_ID
# Summarize multiple videos to a directory
yt-transcripts -s -o ./summaries/ VIDEO_ID1 VIDEO_ID2
# Summarize a playlist
yt-transcripts -s --max-videos 5 "https://www.youtube.com/playlist?list=PLAYLIST_ID"
Environment Variables
| Variable | Description | Default |
|---|---|---|
YT_SUMMARIZE_MODEL |
Default LiteLLM model | ollama/llama3.2 |
OLLAMA_HOST |
Ollama server URL | http://localhost:11434 |
OPENAI_API_KEY |
OpenAI API key | - |
ANTHROPIC_API_KEY |
Anthropic API key | - |
GEMINI_API_KEY |
Google Gemini API key | - |
OPENROUTER_API_KEY |
OpenRouter API key | - |
You can also use a .env file in your project directory.
Supported Models
- Ollama (local):
ollama/llama3.2,ollama/mistral, etc. - OpenAI:
openai/gpt-4o,openai/gpt-4o-mini - Anthropic:
anthropic/claude-sonnet-4-20250514,anthropic/claude-haiku - Gemini:
gemini/gemini-1.5-flash,gemini/gemini-1.5-pro - OpenRouter:
openrouter/meta-llama/llama-3-8b-instruct
Output Formats
Text
Plain text with all segments joined together:
We're no strangers to love You know the rules and so do I...
JSON
Structured data with metadata and timestamps:
{
"video_id": "dQw4w9WgXcQ",
"language": "en",
"is_generated": false,
"segments": [
{
"text": "We're no strangers to love",
"start": 18.64,
"duration": 3.24
}
]
}
SRT
Standard subtitle format:
1
00:00:18,640 --> 00:00:21,880
We're no strangers to love
2
00:00:22,640 --> 00:00:26,960
You know the rules and so do I
VTT
WebVTT subtitle format:
WEBVTT
00:00:18.640 --> 00:00:21.880
We're no strangers to love
00:00:22.640 --> 00:00:26.960
You know the rules and so do I
Error Handling
The tool gracefully handles common errors:
- Transcripts disabled: Reports when a video has transcripts turned off
- Video unavailable: Reports when a video is private or deleted
- No transcript found: Reports when no transcript exists in the requested language
Errors are included in the output rather than stopping execution, so batch processing continues even if some videos fail.
Dependencies
Core:
- youtube-transcript-api - Transcript extraction
- yt-dlp - Channel and playlist video listing
Summarization (optional):
- litellm - Unified LLM interface
- python-dotenv - Environment file loading
License
MIT
Metadata
Release files for yt-transcripts 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| yt_transcripts-0.2.1.tar.gz | 10.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| yt_transcripts-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 22.0 kB
Release files / yt_transcripts-0.2.1.tar.gz
| Download URL | yt_transcripts-0.2.1.tar.gz |
|---|---|
| Size | 10.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b380176a97d4ed606f8caa68e3112a85e682a0c4051bed3068d1c8df4e9d4c40
|
|
BLAKE2b-256 checksum How to use checksums |
1b414c2f7872d4b5add186aa4db33a31ceeed7241f89f2890cbc7c23369217d3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 25, 2026.
Transparency logRelease files / yt_transcripts-0.2.1-py3-none-any.whl
| Download URL | yt_transcripts-0.2.1-py3-none-any.whl |
|---|---|
| Size | 11.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1006577a30fc5fb1f33d798cfc05c9c127fe7a0e0ef18319005413e0eaea4584
|
|
BLAKE2b-256 checksum How to use checksums |
7187bb97cf10f5a538a14b536e2a03ffdf407aaac60d08a154543a4db1c0573e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 25, 2026.
Transparency log