====== Spotizerr ======
[[https://github.com/Xoconoch/spotizerr|Spotizerr]] is an amazing self-hosted web service that let's you download and search for music from Deezer and Spotify.
While i **do not recomend** to use it, as it's against those services ToS, it seems to be working pretty well at least if you have a premium account.
===== Installation =====
Sporizerr is provided as a docker image that can be easily run with rootless podman. Due to this, it's important to properly setup credentials and storage locations.
As usual, create a dedicated user and associate it to the //media// group so that downloaded files will be accessible to the other media services:
useradd -d /data/daemons/spotizerr -m spotizerr -g media
mkdir /data/Media/spotizerr
mkdir /data/Media/spotizerr/downloads
mkdir /var/log/spotizerr
chown spotizerr:media /var/log/spotizerr
su - spotizerr
wget https://raw.githubusercontent.com/Xoconoch/spotizerr/refs/heads/main/docker-compose.yml
Now edit the default docker compose to adapt it to your needs. You can follow my docker compose:
name: spotizerr
services:
spotizerr:
volumes:
- /data/daemons/spotizerr:/app/data
- /data/daemons/spotizerr/config:/app/config
- /data/Media/spotizerr/downloads:/app/downloads
- /var/log/spotizerr:/app/logs
ports:
- 7171:7171
image: cooldockerizer93/spotizerr
container_name: spotizerr-app
environment:
# - PUID=1000 # podman rootless needs PUID=0, or removed like this
# - PGID=1000 # podman rootless needs PGID=0, or removed like this
- UMASK=0002 # allow all users in media group to access music downloaded by spotizerr
- REDIS_HOST=redis
- REDIS_PORT=6379
- REDIS_DB=0
- REDIS_URL=redis://redis:6379/0
- REDIS_BACKEND=redis://redis:6379/0
- EXPLICIT_FILTER=false # Set to true to filter out explicit content
depends_on:
- redis
networks:
- spotizerr-net
redis:
image: redis:alpine
container_name: spotizerr-redis
volumes:
- redis-data:/data
command: redis-server --appendonly yes
networks:
- spotizerr-net
volumes:
redis-data:
driver: local
networks:
spotizerr-net: {}
PUID and PGID sohuld be omitted or set to 0, because i am using rootless podman and not docker. This ensure that the user running the container is actually the //spotizerr// user, which is what we want.
Now pull the image:
podman compose pull
===== Reverse Proxy =====
Spotizerr seems to be working only on subdomain and not on subpath. I assume you have **spotizerr.mydomain.com**. See the [[selfhost:nginx|F) The Reverse Proxy concept]] for more details.
server {
server_name spotizerr.mydomain.com;
listen 443 ssl;
listen 8443 ssl;
http2 on;
access_log /var/log/nginx/spotizerr.mydomain.com_access_log main;
error_log /var/log/nginx/spotizerr.mydomain.com_error_log info;
include "com.mydomain/authelia_location.conf";
location / {
include "com.mydomain/authelia_proxy.conf";
include "com.mydomain/authelia_authrequest.conf";
proxy_pass http://127.0.0.1:7171/;
proxy_set_header Connection $http_connection;
proxy_set_header Upgrade $http_upgrade;
}
include org.gardiol/certbot.conf;
}
Please note that Spotizerr does not provide **any** authentication or protection: you **must** put your SSO (see [[selfhost:sso|here]]) and HTTPS on top of it using the reverse proxy as in the above config example.
===== Configuration =====
Setup Spotizerr require a few steps:
* Setup spotify login
* Enable spotify API
* Setup deezer ARL token
Spotify has a serious rate limiting, so i strongly suggest you also setup a Deezer account.
See [[https://github.com/Xoconoch/spotizerr?tab=readme-ov-file#spotify-credentials-setup|this page]] for the specific instructions.
**Note:** you //must// enable "real time downloading" in settings to reduce API rate limiting from Spotify.
=== Step 1: authenticate with Spotify ===
You need to setup and run **librespot-auth**. The instructions are quite simple and can be run anywhere, not necessarily on the server itself:
it clone --depth 1 https://github.com/dspearson/librespot-auth.git
cargo build --release
# Alternatively, using podman: "podman run --rm -v "$(pwd)/librespot-auth":/app -w /app rust:latest cargo build --release"
./librespot-auth/target/release/librespot-auth --name "mySpotifyAccount1" --class=computer
On Gentoo you should have cargo by default (it's part of rust) so you don't need to run a container for that.
The above command will create a file called //credentials.json//, similar to the following:
{"username": "my username" "auth_type": 1 "auth_data": "a long string"}
Now open Spotizerr, go to the settings (the whell icon in the lower left corner) and add the Spotify account:
* name: whatever you want
* username: copy "my username" from the json file
* credentials: copy "a long string" from the json file
=== Step 2: link Spotify API ===
At this point, go to [[https://developer.spotify.com|Spotify developer console]] and login with your user. Create a new app, use the following data:
* app name: something that make sense for you
* app description: same as above
* website: not needed, leave blank
* redirect URI: https://spotizerr.mydomain.com/callback
* API/SDK: i checked them all, that is probably not needed YMMV
* i unrestand and agree: check, of course
Save, and copy both **ClientID** and **ClientSecret** strings. You need togo to Spotizerr page and add the two strings in your Spotify account API configuration.
That's it! You can start searching and downloading stuff.
=== Step 3: setup Deezer ===
Open your browser, login to Deezer. Open the developer console (see your browser instructions... i suggest you use Firefox for this) go to the //storage// tab and copy the ARL cookie text string under the //deezer.com// domain.
Go to Spotizerr config, add a new Deezer account and paste the ARL cookie text string. You can give any name you want to the account.
===== Autostart =====
To start it, and set it up on boot, as usual follow my indications [[gentoo:containers|Using Containers on Gentoo]], so link the **user-containers** init script:
ln -s /etc/init.d/user-containers /etc/init.d/user-containers.spotizerr
and create the following config file:
USER=spotizerr
DESCRIPTION="Spotify donwloader"
Add the service to the default runlevel and start it now:
/etc/init.d/user-containers.spotizerr start
rc-update user-containers.spotizerr
===== Logrotate =====
Add log rotation to Spotizerr logs. Drop the following under **/etc/logrotate.d**:
/var/log/spotizerr/* {
missingok
notifempty
}