Download YouTube video transcripts as Markdown files — from a single video, a playlist, or an entire channel. Use the desktop GUI, the command line, or the built-in channel watcher that polls your favourite channels for new videos.
- Whole channels, playlists, or single videos — paste any YouTube URL (or a bare video ID) and it works out what to fetch
- Markdown output — each video becomes a tidy
.mdfile with title, channel, date, and the full transcript - Skip existing videos — re-run against the same channel and only new videos are downloaded
- Rate-limit friendly — configurable delay between requests (default 61 seconds) with a countdown timer in the GUI
- Channel watcher — poll a list of channels on a schedule and download anything new automatically
- URL history — the GUI remembers your recently used URLs in a dropdown
- Cross-platform — Windows and macOS builds, or run from source anywhere Python runs
Download the latest build for your platform from the releases page and run it — no Python required.
Requires Python 3.10+.
git clone https://github.com/waynegeorge/YouTube-transcript-downloader.git
cd YouTube-transcript-downloader
pip install -e .Run the packaged executable, or from source:
pythonw "YouTube Transcript Downloader.pyw"Paste a channel, playlist, or video URL, choose an output directory, and press Start. The progress bar shows how far through the list you are, with a countdown to the next request.
yt-transcript-dl <url> [options]| Option | Description |
|---|---|
--output, -o |
Output directory (default: ./output) |
--language, -l |
Preferred transcript language (default: en) |
--limit |
Maximum number of videos to process |
--start |
Start from the Nth video in the list (1-indexed) |
--sleep |
Delay in seconds between requests (default: 61) |
--skip-existing |
Skip videos that already have a transcript file |
--log-file |
Write log output to a file as well as the console |
--verbose, -v |
Enable debug logging |
Examples:
# Download every transcript from a channel, skipping ones you already have
yt-transcript-dl https://www.youtube.com/@SomeChannel --skip-existing
# Grab the 50 most recent videos from a playlist
yt-transcript-dl "https://www.youtube.com/playlist?list=PL..." --limit 50
# A single video
yt-transcript-dl https://www.youtube.com/watch?v=dQw4w9WgXcQThe watcher polls a list of channels on a schedule and downloads transcripts for any new videos. Channels are configured in a channels.yaml file in the project root:
channels:
- handle: "@SomeChannel"
folder: "Some Channel" # subfolder under output/
summary: "Some-Channel-Summary.md"
enabled: true
poll_interval_minutes: 120
sleep_between_downloads: 61
language: "en"Then run:
# Poll all channels once and exit
yt-transcript-watch --once
# Keep polling on the configured interval
yt-transcript-watchSee WATCHER.md for the full watcher documentation, including the watch.bat / watch.sh launchers.
Standalone executables are built with PyInstaller using the included spec files, and releases are produced by the GitHub Actions workflow in .github/workflows/release.yml. See DISTRIBUTION.md for packaging and code-signing details.
pip install -e ".[dev]"
pytest