Kitchen Sink
What's This?
On this page you find contrived, complex usecases for multi-scrobbler that provide examples of equivalent configuration types to fulfill that usecase.
These example are useful for:
- getting an idea of what you can do with Multi-scrobbler
- using these examples as a starting point for your own configuration
- providing an example of the same configuration across different configuration types
More common, straightforward scenarios can be found in the quickstart guide.
Examples
Multiple Sources to Multiple Clients
You are the only user of Multi-scrobbler. You have many Sources you listen to and want to scrobble them to multiple services.
- You want to scrobble from...
- A Spotify account
- A Navidrome instance that you want to use with the built-in listenbrainz scrobble function
- A shared Plex instance that you want to scrobble only from a specific library named
oldies
- You want to scrobble to...
Configuration
- ENV
- File
- AIO
Using ENV Config
services:
multi-scrobbler:
image: foxxmd/multi-scrobbler
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
- SPOTIFY_ID=foxxSpotify
- SPOTIFY_CLIENT_ID=H2UvGv8okrFlv2OUoc1lAtK7Xe5EGDgs
- SPOTIFY_CLIENT_SECRET=HvoFE5Ce2hdblNE6vaFBEx6dRVcDdo43
- SPOTIFY_REDIRECT_URI=https://multiscrobbler.example.com/callback
# navidrome listenbrainz endpoint
- LZE_ID=myLzNavidrome
- LZE_TOKEN=myToken
# plex
- PLEX_ID=foxxPlex
- PLEX_URL=192.168.0.233:32400
- PLEX_TOKEN=JtRnwQWD__XMJF8sT3jc
- PLEX_USERS_ALLOW=foxx
- PLEX_LIBRARIES_ALLOW=oldies
# lastfm
- LASTFM_ID=myLFM
- LASTFM_API_KEY=myApiKey
- LASTFM_SECRET=mySecret
- LASTFM_REDIRECT_URI=https://multiscrobbler.example.com/lastfm/callback
# koito
- KOITO_ID=foxxKoi
- KOITO_TOKEN=029b081ba-9156-4pe7-88e5-3be671f5ea2b
- KOITO_USER=admin
- KOITO_URL=http://192.168.0.100:4110
volumes:
- "./config:/config"
ports:
- "9078:9078"
restart: unless-stopped
Using File Config
[
{
"id": "foxxSpotify",
"name": "Foxx Spotify",
"data": {
"clientId": "a89cba1569901a0671d5a9875fed4be1",
"clientSecret": "ec42e09d5ae0ee0f0816ca151008412a",
"redirectUri": "http://localhost:9078/callback",
"interval": 60
}
}
]
[
{
"id": "myLzNavidrome",
"name": "LZ for Navidrome",
"data": {
"token": "myToken"
}
}
]
[
{
"id": "foxxPlex",
"name": "Foxx Plex",
"data": {
"token": "JtRnwQWD__XMJF8sT3jc",
"url": "192.168.0.233:32400",
"usersallow": ["foxx"],
"librariesAllow": ["oldies"],
}
}
]
[
{
"id": "myLFM",
"name": "Old Lastfm",
"configureAs": "client",
"data": {
"apiKey": "myApiKey",
"secret": "mySecret",
"redirectUri": "http://localhost:9078/lastfm/callback"
}
}
]
[
{
"id": "foxxKoi",
"name": "Foxx Koito",
"configureAs": "client",
"data": {
"token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",
"username": "admin",
"url": "http://192.168.0.100:4110"
}
}
]
Using AIO Config
{
"sources": [
{
"type": "spotify",
"id": "foxxSpotify",
"name": "Foxx Spotify",
"data": {
"clientId": "a89cba1569901a0671d5a9875fed4be1",
"clientSecret": "ec42e09d5ae0ee0f0816ca151008412a",
"redirectUri": "http://localhost:9078/callback",
"interval": 60
}
},
{
"type": "endpointlz",
"name": "LZ for Navidrome",
"id": "myLzNavidrome",
"data": {
"token": "myToken"
}
},
{
"type": "plex",
"id": "foxxPlex",
"name": "Foxx Plex",
"data": {
"token": "JtRnwQWD__XMJF8sT3jc",
"url": "192.168.0.233:32400",
"usersallow": ["foxx"],
"librariesAllow": ["oldies"]
}
}
],
"clients": [
{
"type": "lastfm",
"id": "myLFM",
"name": "Old Lastfm",
"configureAs": "client",
"data": {
"apiKey": "myApiKey",
"secret": "mySecret",
"redirectUri": "http://localhost:9078/lastfm/callback"
}
},
{
"type": "koito",
"id": "foxxKoi",
"name": "Foxx Koito",
"configureAs": "client",
"data": {
"token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",
"username": "admin",
"url": "http://192.168.0.100:4110"
}
}
]
}
Scrobble for Multiple People to Multiple Clients
ENV Config Not Possible
In this usescase there is more than one of the same type of Source/Client.
This means only File or AIO configuration types are possible because ENV configuration only supports one Source/Client per type.
You want to scrobble plays for yourself (Foxx), Fred, and Mary:
- The three of you want to scrobble from...
- Fred and Mary each have their own Jellyfin servers
- You have a Plex server
- The three of you want to scrobble to...
Configuration
- File
- AIO
Using File Config
[
{
"id": "fredJf",
"name": "Freds Jellyfin",
"clients": ["fredLFM"],
"data": {
"url": "https://jellyfin.fred.com",
"user": "Fred",
"apiKey": "c9fae8756fbf481ebd9c5bb56bd6540c"
}
},
{
"id": "maryJf",
"name": "Marys Jellyfin",
"clients": ["maryLFM"],
"data": {
"url": "https://jellyfin.mary.com",
"user": "Mary",
"apiKey": "26fe9c5dc6374542adc4f4d5e8352838"
}
}
]
[
{
"id": "foxxPlex",
"name": "Foxx Plex",
"clients": ["foxxKoi"],
"data": {
"token": "JtRnwQWD__XMJF8sT3jc",
"url": "192.168.0.233:32400"
}
}
]
[
{
"id": "maryLFM",
"name": "Marys Lastfm",
"configureAs": "client",
"data": {
"apiKey": "maryApiKey",
"secret": "marySecret",
"redirectUri": "http://localhost:9078/lastfm/callback"
}
},
{
"id": "fredLFM",
"name": "Freds Lastfm",
"configureAs": "client",
"data": {
"apiKey": "fredApiKey",
"secret": "fredSecret",
"redirectUri": "http://localhost:9078/lastfm/callback"
}
}
]
[
{
"id": "foxxKoi",
"name": "Foxx Koito",
"configureAs": "client",
"data": {
"token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",
"username": "admin",
"url": "http://192.168.0.100:4110"
}
}
]
Using AIO Config
{
"sources": [
{
"type": "jellyfin",
"id": "fredJf",
"name": "Freds Jellyfin",
"clients": [
"fredLFM"
],
"data": {
"url": "https://jellyfin.fred.com",
"user": "Fred",
"apiKey": "c9fae8756fbf481ebd9c5bb56bd6540c"
}
},
{
"type": "jellyfin",
"id": "maryJf",
"name": "Marys Jellyfin",
"clients": [
"maryLFM"
],
"data": {
"url": "https://jellyfin.mary.com",
"user": "Mary",
"apiKey": "26fe9c5dc6374542adc4f4d5e8352838"
}
},
{
"type": "plex",
"id": "foxxPlex",
"name": "Foxx Plex",
"clients": [
"foxxKoi"
],
"data": {
"token": "JtRnwQWD__XMJF8sT3jc",
"url": "192.168.0.233:32400",
"usersallow": [
"foxx"
]
}
}
],
"clients": [
{
"type": "lastfm",
"id": "maryLFM",
"name": "Marys Lastfm",
"configureAs": "client",
"data": {
"apiKey": "maryApiKey",
"secret": "marySecret",
"redirectUri": "http://localhost:9078/lastfm/callback"
}
},
{
"type": "lastfm",
"id": "fredLFM",
"name": "Freds Lastfm",
"configureAs": "client",
"data": {
"apiKey": "fredApiKey",
"secret": "fredSecret",
"redirectUri": "http://localhost:9078/lastfm/callback"
}
},
{
"type": "koito",
"id": "foxxKoi",
"name": "Foxx Koito",
"configureAs": "client",
"data": {
"token": "029b081ba-9156-4pe7-88e5-3be671f5ea2b",
"username": "admin",
"url": "http://192.168.0.100:4110"
}
}
]
}
Use Musicbrainz to Fix Scrobbles from Navidrome
You have multiple Sources of music but your personal, on-filesystem music collection is not well organized.
You want to use the Musicbrainz Transformer to fix any scrobbles that use Navidrome, where your personal collection is located, so that the scrobble artists/album/title are all standardized.
- You want to scrobble from...
- A Spotify account
- A Navidrome instance that you want to use with the built-in listenbrainz scrobble function
- Plays from this Source should be fixed by Musicbrainz before going to your scrobble Clients
- You want to scrobble to...
- A Last.fm account
Configuration
- ENV
- File
- AIO
Using ENV Config
services:
multi-scrobbler:
image: foxxmd/multi-scrobbler
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
# required setup for musicbrainz
- MB_CONTACT=contact@mydomain.com # a real email
# searches with sensible release sorting with the searchOrder
# isrc => basic => artist (native mode)
- MB_PRESETS=default,sensible,native
# spotify
- SPOTIFY_ID=foxxSpotify
- SPOTIFY_CLIENT_ID=H2UvGv8okrFlv2OUoc1lAtK7Xe5EGDgs
- SPOTIFY_CLIENT_SECRET=HvoFE5Ce2hdblNE6vaFBEx6dRVcDdo43
- SPOTIFY_REDIRECT_URI=https://multiscrobbler.example.com/callback
# navidrome listenbrainz endpoint
- LZE_ID=myLzNavidrome
- LZE_TOKEN=myToken
# applies musicbrainz Stage to preTransform of navidrome source
- LZE_TRANSFORMS=musicbrainz
# lastfm
- LASTFM_ID=myLFM
- LASTFM_API_KEY=myApiKey
- LASTFM_SECRET=mySecret
- LASTFM_REDIRECT_URI=https://multiscrobbler.example.com/lastfm/callback
volumes:
- "./config:/config"
ports:
- "9078:9078"
restart: unless-stopped
Using File Config
For non-ENV config, Musicbrainz Transformer must be setup using the AIO Config config.json file. This configuration uses the sensible defaults in the defaults property. This is a suggestion and can be removed if not desired.
{
"transformers": [
{
"type": "musicbrainz",
"name": "MyMB",
"data": {
"apis": [
{
"contact": "contact@mydomain.com"
}
]
},
"defaults": {
"releaseStatusPriority": ["official"],
"releaseGroupPrimaryTypePriority": [
"album",
"single",
"ep"
],
"releaseCountryPriority": ["XW"],
"searchArtistMethod": "native",
"searchOrder": [
"isrc",
"basic",
"artist"
]
}
}
]
}
[
{
"id": "foxxSpotify",
"name": "Foxx Spotify",
"data": {
"clientId": "a89cba1569901a0671d5a9875fed4be1",
"clientSecret": "ec42e09d5ae0ee0f0816ca151008412a",
"redirectUri": "http://localhost:9078/callback",
"interval": 60
}
}
]
[
{
"id": "myLzNavidrome",
"name": "LZ for Navidrome",
"data": {
"token": "myToken"
},
"options": {
"playTransform": {
"preCompare": [
{
"type": "musicbrainz",
"name": "MyMB"
}
]
}
}
}
]
[
{
"id": "myLFM",
"name": "Old Lastfm",
"configureAs": "client",
"data": {
"apiKey": "myApiKey",
"secret": "mySecret",
"redirectUri": "http://localhost:9078/lastfm/callback"
}
}
]
Using AIO Config
This configuration uses the sensible defaults in the defaults property. This is a suggestion and can be removed if not desired.
{
"transformers": [
{
"type": "musicbrainz",
"name": "MyMB",
"data": {
"apis": [
{
"contact": "contact@mydomain.com"
}
]
},
"defaults": {
"releaseStatusPriority": ["official"],
"releaseGroupPrimaryTypePriority": [
"album",
"single",
"ep"
],
"releaseCountryPriority": ["XW"],
"searchArtistMethod": "native",
"searchOrder": [
"isrc",
"basic",
"artist"
]
}
}
],
"sources": [
{
"type": "spotify",
"id": "foxxSpotify",
"name": "Foxx Spotify",
"data": {
"clientId": "a89cba1569901a0671d5a9875fed4be1",
"clientSecret": "ec42e09d5ae0ee0f0816ca151008412a",
"redirectUri": "http://localhost:9078/callback",
"interval": 60
}
},
{
"type": "endpointlz",
"name": "LZ for Navidrome",
"id": "myLzNavidrome",
"data": {
"token": "myToken"
},
"options": {
"playTransform": {
"preCompare": [
{
"type": "musicbrainz",
"name": "MyMB"
}
]
}
}
}
],
"clients": [
{
"type": "lastfm",
"id": "myLFM",
"name": "Old Lastfm",
"configureAs": "client",
"data": {
"apiKey": "myApiKey",
"secret": "mySecret",
"redirectUri": "http://localhost:9078/lastfm/callback"
}
}
]
}