docs: Improve sources documentation
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

This commit is contained in:
FoxxMD 2025-11-04 19:18:46 +00:00
parent ff74fd7e4c
commit 63c079f08e

View file

@ -5,36 +5,38 @@ 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](#active) | [Activity](#activity) | ❌ | ✅ | ✅ | ✅ |
| [Deezer](/configuration/sources/deezer) | [Active](#active) | [History](#history) | ✅ | ✅ | ❌ | ❌ |
| [Google Cast (Chromecast)](/configuration/sources/google-cast) | [Active](#active) | [Activity](#activity) | ✅ | ✅ | ✅ | ❌ |
| [Icecast](/configuration/sources/icecast) | [Active](#active) | [Activity](#activity) | ❌ | ✅ | ✅ | ✅ |
| [Jellyfin](/configuration/sources/jellyfin) | [Active](#active) | [Activity](#activity) | ✅ | ✅ | ✅ | ❌ |
| [JRiver](/configuration/sources/jriver) | [Active](#active) | [Activity](#activity) | ❌ | ✅ | ✅ | ❌ |
| [Kodi](/configuration/sources/kodi) | [Active](#active) | [Activity](#activity) | ❌ | ✅ | ✅ | ❌ |
| [Koito](/configuration/sources/koito-source) | [Active](#active) | [History](#history) | ❌ | ✅ | ❌ | ❌ |
| [Last.fm](/configuration/sources/lastfm-source) | [Active](#active) | [History](#history) | ❌ | ✅ | ❌ | ❌ |
| [Last.fm (Endpoint)](/configuration/sources/lastfm-endpoint) | [Ingress](#ingress) | [History](#history) | ❌ | ✅ | ❌ | ❌ |
| [ListenBrainz](/configuration/sources/listenbrainz-source) | [Active](#active) | [History](#history) | ❌ | ✅ | ❌ | ❌ |
| [ListenBrainz (Endpoint)](/configuration/sources/listenbrainz-endpoint) | [Ingress](#ingress) | [History](#history) | ❌ | ✅ | ❌ | ❌ |
| [Maloja](/configuration/sources/maloja) | [Active](#active) | [History](#history) | ❌ | ✅ | ❌ | ❌ |
| [Mopidy](/configuration/sources/mopidy) | [Active](#active) | [Activity](#activity) | ❌ | ✅ | ✅ | ❌ |
| [MPD (Music Player Daemon)](/configuration/sources/mpd) | [Active](#active) | [Activity](#activity) | ❌ | ✅ | ✅ | ❌ |
| [Musikcube](/configuration/sources/musikcube) | [Active](#active) | [Activity](#activity) | ❌ | ✅ | ✅ | ❌ |
| [Plex](/configuration/sources/plex) | [Active](#active) | [Activity](#activity) | ✅ | ✅ | ✅ | ❌ |
| [Spotify](/configuration/sources/spotify) | [Active](#active) | [Activity](#activity) | ✅ | ✅ | ✅ | ❌ |
| [Subsonic-compatible APIs](/configuration/sources/subsonic) | [Active](#active) | [Activity](#activity) | ✅ | ✅ | ✅ | ❌ |
| [WebScrobbler](/configuration/sources/webscrobbler) | [Ingress](#active) | [History](#history) | ❌ | ✅ | ❌ | ❌ |
| [VLC](/configuration/sources/vlc) | [Active](#active) | [Activity](#activity) | ❌ | ✅ | ✅ | ❌ |
| [Yamaha MusicCast](/configuration/sources/yamaha-musiccast) | [Active](#active) | [Activity](#activity) | ❌ | ✅ | ✅ | ❌ |
| [Youtube Music](/configuration/sources/youtube-music) | [Active](#active) | [History](#history) | ❌ | ✅ | ❌ | ❌ |
| 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) | ❌ | ✅ | ❌ | ❌ |
| [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) | ✅ | ✅ | ✅ | ❌ |
| [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) | ✅ | ✅ | ✅ | ❌ |
| [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
@ -46,37 +48,39 @@ The Sources implemented in multi-scrobbler can be broken down into two categorie
How does this Source get data from the service/application?
##### Active
<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.
The MS Source makes network requests to the service which returns a response with data MS can use to monitor listening activity or scrobbles.
##### 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.
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?
##### Listening Activity {#activity}
<Tabs groupId="sot" queryString>
<TabItem value="activity" label="Listening Activity">
These Sources expose some kind of real-time listening data for users, like:
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)
* 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."
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).
* Listenbrainz, Koito, and Last.fm are all scrobble services that have "definitive" histories of scrobbled tracks.
##### Listening History/Scrobbles {#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.
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
@ -84,9 +88,7 @@ Some Sources report which User is playing a track and/or on what device the trac
### Limiting Scrobble Destination
By default a Source will scrobble to **all** configured Clients.
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 **names** of the Clients that it should scrobble to:
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"
{
@ -98,12 +100,22 @@ To limit which Clients a Source will scrobble to use the `clients` property in a
}
```
The Source above will only scrobble to Clients that are **named** (`name` property in Client config) either `myMaloja` `koitoA` or `listenbrainzFoo`.
:::note
If your Client is configured using [ENV](/configuration?configType=env#configuration-types) then they are given an automatically generated name. Check the multi-scrobbler Dashboard to find their name in a subheader under the Client type. Example:
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:
![Client Name Subheader](../client-subheader.png)
Otherwise, use the `name` property you gave the client in it's File/AIO config.
:::
### Scrobble Thresholds
<ScrobbleThreshold filename="spotify"/>