https://github.com/gabrielrovesti/grab
Personal music downloader made for desktop. Search, preview, download MP3s via a native desktop window. FastAPI + yt-dlp + pywebview.
https://github.com/gabrielrovesti/grab
fastapi python youtube-music yt-dlp
Last synced: about 2 months ago
JSON representation
Personal music downloader made for desktop. Search, preview, download MP3s via a native desktop window. FastAPI + yt-dlp + pywebview.
- Host: GitHub
- URL: https://github.com/gabrielrovesti/grab
- Owner: gabrielrovesti
- Created: 2026-05-01T20:21:51.000Z (about 2 months ago)
- Default Branch: main
- Last Pushed: 2026-05-02T06:54:14.000Z (about 2 months ago)
- Last Synced: 2026-05-03T21:35:27.573Z (about 2 months ago)
- Topics: fastapi, python, youtube-music, yt-dlp
- Language: Python
- Homepage:
- Size: 15.6 KB
- Stars: 1
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# ⬇ grab
A personal music downloader — search any song, pick a version, choose where to save it. Runs as a native desktop window.
Built with FastAPI + yt-dlp on the backend, pywebview for the native window, and a minimal dark HTML/JS frontend. No Electron, no browser tab, no cloud dependency.
---
## Features
- **Live search** via YouTube Music — autocomplete as you type
- **Real download progress** — 0–100% bar fed directly from yt-dlp, with a conversion phase indicator
- **Native save dialog** — choose exactly where each file lands
- **Per-track bitrate** — 128 / 192 / 256 / 320 kbps, selectable per song
- **Single command to run** — no build step, no config
---
## Stack
| Layer | Tech |
|---|---|
| Backend | FastAPI + yt-dlp + ytmusicapi |
| Audio extraction | ffmpeg via yt-dlp postprocessor |
| Desktop window | pywebview (Qt backend) |
| Frontend | Vanilla HTML/CSS/JS, IBM Plex Mono |
---
## Requirements
- Python 3.10+
- ffmpeg on PATH
```bash
# Windows (recommended)
winget install ffmpeg
# macOS
brew install ffmpeg
# Linux
apt install ffmpeg
```
---
## Installation
```bash
pip install fastapi uvicorn yt-dlp ytmusicapi PyQt6 PyQt6-WebEngine qtpy bottle proxy_tools
pip install pywebview --no-deps
```
---
## Usage
```bash
python run.py
```
Downloads are saved to the path you choose via the native dialog.
Default fallback: `~/Music/grab/`
---
## Project Structure
```
grab/
├── main.py # FastAPI app — search, suggest, download endpoints + embedded UI
└── run.py # pywebview launcher — spins up uvicorn and opens the desktop window
```
---
## Notes
- Personal use only. Downloading copyrighted content may violate YouTube's ToS.
- Tested on Windows 10/11 with Python 3.12 and PyQt6 6.11.
- The pywebview Qt backend is required on Windows — `pythonnet` (the default WinForms backend) does not support Python 3.13+.