Download YouTube videos in up to 4K quality with automatic ad & sponsor removal.
A native macOS desktop app built with Tauri, powered by yt-dlp and ffmpeg.
|
|
|
|
Plus: trim/clip support, cookie authentication for age-restricted content, configurable bitrate encoding, searchable download history, one-click yt-dlp updates, real-time progress with speed & ETA, detailed activity logs, and keyboard shortcuts.
Clean, minimal interface — paste a URL and hit Analyze
Pick your quality, toggle SponsorBlock, enable subtitles or trim — then download
Fine-tune which sponsor segments to remove with 8 community-powered categories
More screenshots
Configure cookies, encoding, output directory, and advanced options
Full activity log with export capability for debugging
Built-in help with getting started guide, troubleshooting, and keyboard shortcuts
Grab the latest .dmg from the Releases page.
- Open the
.dmgfile - Drag Media Pull to your Applications folder
- On first launch, right-click the app and select Open (macOS Gatekeeper)
| Dependency | Details |
|---|---|
| macOS 11+ | Big Sur or later (Apple Silicon native) |
| yt-dlp | brew install yt-dlp or managed by the app |
| ffmpeg | brew install ffmpeg or bundled |
| Python 3.9+ | Included with macOS |
Media Pull uses a multi-stage pipeline for maximum quality:
Analyze → Download Video → Download Audio → Merge & Encode → SponsorBlock → Done
(yt-dlp) (yt-dlp) (ffmpeg/GPU) (optional)
- Analyze — fetches video metadata, available formats, chapters, and thumbnail
- Download — downloads separate video and audio streams at the highest available quality
- Encode — merges streams into a single MP4 using hardware-accelerated H.264 encoding
- SponsorBlock — queries the SponsorBlock API and removes matched segments via ffmpeg
- Chapters (optional) — splits the encoded file into individual chapter files using stream copy
Architecture
┌──────────────────────────────────────────────┐
│ Frontend (HTML/CSS/JS) │
│ index.html + src/main.js + components/ │
└──────────────┬───────────────────────────────┘
│ Tauri invoke() / listen()
┌──────────────▼───────────────────────────────┐
│ Rust Backend (Tauri v2) │
│ src-tauri/src/commands/*.rs │
│ IPC bridge, process management │
└──────────────┬───────────────────────────────┘
│ stdin/stdout JSON lines
┌──────────────▼───────────────────────────────┐
│ Python Modules │
│ python/download.py — download pipeline │
│ python/analyze.py — video/playlist info │
│ python/convert.py — ffmpeg encoding │
│ python/chapters.py — chapter splitting │
│ python/sponsorblock.py — segment removal │
│ python/cookies.py — browser cookie mgmt │
└──────────────────────────────────────────────┘
- Frontend — vanilla HTML/CSS/JS, no framework, no build step
- Rust — Tauri v2 shell, manages Python subprocesses, emits events to frontend
- Python — each module writes JSON lines to stdout, parsed by Rust in real-time
Building from Source
# Prerequisites
brew install yt-dlp ffmpeg node rust
# Clone
git clone https://github.com/bytePatrol/MediaPull.git
cd MediaPull
# Install JS dependencies
npm install
# Development (hot-reload)
npx tauri dev
# Production build
npm run tauri:buildThe built app will be at src-tauri/target/release/bundle/macos/Media Pull.app.
Configuration
Settings are stored in ~/.config/media-pull/:
| File | Purpose |
|---|---|
config.json |
Output directory and app config |
settings.json |
Cookies, SponsorBlock, encoding preferences |
history.json |
Download history |
MIT License. See LICENSE for details.