⚠️ WARNING: THIS PROJECT IS NOT ACTIVELY MAINTAINED AND IS PROVIDED AS-IS
-
Search music - tracks, albums, playlists
-
Download FLAC/MP3 music files (depending on your account plan)
- Download tracks, albums, playlists
- Downloaded files are fully tagged (+embedded cover art)
- Multiple downloads can be queued
-
Preview tracks before downloading
-
Responsive UI - designed for desktop & mobile
⚠️ WARNING: Use with caution if your data transfer/bandwidth is limited
You need:
- A Deezer account (need HiFi for FLACs)
- A Deezer client ID, client secret
- The track decryption key. This is not included for legal reasons
Dockerfiles are provided for development & production. If you wish to run this without Docker, take a look inside either Dockerfile for usage & dependencies.
PUBLIC_BASE
(default/
) - base URL/path the server is publicly served on
DOCKER_BUILDKIT=1 docker build -f Dockerfile . -t deezl \
--build-arg PUBLIC_BASE=/
docker run --rm -it --name deezl -p 1313:80 \
-e DEEZL_TRACK_DECRYPTION_SECRET=<...> \
-e DEEZL_CLIENT_ID=<...> \
-e DEEZL_CLIENT_SECRET=<...> \
-e DEEZL_EMAIL=<...> \
-e DEEZL_PASSWORD_MD5=<...> \
deezl
Both frontend & backend will auto-reload/restart when modified.
PUBLIC_PORT
- port the server is publicly served onPUBLIC_BASE
(default/
) - base URL/path the server is publicly served on
DOCKER_BUILDKIT=1 docker build -f dev.Dockerfile . -t deezl-dev
(cd web/; npm i)
docker run --rm -it --name deezl-dev -p 1313:80 \
-v $(pwd):/app:rw \
-e PUBLIC_PORT=1313 \
-e PUBLIC_BASE=/ \
-e DEEZL_TRACK_DECRYPTION_SECRET=<...> \
-e DEEZL_CLIENT_ID=<...> \
-e DEEZL_CLIENT_SECRET=<...> \
-e DEEZL_EMAIL=<...> \
-e DEEZL_PASSWORD_MD5=<...> \
deezl-dev
Built with Vite, Vue 3 and UnoCSS.
Track files are downloaded as blobs, then saved using FileSaver. For albums/playlists, tracks are first downloaded, then zipped in the browser using fflate. Zip files are downloaded in multiple parts if too big.
The API server uses FastAPI.
Endpoints (summarized):
- Search, track/album/playlist info - these call Deezer APIs, parse the responses and return the parsed data. Adding
?full=1
will make responses also include the unparsed Deezer responses, useful sometimes - Download a single track - downloads an encrypted track file → decrypts it → tags it, then returns it
deezer.py
is a minimal standalone Deezer client (gateway, public API, track url fetching, track decryption). It is a bit low-level but provides access to all relevant APIs.
A more high-level (and rate limiting) client is implemented on top of it in api.py
. It is used by the API server.