---
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)   | ❌                                     | ✅                                                     | ❌                                 | ❌                                           |
| [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:

![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"/>

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
    }
}
```