A CLI tool for downloading videos from YT playlists and channels
Project description
YouTube Grabber
A Python CLI tool for managing and downloading YouTube videos from playlists and channels with automatic progress tracking and synchronization.
Features
- Extract videos from YouTube playlists and channels
- Sync playlists with their source to track new and removed videos
- Download videos at configurable quality (720p or 1080p)
- Automatic progress tracking - marks downloaded, added, and removed videos
- Smart resume - skips already downloaded videos
- Playlist headers - stores metadata about source, title, and extraction time
- Random delays between downloads to avoid rate limiting
- Colorized logging with detailed progress information
Installation
# Clone or navigate to the project directory
cd yt-grabber
# Install dependencies using uv
uv sync
Commands
Extract Playlist
Extract video URLs from a YouTube playlist:
uv run yt-grabber extract-playlist <playlist_url> <output_file>
Examples:
# Using full URL
uv run yt-grabber extract-playlist "https://www.youtube.com/playlist?list=PLTj8zGbtGsjHQWtKYupS1CdZzrbbYKkoz" my_playlist.txt
# Using playlist ID only
uv run yt-grabber extract-playlist PLTj8zGbtGsjHQWtKYupS1CdZzrbbYKkoz my_playlist.txt
Extract Channel
Extract video URLs from a YouTube channel (regular videos only, oldest first):
uv run yt-grabber extract-channel <channel_url> <output_file>
Examples:
# Using channel handle
uv run yt-grabber extract-channel @ChannelName channel_videos.txt
# Using full URL
uv run yt-grabber extract-channel "https://www.youtube.com/@ChannelName" channel_videos.txt
# Using channel ID
uv run yt-grabber extract-channel UCxxxxxxxxxxxxxxxxxx channel_videos.txt
Sync Playlist
Synchronize a playlist file with its source to detect new and removed videos:
uv run yt-grabber sync <playlist_file>
Example:
uv run yt-grabber sync my_playlist.txt
What it does:
- Fetches current videos from the source URL (stored in the playlist header)
- Compares with the existing playlist
- Marks new videos with
A(added) - Marks removed videos with
D(deleted) - Updates playlist header metadata (timestamp, count, title)
- Shows a diff summary of what changed
Download
Download videos from a playlist file:
uv run yt-grabber download <playlist_file>
Example:
uv run yt-grabber download my_playlist.txt
What it does:
- Reads undownloaded and non-removed videos from the playlist
- Downloads each video at configured quality
- Marks successful downloads with
# - Creates a metadata CSV file with download information
- Stops on any error
Download Batch
Download videos from multiple playlist files in a directory:
uv run yt-grabber download-batch [directory] [--pattern PATTERN] [--sort {asc,desc}]
Arguments:
directory- Directory containing playlist files (default: current directory.)--pattern/-p- Glob pattern for filtering files (default:*.txt)--sort/-s- Sort order:asc(ascending, default) ordesc(descending)
Examples:
# Download all .txt playlists in current directory (ascending order)
uv run yt-grabber download-batch
# Download all playlists in 'playlists' directory
uv run yt-grabber download-batch playlists/
# Download only playlists matching pattern
uv run yt-grabber download-batch playlists/ --pattern "gmm*.txt"
# Download season playlists in descending order
uv run yt-grabber download-batch . --pattern "season*.txt" --sort desc
What it does:
- Finds all playlist files matching the pattern
- Sorts files alphabetically (ascending or descending)
- Processes each playlist in order
- Sends Telegram notification when starting each playlist (if enabled)
- Stops immediately if any playlist fails
- Sends summary notification when all complete
Use cases:
- Download entire TV show seasons:
season_01.txt,season_02.txt, etc. - Process multiple music playlists:
gmm_s27.txt,gmm_s28.txt, etc. - Batch process all playlists in a directory
Configuration
Create a .env file in the project root:
cp .env.example .env
Available settings:
| Variable | Description | Default |
|---|---|---|
VIDEO_QUALITY |
Video quality: 720 or 1080 |
1080 |
MIN_DELAY |
Minimum delay between downloads (seconds) | 1 |
MAX_DELAY |
Maximum delay between downloads (seconds) | 5 |
INDEX_VIDEOS |
Add numeric prefix to filenames | false |
RETRY_ATTEMPTS |
Number of retry attempts per video | 1 |
RETRY_DELAY |
Delay before retry (seconds) | 300 |
TELEGRAM_NOTIFICATIONS_ENABLED |
Enable Telegram notifications | false |
TELEGRAM_BOT_TOKEN |
Telegram bot token from @BotFather | - |
TELEGRAM_CHAT_ID |
Your Telegram chat ID | - |
Playlist File Format
Header Section (Optional)
Playlists extracted with extract-playlist or extract-channel contain a header:
: Source URL: https://www.youtube.com/playlist?list=PLxxxxx
: Extraction Timestamp: 2026-01-18T14:00:00.000000
: Total Videos: 50
: Source Type: playlist
: Title: My Awesome Playlist
: Extractor Version: 0.1.0
:
Video URLs with Markers
Videos can have status markers (space-separated):
https://www.youtube.com/watch?v=VIDEO_ID_1
A https://www.youtube.com/watch?v=VIDEO_ID_2
D https://www.youtube.com/watch?v=VIDEO_ID_3
# https://www.youtube.com/watch?v=VIDEO_ID_4
A # https://www.youtube.com/watch?v=VIDEO_ID_5
D # https://www.youtube.com/watch?v=VIDEO_ID_6
Markers:
#- DownloadedA- Added (new video detected during sync)D- Deleted (removed from source during sync)A #- Added and downloadedD #- Deleted but was previously downloaded
Behavior:
- Lines starting with
:are header metadata (skipped during download) - Videos with
Dmarker are skipped during download - Videos with
#marker are skipped during download - Only unmarked or
A-only videos will be downloaded
Typical Workflow
1. Extract a Playlist
uv run yt-grabber extract-playlist PLxxxxxxxxxx my_music.txt
Creates my_music.txt with header and all video URLs.
2. Download Videos
uv run yt-grabber download my_music.txt
Downloads all videos and marks them with #.
3. Sync to Check for Updates
uv run yt-grabber sync my_music.txt
Checks the source playlist and:
- Marks new videos with
A - Marks removed videos with
D - Shows a summary of changes
4. Download New Videos
uv run yt-grabber download my_music.txt
Downloads only the newly added videos (marked with A).
Output
Download Location
Videos are saved to: download/{playlist_filename}/
For example, if playlist file is my_music.txt, videos go to: download/my_music/
Metadata
A metadata.csv file is created in the download directory with:
url,filename,timestamp
https://www.youtube.com/watch?v=xxxxx,01 Video Title.mp4,2026-01-18T14:30:00
Requirements
- Python 3.12+
- uv package manager
- Dependencies:
- yt-dlp (video extraction and download)
- typer (CLI framework)
- pydantic-settings (configuration)
- loguru (logging)
Error Handling
The program stops immediately if:
- A video fails to download
- The playlist file is not found
- Playlist has no header (for sync command)
- Source URL cannot be accessed
- Any unexpected error occurs
This ensures data integrity and prevents partial operations.
Telegram Notifications
Get notified when downloads complete or fail.
Setup
-
Create a Telegram Bot:
- Message @BotFather on Telegram
- Send
/newbotand follow instructions - Save the bot token (looks like
1234567890:ABCdefGHIjklMNOpqrsTUVwxyz)
-
Get Your Chat ID:
- Message @userinfobot or @getmyid_bot
- It will reply with your chat ID (a number like
123456789)
-
Start a Chat with Your Bot:
- Find your bot in Telegram search
- Press "Start" button
-
Configure:
TELEGRAM_NOTIFICATIONS_ENABLED=true TELEGRAM_BOT_TOKEN=1234567890:ABCdefGHIjklMNOpqrsTUVwxyz TELEGRAM_CHAT_ID=123456789
Notification Examples
Success:
✅ Download Complete
Playlist: my_music
Videos downloaded: 15
Error:
❌ Download Failed
Playlist: my_music
Error: HTTP Error 403: Forbidden
Tips
- Use
extract-channelfor channels to get oldest videos first - Run
syncperiodically to track playlist changes - Videos marked with
Dare kept in the file for history - The
#marker is preserved across syncs - Once a video is downloaded (
#), theAmarker is cleared
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file yt_grabber-0.2.0.tar.gz.
File metadata
- Download URL: yt_grabber-0.2.0.tar.gz
- Upload date:
- Size: 32.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
58dea8ea74a9575f5b8c9a0909f6e0dab94570801421261825b494015915ad51
|
|
| MD5 |
3d8ad058a179de6c4e02fea72f833a72
|
|
| BLAKE2b-256 |
fe7d5db7fec0dce336325b5062fdf8a4760ad5bb3a6df729e342df1b2bd7506e
|
File details
Details for the file yt_grabber-0.2.0-py3-none-any.whl.
File metadata
- Download URL: yt_grabber-0.2.0-py3-none-any.whl
- Upload date:
- Size: 22.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
83133b7ea54ac45a21fa7d0b7189ac73bb8b849c8b6e49088c3660e080e1140a
|
|
| MD5 |
fd1b7cd7397ab557fdd8f211f98564a9
|
|
| BLAKE2b-256 |
070fa264f38defbf8697ea2d426c5a7475447ed2b47e72621aed30ca0f020af7
|