Live
Snatch
About Snatch
YT-DLP GUI
A tkinter-based graphical frontend for yt-dlp, built for Linux desktops.
Four tabs in one window: download videos, search YouTube with embedded playback, inspect local media files, and browse download history. Three themes (Dark, Nord, Monokai, YouTube), drag-and-drop URL support, optional embedded mpv player, browser cookie import, and yt-dlp self-update from the GUI.
Features
- Download tab — paste a URL (or drag-and-drop), pick format/resolution, queue multiple downloads, watch live progress
- Search tab — search YouTube and preview results in an embedded mpv player before downloading
- Media Info tab — inspect any local video/audio file via
ffprobe(codec, bitrate, duration, streams) - History tab — browse and manage previous downloads (stored locally, max 200 entries)
- Browser cookie import — pull cookies from Firefox/Chrome for age-gated or member-only videos
- yt-dlp version check + update — one-click self-update via
pkexec - SponsorBlock + subtitle support — toggle per-download
- Speed limit + audio merging — configurable per session
Screenshots
(Add screenshots here — icon.png ships with the repo.)
Requirements
Required:
- Python 3.10+
- yt-dlp on
PATH - Tkinter (
python3-tkon Debian/Ubuntu, usually preinstalled on most distros)
Optional (auto-detected):
mpv— enables the embedded player in the Search tabffprobe— required for the Media Info tabtkinterdnd2— enables drag-and-drop URL support (pip install tkinterdnd2)Pillow— enables thumbnail rendering (pip install Pillow)zenity— nicer native file picker on GNOME/KDE
Install
git clone https://github.com/milnet01/ytdlp-gui.git
cd ytdlp-gui
# Optional extras:
pip install --user tkinterdnd2 Pillow
Run
python3 ytdlp_gui.py
or as a module:
python3 -m ytdlp_gui
Desktop launcher
YT-DLP.desktop is provided but its Exec= and Path= lines point at the original author's install location. Edit both lines to your actual checkout path, then drop it into ~/.local/share/applications/.
Configuration
Three files are created at runtime in the project root, all mode 0600:
| File | Purpose |
|---|---|
config.json |
UI preferences (save path, default format, theme, window geometry) |
history.json |
Download history (max 200 entries) |
cookies.txt |
Browser-exported cookies (when used) |
These are git-ignored and never uploaded.
Architecture
The main YTDLPGui class in ytdlp_gui/app.py is composed of seven mixins (one per concern: each tab, the player, version checks, the download engine). All blocking work runs in daemon threads and posts back to the Tk event loop via root.after(0, ...).
See STANDARDS.md for the full architecture, mixin contracts, theme system, security rules, and coding conventions.
Security notes
- All subprocess calls use argument lists with a
--separator before URLs (no shell, no command injection surface). - URLs are validated as
http/httpsonly before being passed toyt-dlp. - Network fetches (thumbnails, update check) are HTTPS-only.
- The mpv IPC socket lives in a directory whose ownership is checked before connecting.
- User data files are written with
0600permissions.
License
MIT © 2026 milnet01