Přeskočit na obsah
Projekt032026 –

Universal Downloader

Lokální music library, downloader a přehrávač

Lokální web aplikace, která stáhne hudbu z většiny streamovacích služeb, uloží ji jako proper MP3 a slouží i jako přehrávač s cross-device sync. Pro vlastní použití, kód otevřený, bez deploye.

Universal Downloader — library view v dark mode na laptopu, soft directional light
Jak vznikl

Vznikl u kamaráda doma během mixování. Vybíral tracky pro nový mix a každý si musel stahovat zvlášť, jeden po druhém. Padla otázka, jestli by tohle nešlo udělat batch: paste celý playlist a stáhne se všechno najednou. Druhý den jsem začal psát první verzi.

Začalo to jako wrapper kolem yt-dlp. Pak mě zaujalo, že když už mám tracky lokálně s embedded tagy, mohli by se rovnou přehrávat. Přibyl player. Pak playlisty, fronta, shuffle, synced lyrics. Nakonec sync přes Firestore, aby šlo na novém zařízení jedním klikem stáhnout celou knihovnu z předchozího. Audio přitom nikdy neopouští stroj, cloud drží jen metadata.

Co to umí

Paste URL z Spotify, SoundCloudu nebo YouTube (track, album nebo playlist). Spotify používá embed page scraping (žádný API key, žádný DRM circumvent), audio se routuje přes yt-dlp z YouTube searche. Všechno se konvertuje na MP3 320 CBR s embedded ID3 tagy a thumbnail artwork.

Vedle stahování je to plnohodnotná knihovna a přehrávač: grid s artwork, sort/search/tag filter, playlisty, fronta, shuffle, repeat, synced lyrics z LRCLib, Media Session API integrace (hardware buttony, system overlay). Volitelný cross-device sync přes Firebase přidává mezi-zařízenou viditelnost knihovny. Bez Firebase appka funguje stejně, jen lokálně.

Architektura

Backend a frontend běží jako jeden `npm run dev`: Vite na :1420, Hono na :8787, Vite proxiuje `/api/*` přes Hono. yt-dlp a ffmpeg se auto-stáhnou do `./bin/` při prvním spuštění.

Browser :1420 ──► Vite dev server ──/api/*──► Hono on :8787
                     │                            │
                     └── src/ (React)             ├── ./bin/yt-dlp.exe + ffmpeg.exe
                                                  ├── ./data/library.db (SQLite)
                                                  └── ~/Music/universal-downloader/
Proč to není veřejné

Kód je open source, ale public instance (služba, která stahuje média za jiné lidi) je jiná legal kategorie a tenhle repo na to není designovaný. Lokální použití pro vlastní potřebu sedí ve stejné šedé zóně, ve které funguje yt-dlp samotný (úspěšně bráněný v EFF vs RIAA na základě „code is speech“).

Sám platím Spotify Premium. Kdyby tohle mohlo být legálně public, smysl by nebyl. Spotify a YouTube Premium oba nabízejí offline playback. Tenhle tool není náhrada, je to vlastní lokální archiv.

Stack
FRONTEND
build
Vite
framework
React 19, TypeScript
styling
Tailwind v4, shadcn/ui, motion
BACKEND
runtime
Node.js 22+
server
Hono
library db
better-sqlite3
AUDIO TOOLING
downloader
yt-dlp (auto-fetched)
transcode
ffmpeg (auto-fetched)
tag rewrite
node-id3
lyrics
LRCLib
OPTIONAL CLOUD
auth
Firebase Auth, Google sign-in
sync
Firestore (metadata only)