Skip to main content

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
tip

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...
    • Your decades-old Last.fm account
    • A Koito server for backup
Configuration

Using ENV Config

compose.yaml
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

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...
  • The three of you want to scrobble to...
    • Fred and Mary each have their own Last.fm accounts
    • You have a Koito server
Configuration

Using File Config

CONFIG_DIR/jellyin.json
[
{
"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"
}
}
]
CONFIG_DIR/plex.json
[
{
"id": "foxxPlex",
"name": "Foxx Plex",
"clients": ["foxxKoi"],
"data": {
"token": "JtRnwQWD__XMJF8sT3jc",
"url": "192.168.0.233:32400"
}
}
]
CONFIG_DIR/lastfm.json
[
{
"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"
}
}
]
CONFIG_DIR/koito.json
[
{
"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...
Configuration

Using ENV Config

compose.yaml
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

# 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

Use Multiple Stages to Get Album Art​

You want to send Now Playing data to a client like Discord and want to use multiple Stages to ensure at least one fills in any missing artwork for your data.

Configuration
[
{
"name": "Discord",
"enable": true,
"id": "myDiscordRemote",
"data": {
"token": "Ma7XBvzRERK3gQdkX4dkb3OQ.6aaGmJ.rvFiiVrzG4VXHHL3LyhZYhpWdG3Ph_if9aKz5E",
"applicationId": "8190211179716453570"
},
"options": {
"playTransform": {
"preCompare": [
{
// try rocksky first
"type": "rocksky",
// but only if we don't already have art
"when": [
{
"art": ""
}
],
// if matched, only add mbid and/or art
"title": false,
"artists": false,
"album": false,
"meta": true,
"art": true,
// if rocksky fails to match
// keep trying later stages
// but if does match then we have art so stop early
"onSucess": "stop",
"onFailure": "continue"
},
{
"type": "musicbrainz",
"when": [
{
"art": ""
}
],
"title": false,
"artists": false,
"album": false,
// we get album/release-group mbid needed for cover art
"meta": true
},
{
// uses mbids from previous stage to find album art
"type": "coverartarchive",
"when": [
{
"art": ""
}
]
}
]
}
}
}
]

If your data already has art but it's not from a public source and you want to ensure its useable for Discord then remove the art when condition and use force search for all Stages.

Configuration
[
{
"name": "Discord",
"enable": true,
"id": "myDiscordRemote",
"data": {
"token": "Ma7XBvzRERK3gQdkX4dkb3OQ.6aaGmJ.rvFiiVrzG4VXHHL3LyhZYhpWdG3Ph_if9aKz5E",
"applicationId": "8190211179716453570"
},
"options": {
"playTransform": {
"preCompare": [
{
// try rocksky first
"type": "rocksky",
"forceSearch": true,
// if matched, only add mbid and/or art
"title": false,
"artists": false,
"album": false,
"meta": true,
"art": true,
// if rocksky fails to match
// keep trying later stages
// but if does match then we have art so stop early
"onSucess": "stop",
"onFailure": "continue"
},
{
"type": "musicbrainz",
"forceSearch": true,
"title": false,
"artists": false,
"album": false,
// we get album/release-group mbid needed for cover art
"meta": true
},
{
// uses mbids from previous stage to find album art
"type": "coverartarchive",
"forceSearch": true
}
]
}
}
}
]