From 06b23d628759e46d8b3c82f0a47fa610e4b97451 Mon Sep 17 00:00:00 2001 From: FoxxMD Date: Fri, 1 Aug 2025 17:28:16 +0000 Subject: [PATCH] docs: Update Spotify docs and usage due to Redirect URI changes As of April 2025 Spotify no longer allows insecure redirect URIs which complicates initial Spotify setup. * Improve spotify App creation instructions * Add several approaches to creating a valid redirect URI * Remove Spotify as the default Source example in docs due to complexity of Redirect URI requirements Closes #330 --- docker-compose.yml | 6 +- docsite/docs/configuration/configuration.mdx | 86 +++++++++++++++++-- docsite/docs/configuration/echo.png | Bin 0 -> 49800 bytes docsite/docs/installation/installation.mdx | 20 +++-- docsite/docs/quickstart.mdx | 15 ++-- 5 files changed, 101 insertions(+), 26 deletions(-) create mode 100644 docsite/docs/configuration/echo.png diff --git a/docker-compose.yml b/docker-compose.yml index 0a27e0fc..6cd6af6e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,9 +4,9 @@ services: container_name: multi-scrobbler environment: - TZ=Etc/GMT # Specify timezone from TZ Database name found here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones - #- SPOTIFY_CLIENT_ID= - #- SPOTIFY_CLIENT_SECRET= - #- SPOTIFY_REDIRECT_URI=http://multi-scrobbler-host-IP:9078/callback ## Need to be whitelisted in Spotify dashboard and is used for creating the connection first time + #- JELLYFIN_APIKEY= + #- JELLYFIN_URL= + #- JELLYFIN_USER= #- MALOJA_URL=http://maloja:42010 #- MALOJA_API_KEY= #- PUID=1000 # required if running docker on linux host, see main README Docker setup instructions diff --git a/docsite/docs/configuration/configuration.mdx b/docsite/docs/configuration/configuration.mdx index e09759df..18bf579a 100644 --- a/docsite/docs/configuration/configuration.mdx +++ b/docsite/docs/configuration/configuration.mdx @@ -1806,16 +1806,92 @@ The Plex Webhook Source will be removed in an upcoming release. You should migra ### [Spotify](https://www.spotify.com) -To access your Spotify history you must [register an application](https://developer.spotify.com/dashboard) to get a -Client ID/Secret. Make sure to also whitelist your redirect URI in the application settings. +
-:::note +Spotify and Automix If your Spotify player has [Automix](https://community.spotify.com/t5/FAQs/What-is-Automix/ta-p/5257278) enabled and Spotify uses it for your playlist/queue then MS cannot accurately determine when a track will end. This is because the track is "mixed" in your queue with a shorter play time than its actual length and [Spotify does not report this modified play time in its API.](https://community.spotify.com/t5/Spotify-for-Developers/Wrong-duration-ms-of-track-with-Automix/m-p/5429147) This **does not affect MS's ability to scrobble** from Spotify but it will affect the accuracy of the duration MS reports was played. -::: +
-#### Configuration +#### Authenticate Spotify with Multi-Scrobbler + +To access your Spotify history you must [create a Spotify App](https://developer.spotify.com/dashboard) to get a +Client ID/Secret. + +1. **Login to https://developer.spotify.com** with your existing Spotify account and accept Developer Terms + +2. Navigate to your Spotify Developer [Dashboard](https://developer.spotify.com/dashboard) and start the **Create App** process + +3. Determine the correct **Redirect URI** to use and set it in your App settings + +
+ +Redirect URI Instructions + +A Redirect URI is the URL that Spotify will navigate your **browser** to after you complete authorization. The URL will contain the code necessary for multi-scrobbler to get a Spotify access token. + +Spotify [**no longer allows insecure URIs**](https://developer.spotify.com/documentation/web-api/tutorials/migration-insecure-redirect-uri) (start with `http://`) unless the address is `127.0.0.1` -- so `localhost` and internal IPs (`192.168.0.xxx`) no longer work. + +Use **one** of the following methods to specify a valid Redirect URI and complete Spotify authentication with multi-scrobbler: + + + + **Use a domain you control, with SSL certificates/HTTPS enabled, to create a valid redirect URI.** + + For example, if you are already running multi-scrobbler behind a reverse proxy (nginx/traefik/caddy) at `https://scrobbler.mydomain.com` then set the Spotify Redirect URI for your Spotify App, and multi-scrobbler `SPOTIFY_REDIRECT_URI` ENV, to `https://scrobbler.mydomain.com/callback` + + Alternatively, if multi-scrobbler is not accessible behind your domain, then use the [**Echo**](./?spotifyRedirect=echo#spotify) method with your own domain instead of 127.0.0.1. + + + **Run multi-scrobbler, configured for a Spotify Source, from the same machine as your browser in order to get credentials.** + + In this scenario you can use `http://127.0.0.1:9078/callback` as the Spotify Redirect URI and multi-scrobbler `SPOTIFY_REDIRECT_URI` ENV. + + After completing authentication, copy the contents of local multi-scrobbler's [configuration folder](../installation/installation.mdx#storage) to the final location of where multi-scrobbler will be run. + + + **Use a docker container on the same machine your browser is on to "intercept" the callback URL from Spotify authentication, then manually finish the process by changing the domain to your multi-scrobbler instance.** + + + 1. Create a container on the same machine as your browser using the [`mendhak/http-https-echo:36`](https://github.com/mendhak/docker-http-https-echo) image. This container runs a simple HTTP server that echos back any request it recieves. + + ```shell + docker run --rm -p 127.0.0.1:5079:8080 mendhak/http-https-echo:36 + ``` + + 2. Set the Spotify Redirect URI and multi-scrobbler `SPOTIFY_REDIRECT_URI` ENV as `http://127.0.0.1:5079/callback` + + 3. In [Authenticate Spotify with Multi-Scrobbler](#authenticate-spotify-with-multi-scrobbler) (outside these Redirect Instructions) go to **Step 4** and continue the instructions + + Eventually, Spotify will redirect you to a web page with a URL like `http://127.0.0.1:5079/callback?code=xxxxxx...` + + ![echo](echo.png) + + 4. In the URL, replace `127.0.0.1:5079` with the address/IP for your multi-scrobbler instance so the URL is similar to `http://192.168.0.101:9078/callback?code=xxxxxx...`. Then navigate to this URL to complete authentication. + + + + + For your convenience, I run the [`mendhak/http-https-echo:36`](https://github.com/mendhak/docker-http-https-echo) container from the [**Echo**](./?spotifyRedirect=echo#spotify) approach on a domain I, the multi-scrobbler developer [FoxxMD](https://github.com/FoxxMD), control and self-host. Please be aware: + + * I **do not collect personal data** or any querystrings/data sent in requests to this site + * It's **not possible** for me to use the code sent by Spotify to this URL without also having your Client ID/Secret + * However, there is **always** risk involved with trusting a service you do not control. Evaluate the risk of using this site for yourself. + + Use the [**Echo**](./?spotifyRedirect=echo#spotify) approach, starting from **Step 2**, with **https://echo.multi-scrobbler.app/callback** as Spotify Redirect URI and multi-scrobbler `SPOTIFY_REDIRECT_URI` ENV. + + + +
+ +4. Save your new App, then copy the Client ID/Secret from the App's Basic Information page. + +5. Add the Client ID, Secret, and Redirect URI to the respective field/ENV in the [configuration section below](#spotify-config) + +6. Start multi-scrobbler, then visit the Web Dashboard and click **(Re)authenticate** on the Spotify card to start the auth process + +#### Configuration {#spotify-config} diff --git a/docsite/docs/configuration/echo.png b/docsite/docs/configuration/echo.png new file mode 100644 index 0000000000000000000000000000000000000000..612576eb312ecd57d3c886a76122f2e39781b5a3 GIT binary patch literal 49800 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 N5}#y6%7yg&{~K>#J&OPU literal 0 HcmV?d00001 diff --git a/docsite/docs/installation/installation.mdx b/docsite/docs/installation/installation.mdx index f6647f84..39051c3c 100644 --- a/docsite/docs/installation/installation.mdx +++ b/docsite/docs/installation/installation.mdx @@ -172,7 +172,7 @@ See the [**Quick Start Guide**](../quickstart.mdx) for another guided docker-com The example scenario: -* [Spotify **Source**](../configuration/configuration.mdx#spotify) +* [Jellyfin **Source**](../configuration/configuration.mdx#jellyfin) * [Maloja **Client**](../configuration/configuration.mdx#maloja) * Serving app on port `9078` * Docker container located on a different IP (`192.168.0.100`) so use [Base URL](../configuration/configuration.mdx#base-url) @@ -184,7 +184,7 @@ The example scenario: ```bash - docker run --name multi-scrobbler -e "SPOTIFY_CLIENT_ID=yourId" -e "SPOTIFY_CLIENT_SECRET=yourSecret" -e "BASE_URL=192.168.0.100" -e "MALOJA_URL=http://domain.tld" -e "MALOJA_API_KEY=1234" -e "PUID=1000" -e "PGID=1000" -p 9078:9078 -v /home/myUser/ms:/config foxxmd/multi-scrobbler + docker run --name multi-scrobbler -e "JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56bd6540c" -e "JELLYFIN_URL=192.168.0.101:8096" -e "JELLYFIN_USER=MyUser" -e "BASE_URL=192.168.0.100" -e "MALOJA_URL=http://domain.tld" -e "MALOJA_API_KEY=1234" -e "PUID=1000" -e "PGID=1000" -p 9078:9078 -v /home/myUser/ms:/config foxxmd/multi-scrobbler ``` @@ -204,8 +204,9 @@ The example scenario: container_name: multi-scrobbler environment: - TZ=Etc/GMT # Specify timezone from TZ Database name found here https://en.wikipedia.org/wiki/List_of_tz_database_time_zones - - SPOTIFY_CLIENT_ID=yourId - - SPOTIFY_CLIENT_SECRET=yourSecret + - JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56bd6540c + - JELLYFIN_URL=192.168.0.101:8096 + - JELLYFIN_USER=MyUser - BASE_URL=http://192.168.0.100:9078 - MALOJA_URL=http://domain.tld:42010 - MALOJA_API_KEY=1234 @@ -261,7 +262,7 @@ See [this issue](https://github.com/FoxxMD/multi-scrobbler/issues/135#issuecomme ```shell -SPOTIFY_CLIENT_ID=yourId SPOTIFY_CLIENT_SECRET=yourSecret MALOJA_URL="http://domain.tld" node src/index.js +JELLYFIN_APIKEY=c9fae8756fbf481ebd9c5bb56bd6540c JELLYFIN_URL=192.168.0.101:8096 JELLYFIN_USER=MyUser MALOJA_URL="http://domain.tld" node src/index.js ``` @@ -273,12 +274,13 @@ SPOTIFY_CLIENT_ID=yourId SPOTIFY_CLIENT_SECRET=yourSecret MALOJA_URL="http://dom { "sources": [ { - "type": "spotify", + "type": "jellyfin", "clients": ["myConfig"], - "name": "mySpotifySource", + "name": "myJellyfinSource", "data": { - "clientId": "a89cba1569901a0671d5a9875fed4be1", - "clientSecret": "ec42e09d5ae0ee0f0816ca151008412a", + "apiKey": "a89cba1569901a0671d5a9875fed4be1", + "url": "http://192.168.0.101:8096", + "user": "MyUser" } } ], diff --git a/docsite/docs/quickstart.mdx b/docsite/docs/quickstart.mdx index bcc40fa4..d619294a 100644 --- a/docsite/docs/quickstart.mdx +++ b/docsite/docs/quickstart.mdx @@ -57,20 +57,17 @@ services: ``` - To access your Spotify activity you must [register a Spotify application](https://developer.spotify.com/dashboard) to get a - **Client ID/Secret**. + To access your Spotify activity you must [create a Spotify App](https://developer.spotify.com/dashboard) to get a + **Client ID/Secret** and set a valid **Redirect URI**. + + Refer to the [Spotify Authentication instructions in the docs.](./configuration/configuration.mdx#authenticate-spotify-with-multi-scrobbler) - When creating the application add this to **Redirect URIs** - - ``` - http://192.168.0.100:9078/callback - ``` - - After the application is created add these values to the `environment` section in the [`docker-compose.yml` you created.](#create-docker-compose-file) + Assuming you used the **HTTPS** method for your **Redirect URI** from the instructions above...after the application is created add these values to the `environment` section in the [`docker-compose.yml` you created.](#create-docker-compose-file) ```yaml title="~/msData/docker-compose.yml" - SPOTIFY_CLIENT_ID=yourClientId - SPOTIFY_CLIENT_SECRET=yourClientSecret + - SPOTIFY_REDIRECT_URI=https://multi-scrobbler.mydomain.com/callback ``` Later, after [starting multi-scrobbler](#start-multi-scrobbler), visit the dashboard at `http://192.168.0.100:9078` and click **(Re)authenticate** on the Spotify card to authorize multi-scrobbler to use your account. Monitoring will begin automatically after authorization is complete.