mirror of
https://github.com/FoxxMD/multi-scrobbler.git
synced 2026-04-30 21:00:13 +00:00
Some checks are pending
Publish Docker image to Dockerhub / test (push) Waiting to run
Publish Docker image to Dockerhub / Build OCI Images (push) Blocked by required conditions
Publish Docker image to Dockerhub / Build OCI Images-1 (push) Blocked by required conditions
Publish Docker image to Dockerhub / Merge OCI Images and Push (push) Blocked by required conditions
* feat(librefm): Implement librefm * feat(librefm): Make api key/secret optional * feat(librefm): Add LIBREFM_ENABLE env to allow enabling librefm with no other options * feat(ui): Show client/source hint for all ambiguous components
156 lines
No EOL
15 KiB
Text
156 lines
No EOL
15 KiB
Text
---
|
|
sidebar_position: 2
|
|
title: Overview
|
|
toc_max_heading_level: 4
|
|
---
|
|
|
|
import ScrobbleThreshold from "@site/src/components/snippets/_scrobble-threshold.mdx"
|
|
import Tabs from '@theme/Tabs';
|
|
import TabItem from '@theme/TabItem';
|
|
|
|
A **Source** is a data source that contains information about tracks you are playing like a music player or platform. Examples are **Spotify, Jellyfin, Plex, Youtube Music, Airsonic**, etc...
|
|
|
|
## Sources
|
|
|
|
| Name | Networking | Scrobble SOT | [Multi Device/User](#multi-deviceuser) | [Scrobble Destination](#limiting-scrobble-destination) | [Thresholds](#scrobble-thresholds) | [Should Scrobble](#should-scrobble-behavior) |
|
|
| :---------------------------------------------------------------------- | :------------------------------------------------------- | :-------------------------------------------------- | :------------------------------------- | :----------------------------------------------------- | :--------------------------------- | :------------------------------------------- |
|
|
| [Azuracast](/configuration/sources/azuracast) | [Active](./?sourceComm=active#by-communication-method) | [Activity](./?sot=activity#by-data-source-of-truth) | ❌ | ✅ | ✅ | ✅ |
|
|
| [Deezer](/configuration/sources/deezer) | [Active](./?sourceComm=active#by-communication-method) | [History](./?sot=history#by-data-source-of-truth) | ✅ | ✅ | ❌ | ❌ |
|
|
| [Google Cast (Chromecast)](/configuration/sources/google-cast) | [Active](./?sourceComm=active#by-communication-method) | [Activity](./?sot=activity#by-data-source-of-truth) | ✅ | ✅ | ✅ | ❌ |
|
|
| [Icecast](/configuration/sources/icecast) | [Active](./?sourceComm=active#by-communication-method) | [Activity](./?sot=activity#by-data-source-of-truth) | ❌ | ✅ | ✅ | ✅ |
|
|
| [Jellyfin](/configuration/sources/jellyfin) | [Active](./?sourceComm=active#by-communication-method) | [Activity](./?sot=activity#by-data-source-of-truth) | ✅ | ✅ | ✅ | ❌ |
|
|
| [JRiver](/configuration/sources/jriver) | [Active](./?sourceComm=active#by-communication-method) | [Activity](./?sot=activity#by-data-source-of-truth) | ❌ | ✅ | ✅ | ❌ |
|
|
| [Kodi](/configuration/sources/kodi) | [Active](./?sourceComm=active#by-communication-method) | [Activity](./?sot=activity#by-data-source-of-truth) | ❌ | ✅ | ✅ | ❌ |
|
|
| [Koito](/configuration/sources/koito-source) | [Active](./?sourceComm=active#by-communication-method) | [History](./?sot=history#by-data-source-of-truth) | ❌ | ✅ | ❌ | ❌ |
|
|
| [Last.fm](/configuration/sources/lastfm-source) | [Active](./?sourceComm=active#by-communication-method) | [History](./?sot=history#by-data-source-of-truth) | ❌ | ✅ | ❌ | ❌ |
|
|
| [Libre.fm](/configuration/sources/librefm-source) | [Active](./?sourceComm=active#by-communication-method) | [History](./?sot=history#by-data-source-of-truth) | ❌ | ✅ | ❌ | ❌ |
|
|
| [Last.fm (Endpoint)](/configuration/sources/lastfm-endpoint) | [Ingress](./?sourceComm=ingress#by-communication-method) | [History](./?sot=history#by-data-source-of-truth) | ❌ | ✅ | ❌ | ❌ |
|
|
| [ListenBrainz](/configuration/sources/listenbrainz-source) | [Active](./?sourceComm=active#by-communication-method) | [History](./?sot=history#by-data-source-of-truth) | ❌ | ✅ | ❌ | ❌ |
|
|
| [ListenBrainz (Endpoint)](/configuration/sources/listenbrainz-endpoint) | [Ingress](./?sourceComm=ingress#by-communication-method) | [History](./?sot=history#by-data-source-of-truth) | ❌ | ✅ | ❌ | ❌ |
|
|
| [Maloja](/configuration/sources/maloja) | [Active](./?sourceComm=active#by-communication-method) | [History](./?sot=history#by-data-source-of-truth) | ❌ | ✅ | ❌ | ❌ |
|
|
| [Mopidy](/configuration/sources/mopidy) | [Active](./?sourceComm=active#by-communication-method) | [Activity](./?sot=activity#by-data-source-of-truth) | ❌ | ✅ | ✅ | ❌ |
|
|
| [MPD (Music Player Daemon)](/configuration/sources/mpd) | [Active](./?sourceComm=active#by-communication-method) | [Activity](./?sot=activity#by-data-source-of-truth) | ❌ | ✅ | ✅ | ❌ |
|
|
| [Musikcube](/configuration/sources/musikcube) | [Active](./?sourceComm=active#by-communication-method) | [Activity](./?sot=activity#by-data-source-of-truth) | ❌ | ✅ | ✅ | ❌ |
|
|
| [Plex](/configuration/sources/plex) | [Active](./?sourceComm=active#by-communication-method) | [Activity](./?sot=activity#by-data-source-of-truth) | ✅ | ✅ | ✅ | ❌ |
|
|
| [Rocksky](/configuration/sources/rocksky-source) | [Active](./?sourceComm=active#by-communication-method) | [History](./?sot=history#by-data-source-of-truth) | ❌ | ✅ | ❌ | ❌ |
|
|
| [Spotify](/configuration/sources/spotify) | [Active](./?sourceComm=active#by-communication-method) | [Activity](./?sot=activity#by-data-source-of-truth) | ✅ | ✅ | ✅ | ❌ |
|
|
| [Subsonic-compatible APIs](/configuration/sources/subsonic) | [Active](./?sourceComm=active#by-communication-method) | [Activity](./?sot=activity#by-data-source-of-truth) | ✅ | ✅ | ✅ | ❌ |
|
|
| [teal.fm](/configuration/sources/tealfm-source) | [Active](./?sourceComm=active#by-communication-method) | [History](./?sot=history#by-data-source-of-truth) | ❌ | ✅ | ❌ | ❌ |
|
|
| [WebScrobbler](/configuration/sources/webscrobbler) | [Ingress](./?sourceComm=active#by-communication-method) | [History](./?sot=history#by-data-source-of-truth) | ❌ | ✅ | ❌ | ❌ |
|
|
| [VLC](/configuration/sources/vlc) | [Active](./?sourceComm=active#by-communication-method) | [Activity](./?sot=activity#by-data-source-of-truth) | ❌ | ✅ | ✅ | ❌ |
|
|
| [Yamaha MusicCast](/configuration/sources/yamaha-musiccast) | [Active](./?sourceComm=active#by-communication-method) | [Activity](./?sot=activity#by-data-source-of-truth) | ❌ | ✅ | ✅ | ❌ |
|
|
| [Youtube Music](/configuration/sources/youtube-music) | [Active](./?sourceComm=active#by-communication-method) | [History](./?sot=history#by-data-source-of-truth) | ❌ | ✅ | ❌ | ❌ |
|
|
|
|
## Features
|
|
|
|
### Types of Sources
|
|
|
|
The Sources implemented in multi-scrobbler can be broken down into two categories.
|
|
|
|
#### By Communication Method
|
|
|
|
How does this Source get data from the service/application?
|
|
|
|
<Tabs groupId="sourceComm" queryString>
|
|
<TabItem value="active" label="Active">
|
|
The MS Source makes network requests to the service which returns a response with data MS can use to monitor listening activity or scrobbles.
|
|
</TabItem>
|
|
<TabItem value="ingress" label="Ingress">
|
|
The MS Source waits for the service/application to send data to multi-scrobbler.
|
|
|
|
These types of Sources require that multi-scrobbler is accessible to the service, generally through an open port or reverse proxy.
|
|
</TabItem>
|
|
</Tabs>
|
|
|
|
#### By Data Source of Truth
|
|
|
|
How does MS determine if/when a song has been played and is scrobbable?
|
|
|
|
<Tabs groupId="sot" queryString>
|
|
<TabItem value="activity" label="Listening Activity">
|
|
These Sources expose some kind of real-time listening data for users, like:
|
|
|
|
* player state (paused, stopped, playing)
|
|
* player position (1:50/2:40)
|
|
* current listened duration (Track A playing for 1m:20s)
|
|
|
|
For theses Sources multi-scrobbler keeps track of the real-time state of your activity and scrobbles a track after it meets certain [scrobble thresholds](#scrobble-thresholds).
|
|
</TabItem>
|
|
<TabItem value="history" label="Listening History">
|
|
Some Sources expose their own version of "this track has been scrobbled."
|
|
|
|
* Listenbrainz, Koito, and Last.fm are all scrobble services that have "definitive" histories of scrobbled tracks.
|
|
|
|
For these Sources multi-scrobbler monitors the listening history data and scrobbles when it sees a new entry in the list.
|
|
</TabItem>
|
|
</Tabs>
|
|
|
|
### Multi-Device/User
|
|
|
|
Some Sources report which User is playing a track and/or on what device the track is being played. These Sources can be filtered with configuration to only monitor activity for specific devices or users.
|
|
|
|
### Limiting Scrobble Destination
|
|
|
|
To limit which Clients a Source will scrobble to use the `clients` property in a Source's [File/AIO configuration](/configuration?configType=file#configuration-types) to specify the **name** property of the Clients that it should scrobble to:
|
|
|
|
```json5 title="jellyfin.json"
|
|
{
|
|
"name": "MyJellyfin",
|
|
"clients": ["myMaloja","koitoA","listenbrainzFoo"]
|
|
"data": {
|
|
// ...
|
|
},
|
|
}
|
|
```
|
|
|
|
:::note
|
|
|
|
If `clients` is empty (`"clients": []`) or is omitted then the default is for the Source to scrobble to **all** configured Clients.
|
|
|
|
:::
|
|
|
|
:::note
|
|
|
|
If a Client is configured using [ENV](/configuration?configType=env#configuration-types) then it is given a generated name. Check the multi-scrobbler Dashboard to find their name in a subheader under the Client type. Example:
|
|
|
|

|
|
|
|
Otherwise, use the `name` property you gave the client in it's File/AIO config.
|
|
|
|
:::
|
|
|
|
### Scrobble Thresholds
|
|
|
|
<ScrobbleThreshold filename="spotify"/>
|
|
|
|
These can also be configured **globally** for all Sources using ENVs:
|
|
|
|
```
|
|
SOURCE_SCROBBLE_DURATION=40
|
|
SOURCE_SCROBBLE_PERCENT=20
|
|
```
|
|
|
|
### Should Scrobble Behavior
|
|
|
|
:::note
|
|
|
|
This feature is currently available only for some Sources. Check each Source's documentation to see if it supported.
|
|
|
|
:::
|
|
|
|
For _most_ Sources multi-scrobbler can determine if a user is listening and scrobble automatically. For Sources which multi-scrobbler cannot do this or require additional configuration, a user can indicate to MS that it should or should not scrobble. This action can be taken on the Web Dashboard by clicking the link next to **Should Scrobble** found in each Source's status card.
|
|
|
|
Additionally, for these Sources, the default behavior for Scrobbling can be explicitly set by adding the following value to a Source's `options` in [file or aio config](/configuration?configType=file#configuration-types):
|
|
|
|
```json5 title="azuracast.json"
|
|
{
|
|
"data": {
|
|
// ...
|
|
},
|
|
"options": {
|
|
// set to true to always scrobble automatically
|
|
// set to false to never scrobble automatically
|
|
"systemScrobble": true
|
|
}
|
|
}
|
|
``` |