Download music from Deezer and Spotify with a simple web frontend, through a local-hosted service written in Python.
- download songs, albums, public playlists from Deezer.com (account is required, free plan is enough)
- download Spotify playlists (by parsing the Spotify website and download the songs from Deezer)
- download as zip file (including m3u8 playlist file)
320 kbit/s(currently only 128 kbit/s, see this issue) MP3s with ID3-Tags and album cover- UPDATE 2024/11: It seems like 320 kbit/s MP3s and FLAC works again
- download songs via yt-dlp
- KISS (keep it simple and stupid) front end
- MPD integration (use it on a Raspberry Pi!)
- simple REST api
- proxy support (https/socks5)
pip install --user deezer-downloader
If you want to use the Docker image, scroll down a bit.
On Firefox or Chrome-based browser:
- Log into your FREE Deezer account (do NOT use a premium account)
- Open the DevTools (
F12
orCtrl+Shift+C
orCtrl+Shift+I
) - Go to
Storage
tab - In the cookies, find
arl
: a ~200 characters alphanumeric key
Retrieve the template:
deezer-downloader --show-config-template > config.ini
You need to set at least:
- under
[deezer]
:cookie_arl
, your NON PREMIUM arl key - under
[youtubedl]
:command
, your yt-dlp install path
As stated in the config template, deezer-downloader do NOT keep yt-dlp updated, you will have to monitor this yourself.
Check Settings for further instructions.
deezer-downloader --config config.ini
Unless specified differently in the config file, the default frontend address is: http://localhost:5000. Access it with your favourite web browser.
Check Screenshots if needed.
Enjoy! 🦄
There is a settings file template called settings.ini.example
. You can specify the download directory with download_dir
. Pressing the download button only downloads the song/album/playlist. If you set use_mpd=True
in the settings.ini
the backend will connect to mpd (localhost:6600) and update the music database. Pressing the play button will download the music. If use_mpd=True
is set the mpd database will be updated and the song/album/playlist will be added to the playlist. In settings.ini
music_dir
should be the music root location of mpd. The download_dir
must be a subdirectory of music_dir
.
As Deezer sometimes requires a captcha to login the auto login features was removed. Instead you have to manually insert a valid Deezer cookie to the settings.ini
. The relevant cookie is the arl
cookie. Important: The ARL cookie must be of a non-premium account!
kmille@linbox:deezer-downloader poetry run deezer-downloader --help
usage: deezer-downloader [-h] [-v] [-t] [-c CONFIG]
Download music from Deezer with a nice front end
options:
-h, --help show this help message and exit
-v, --version show version and exit
-t, --show-config-template
show config template. At least you have to insert the ARL cookie
-c CONFIG, --config CONFIG
config file - if not supplied, the following directories are considered looking for deezer-downloader.ini: current working directory, XDG_CONFIG_HOME environment variable, ~/.config, /etc)
kmille@linbox:deezer-downloader poetry run deezer-downloader --config settings.ini
Starting Threadpool
/home/kmille/.cache/pypoetry/virtualenvs/deezer-downloader-NFDPq16k-py3.11/lib/python3.11/site-packages/giphypop.py:241: UserWarning: You are using the giphy public api key. This should be used for testing only and may be deactivated in the future. See https://github.com/Giphy/GiphyAPI.
warnings.warn('You are using the giphy public api key. This '
Worker 0 is waiting for a task
Worker 1 is waiting for a task
Worker 2 is waiting for a task
Worker 3 is waiting for a task
Worker 0 is now working on task: {'track_id': 8086130, 'add_to_playlist': False}
Downloading 'Adele - Set Fire to the Rain.mp3'
Dowload finished: /tmp/deezer-downloader/songs/Adele - Set Fire to the Rain.mp3
Setting state to mission accomplished to worker 0
worker 0 is done with task: {'track_id': 8086130, 'add_to_playlist': False} (state=mission accomplished)
There is a Docker image hosted on hub.docker.com. Please use an ARL cookie of an account with a free subscription.
mkdir downloads
sudo docker run -p 5000:5000 --volume $(pwd)/downloads/:/mnt/deezer-downloader --env DEEZER_COOKIE_ARL=your_ARL_cookie kmille2/deezer-downloader:latest
xdg-open http://localhost:5000
cd deployment
vagrant up
vagrant ssh
sudo vim /opt/deezer/settings.ini # insert your Deezer cookie
cd /opt/deezer && sudo poetry run deezer-downloader --config settings.ini
# On the host:
xdg-open http://localhost:5000 # view frontend in the browser
ncmpcpp -h 127.0.0.1 # try the mpd client
We use it with nginx and ympd as mpd frontend:
- / goes to ympd
- /d/ goes to the downloader
The deployment directory contains a systemd unit file and a nginx vhost config file. There is also a patch to add a link to the ympd frontend. The debug
tab will show you the debug output of the app.Shortcuts
If you want to debug or build it from source: there is a docker-compose file in the docker directory. The docker/downloads
directory is mounted into the container and will be used as download directory. You have to check the permissions of the docker/downloads
directory as docker mounts it with the same owner/group/permissions as on the host. The deezer
user in the docker container has uid 1000. If you also have the uid 1000 then there should be no problem. For debugging: sudo docker-compose build --force-rm && sudo docker-compose up
Tested on Ubuntu Jammy:
sudo apt-get update -q
sudo apt-get install -qy vim tmux git ffmpeg
# python3-poetry is too old (does not support groups ...)
sudo apt-get install -qy python3-pip
sudo pip install poetry
git clone https://github.com/kmille/deezer-downloader.git
cd deezer-downloader
poetry install
poetry run deezer-downloader --show-config-template > settings.ini
# enable yt-dlp
sudo pip install yt-dlp
sed -i 's,.*command = /usr/bin/yt-dlp.*,command = /usr/local/bin/yt-dlp,' settings.ini
# enable mpd
sudo apt-get install -yq mpd ncmpcpp
sudo sed -i 's,^music_directory.*,music_directory "/tmp/deezer-downloader",' /etc/mpd.conf
sudo systemctl restart mpd
sed -i 's/.*use_mpd = False.*/use_mpd = True/' settings.ini
# 1) Adjust the Deezer cookie: vim settings.ini
# 2) Run tests: DEEZER_DOWNLOADER_CONFIG_FILE=settings.ini poetry run pytest -v -s
# 3) Run it: poetry run deezer-downloader --config settings.ini
# 4) Try out: ncmpcpp -h 127.0.0.1 && xdg-open http://localhost:5000
# 5) Downloaded files are in /tmp/deezer-downloader
Including mpd and ympd https://github.com/kmille/music-ansible (not maintained anymore)
Search for songs. You can listen to a 30 second preview in the browser.
Search for albums. You can download them as zip file.
List songs of an album.
Download songs with youtube-dl
Download a Spotify playlist.
Download a Deezer playlist.
ncmpcpp mpd client.
Ctrl
+M
: focus search bar
Enter
: serach for songs
Alt
+Enter
: search for albums
Ctrl
+B
: go to / (this is where our ympd is)
Ctrl
+Shift
+[1-7]
switch tabs
cd deezer-downloader
DEEZER_DOWNLOADER_CONFIG_FILE=settings.ini poetry run pytest -v -s
# If you don't set DEEZER_DOWNLOADER_CONFIG_FILE the default template file will be used. Some tests will fail because there is no valid arl_cookie.
- use poetry as build system
- build package and uploada to pypi
- worker threads now "daemon threads" (they now just stop if you stop deezer-downloader)
- update config template (remove http.debug)
- update dependencies
- switch to waitress (from gunicorn)
- replace youtube-dl by yt-dl
- update third party dependencies
- fix broken deezer download functionality (#66, removes the ability to download flac quality)
- update third party dependencies
- update ubuntu base image for the docker container
- allow to set download quality (flac|mp3) via environment variable DEEZER_FLAC_QUALITY (#43)
- feature: download your favorite Deezer songs
- automated tests with Github Actions
- push Docker image to hub.docker.com with Github Actions
- breaking change: now use the
arl
cookie instead of thesid
cookie. This cookie does not expire so we don't need the background thread that keeps the session alive - add support for flac as download format
- thanks to luelista for the contribution!
- play 30 second preview in browser
- add Vagrantfile
- show album cover in search results
- use a threaded queue for download tasks
- list album songs