Yoink videos off YouTube. Fast TUI + MCP server.
Project description
yoink
grab videos, fast
A no-nonsense YouTube downloader with a slick terminal UI and an MCP server so your AI assistant can yoink videos too.
pip install yoink-yt · uv run yoink · MCP Server · Docs
Three ways to yoinkTUI — Beautiful interactive terminal app. Paste a URL, pick a quality, hit download. Progress bars, speed stats, the works. MCP — Expose download tools to AI assistants like Claude. Let your AI yoink videos for you. CLI — Just a script. All three share the same core engine powered by yt-dlp. |
Highlights
|
⚡ Quick Start
# Install from PyPI
pip install yoink-yt
# Launch
yoink
Or install from source:
git clone https://github.com/JayshKhan/yoink.git
cd yoink && uv sync
uv run yoink
That's it. Paste a YouTube URL, pick your quality, download.
[!TIP] Install ffmpeg for best results — it's needed to merge separate video+audio streams into a single file.
brew install ffmpeg # macOS sudo apt install ffmpeg # Ubuntu/Debian
🎬 TUI Mode
uv run yoink # default: 3 concurrent downloads
uv run yoink -j 5 # or up to 10
|
Keyboard shortcuts
|
Download features
|
🤖 MCP Server
uv run yoink-mcp
Exposes 7 tools over STDIO for AI assistants:
| Tool | What it does |
|---|---|
get_video_info |
Fetch title, duration, formats |
get_playlist_info |
List all videos in a playlist |
get_formats |
Available qualities for a URL |
start_download |
Start downloading, get a tracking ID |
list_downloads |
See all downloads + progress |
get_download_progress |
Check on a specific download |
cancel_download |
Stop a download |
Claude Desktop configuration
Add to claude_desktop_config.json:
{
"mcpServers": {
"yoink": {
"command": "uv",
"args": ["--directory", "/path/to/yoink", "run", "yoink-mcp"]
}
}
}
Then just ask Claude: "Download this video in 720p: https://youtube.com/watch?v=..."
🛠 Architecture
src/yoink/
├── core/ # The engine room
│ ├── models.py # Pydantic models shared everywhere
│ ├── errors.py # Friendly error translation
│ ├── extractor.py # yt-dlp metadata extraction
│ ├── engine.py # Single download with progress hooks
│ └── manager.py # Concurrent download orchestration
├── mcp_server/ # AI-friendly tools
│ └── server.py # FastMCP with 7 tools
└── tui/ # The pretty terminal UI
├── app.py # Main Textual app
├── screens/ # Main screen, format picker modal
├── widgets/ # URL bar, video panel, playlist, queue
└── styles/ # Textual CSS
Key design decisions
- yt-dlp is synchronous → each download runs in its own thread via
ThreadPoolExecutor - FIFO dispatcher thread ensures downloads start in submission order
- Progress hooks are rate-limited to 100ms to keep the UI smooth
- Playlists use
extract_flatfor speed — no fetching full metadata for 500 videos upfront - Pydantic models everywhere = clean contracts between core / TUI / MCP
- Duplicate URL detection prevents double-downloading the same video
- Cancellation via
threading.Eventchecked in progress hooks
📦 Dependencies
| Package | Why |
|---|---|
| yt-dlp | The extraction & download engine |
| Textual | Terminal UI framework |
| Pydantic | Data models & validation |
| MCP SDK | AI tool server protocol |
Dev dependencies: pytest — install with uv sync --extra dev
🔧 Development
uv sync --extra dev # install with test deps
uv run pytest tests/ -v # run the test suite
uv run yoink # test the TUI
uv run yoink-mcp # test the MCP server
📄 License
MIT — do whatever you want with it. Yoink responsibly.
Project details
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 yoink_yt-0.1.0.tar.gz.
File metadata
- Download URL: yoink_yt-0.1.0.tar.gz
- Upload date:
- Size: 459.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ba890d48f224ac8edbc4a60d7705ce26acefaed754fbd4b97033d0fd5e174e38
|
|
| MD5 |
7657bf7876ff7200321fe3556fd05ea0
|
|
| BLAKE2b-256 |
28ac4cff2b04187f7487898ee1e324335736caaf81d8ada0c7ae47c017c2fe61
|
File details
Details for the file yoink_yt-0.1.0-py3-none-any.whl.
File metadata
- Download URL: yoink_yt-0.1.0-py3-none-any.whl
- Upload date:
- Size: 407.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b116f4808e549b288ac6bf70cdcd57115e5014acf78625e97f81412a0476eaeb
|
|
| MD5 |
9074efbefcebedf7e874233942e66744
|
|
| BLAKE2b-256 |
2a5894c8d51728919794dc7ec178dd5e7e3d9831af248ec1459853a301aaf11c
|