Table of Contents

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:

docker-compose.yml
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 F) The Reverse Proxy concept for more details.

spotizerr.conf
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:

Spotify has a serious rate limiting, so i strongly suggest you also setup a Deezer account.

See 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:

At this point, go to Spotify developer console and login with your user. Create a new app, use the following data:

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 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-containers.spotizerr
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:

spotizer
/var/log/spotizerr/* {
    missingok
    notifempty
}