YouTube Transcript Fetcher
🚀 Try Live Demo | ⭐ Star on GitHub | 💻 CLI Guide | 📖 Docs
A powerful tool to fetch YouTube video transcripts via Web UI or CLI, with intelligent proxy support to bypass rate limiting.
Features
- Web UI: Browser-based interface for fetching transcripts
- CLI: Command-line interface for automation and scripting
- Smart Proxy Support: Automatic proxy configuration to bypass YouTube rate limiting
- Multiple Languages: Fetch transcripts in different languages
- Multiple Formats: Output as plain text or JSON
- Smart Caching: Database-backed caching to avoid redundant API calls
Quick Start 🚀
Option 1: Web UI (Easiest - No Installation) 🌐
Works instantly in your browser - no installation required!
Perfect for: Quick transcripts, testing, non-technical users
Option 2: CLI (Install Locally) 💻
Fetch transcripts from the command line:
# Install from source
git clone https://github.com/nilukush/youtube-transcript.git
cd youtube-transcript
pip install -e .
# Fetch transcript
ytt fetch "https://youtu.be/dQw4w9WgXcQ"
Coming soon to PyPI: pip install youtube-transcript-tools
Perfect for: Automation, scripting, power users
Option 3: Self-Hosted (Deploy Yourself) 🔧
Deploy your own instance:
Perfect for: Production use, custom configuration, full control
Features
CLI
# Fetch transcript by URL
ytt fetch "https://youtu.be/dQw4w9WgXcQ"
# Fetch by video ID
ytt fetch dQw4w9WgXcQ
# Save to file
ytt fetch dQw4w9WgXcQ -o transcript.txt
# Output as JSON
ytt fetch dQw4w9WgXcQ --json
Installation
From PyPI (Coming Soon)
pip install youtube-transcript-tools
From Source
git clone https://github.com/nilukush/youtube-transcript.git
cd youtube-transcript
pip install -e .
Development Installation
pip install -e ".[dev]"
Usage
Web UI
The Web UI provides the simplest way to fetch transcripts:
Starting the server:
uvicorn youtube_transcript.api.app:create_app --reload --host localhost --port 8888
Then open http://localhost:8888 in your browser.
Supported URL formats:
https://youtu.be/dQw4w9WgXcQ(shortened)https://www.youtube.com/watch?v=dQw4w9WgXcQ(full URL)dQw4w9WgXcQ(video ID only)
CLI
The CLI uses a fetch command to retrieve transcripts.
Basic usage:
ytt fetch "https://youtu.be/dQw4w4wWgXcQ"
Advanced options:
# Language preference
ytt fetch dQw4w9WgXcQ --lang en
# Multiple languages
ytt fetch dQw4w9WgXcQ --lang en,es,fr
# Save to file
ytt fetch dQw4w9WgXcQ -o transcript.txt
# JSON output
ytt fetch dQw4w9WgXcQ --json
# Verbose mode
ytt fetch dQw4w9WgXcQ --verbose
All options:
Usage: ytt fetch [OPTIONS] URL_OR_ID
Options:
--lang, -l TEXT Preferred language codes (comma-separated)
--output, -o TEXT Output file path
--json Output in JSON format
--verbose Show detailed information
--help, -h Show this message
Troubleshooting
"No such command" Error
Wrong:
ytt "https://youtu.be/dQw4w9WgXcQ"
Correct:
ytt fetch "https://youtu.be/dQw4w9WgXcQ"
"Transcript Not Found" Error
This means:
- The video doesn't have captions/subtitles enabled
- The transcript is disabled by the uploader
- The video ID is incorrect
Verification: Check if the video has captions on YouTube:
- Open the video on YouTube
- Click the "..." (more) button
- Look for "Show transcript" option
Rate Limiting (HTTP 429)
If you experience rate limiting:
- The application automatically uses proxy configuration (if set by the service provider)
- Try again later - rate limits reset over time
- Some videos may have stricter rate limits than others
CLI Not Found
If ytt command is not found:
# Reinstall the package
pip install -e .
# Or use Python module directly
python -m youtube_transcript.cli fetch "https://youtu.be/dQw4w9WgXcQ"
Development
Running Tests
# Run all tests
pytest
# Run with coverage
pytest --cov=src/youtube_transcript --cov-report=html
# Run specific test file
pytest tests/test_fetcher.py -v
Code Quality
# Format code
black src/ tests/
# Lint code
ruff check src/ tests/
# Type check
mypy src/
Project Structure
youtube-transcript/
├── src/youtube_transcript/
│ ├── api/ # FastAPI endpoints and web routes
│ ├── cache/ # Redis caching layer
│ ├── config/ # Configuration management
│ ├── models/ # SQLModel database models
│ ├── repository/ # Database repository layer
│ ├── services/ # Business logic (fetcher, orchestrator)
│ ├── static/ # CSS and static assets
│ ├── templates/ # Jinja2 HTML templates
│ ├── utils/ # URL parsing utilities
│ └── cli.py # CLI entry point
├── tests/ # Pytest tests
└── pyproject.toml # Project configuration
API Endpoints
The web server exposes the following endpoints:
GET /- Web UI homepageGET /transcript?url=URL- Fetch transcript via GETGET /transcript/{video_id}- Fetch transcript by video IDGET /htmx/transcript?url=URL- HTMX endpoint for dynamic updatesGET /docs- Interactive API documentation (FastAPI auto-docs)
Performance
| Metric | Target | Status |
|---|---|---|
| Cached Response | p95 < 500ms | ✅ Met |
| Uncached Response | p95 < 10s | ✅ Met |
| Test Coverage | > 80% | ✅ Met (100%) |
| URL Parse Success | > 99.5% | ✅ Met |
Contributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Write tests for your changes
- Ensure all tests pass
- Submit a pull request
For Application Owners
If you're deploying this application as a service, see DEPLOYMENT.md for:
- Proxy configuration
- Environment variables
- Production deployment
- Scaling considerations
License
MIT License - see LICENSE file for details.
Acknowledgments
- youtube-transcript-api - Core transcript fetching library
- FastAPI - Modern web framework
- Typer - CLI framework
Support
- Issues: GitHub Issues
- Deployment Guide: DEPLOYMENT.md
Metadata
Release files for youtube-transcript-tools 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| youtube_transcript_tools-0.1.0.tar.gz | 187.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| youtube_transcript_tools-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 225.9 kB
Release files / youtube_transcript_tools-0.1.0.tar.gz
| Download URL | youtube_transcript_tools-0.1.0.tar.gz |
|---|---|
| Size | 187.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
21b7ff1c7351c04547894fcd9ecf5cb602db0b1ff7a1d1f0d6928ffeb243da94
|
|
BLAKE2b-256 checksum How to use checksums |
76a3092cfee25cc79d8be1798990ce090ae48a57070b277e82cdd0e4744fe8fb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.2
|
Release files / youtube_transcript_tools-0.1.0-py3-none-any.whl
| Download URL | youtube_transcript_tools-0.1.0-py3-none-any.whl |
|---|---|
| Size | 38.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
10160cc67bb48e367cd03cbc1b9e82e490adf2abe39a4a27960b7932358b9466
|
|
BLAKE2b-256 checksum How to use checksums |
d02b0da85411f9f1bc9ede49a410e3fc79c48b5aa40d40674295d6e614e85448
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.2
|