Modern, fast, and easy-to-use desktop app to download YouTube videos, playlists, or audio with best quality using yt-dlp and a sleek customtkinter UI. Supports up to 8K/4320p, merges best video+audio, embeds metadata and thumbnails, and optionally downloads subtitles.
yt-dlp (bestvideo+bestaudio, or limit by resolution)%(uploader)s - %(title)s.%(ext)s into your chosen foldercustomtkinter styling and scrollable layoutyt-dlpcustomtkinterPillowInstall Python dependencies:
pip install yt-dlp customtkinter Pillow
Install FFmpeg:
bin to PATH (e.g., ffmpeg.exe available in PATH). A popular source is https://www.gyan.dev/ffmpeg/builds/.brew install ffmpegsudo apt update && sudo apt install ffmpegVerify FFmpeg:
ffmpeg -version
python main.py
Downloads default to your ~/Downloads/YouTube folder unless you change it.
Video (MP4) merges best video+audio; Audio (MP3) extracts audio.best or a specific cap like 1080p, 720p, etc.Download Playlists (if detected)Download Subtitles (English + Auto-generated)Download & Embed Thumbnails (for metadata)Progress shows overall status across multiple URLs with percent, speed, and ETA. Post-processing (muxing, metadata, thumbnails, audio extract) is handled by FFmpeg via yt-dlp postprocessors.
This repo includes a PyInstaller spec (main.spec). You can build a Windows .exe locally.
Basic build command:
pyinstaller --noconfirm --clean main.spec
Outputs:
dist/main.exe: the packaged GUI applicationbuild/: intermediate build artifactsNotes:
console=False is configured for a windowed app.hiddenimports or datas in main.spec.Yt_Downloader/
├─ main.py # Application entrypoint (GUI)
├─ main.spec # PyInstaller build spec
├─ dist/ # Built artifacts (e.g., main.exe)
└─ build/ # PyInstaller build cache
ffmpeg is in PATH. Reopen terminal after changes.yt-dlp supports cookies; integrating cookie support would require extending main.py with cookiefile options.en). Auto-generated enabled when selected; not all videos have them.Logs shown in the UI include percent, speed, and ETA. Errors for individual URLs display as message boxes while the app continues with the next item.
customtkinter in YouTubeDownloader class inside main.py.yt_dlp config:
format = bestvideo+bestaudio/best or capped by selected heightFFmpegExtractAudio to MP3 (192 kbps)FFmpegMetadata, and EmbedThumbnail if enableden), normal + auto-generated if enabledThis tool downloads content from YouTube. Ensure you have the rights to download and use the content. Respect YouTube’s Terms of Service and local laws.
Add your preferred license here (e.g., MIT). If omitted, the project is proprietary by default.
yt-dlp and FFmpegcustomtkinter and Pillow