---
sidebar_position: 2
title: Overview
description: Scrobble Clients
toc_max_heading_level: 4
---

import ScrobbleThreshold from "@site/src/components/snippets/_scrobble-threshold.mdx"

A **Client** is an application that stores the historical information about what songs you have played (scrobbles). Examples are **Maloja, Last.fm, Listenbrainz**...

## Clients

| Name                                                | Now Playing |
| :-------------------------------------------------- | :---------- |
| [Discord](/configuration/clients/discord)           | ✅          |
| [Last.fm](/configuration/clients/lastfm)            | ✅          |
| [Libre.fm](/configuration/clients/librefm)          | ✅          |
| [Listenbrainz](/configuration/clients/listenbrainz) | ✅          |
| [Koito](/configuration/clients/koito)               | ❌          |
| [Maloja](/configuration/clients/maloja)             | ❌          |
| [Rocksky](/configuration/clients/rocksky)           | ❌          |
| [Teal.fm](/configuration/clients/tealfm)            | ❌          |

## Features

### Duplicate Detection

Before a Play is scrobbled to a client MS checks existing scrobbles from the Client's API to see if the Play has already been scrobbled.

For each Play, MS fetches (cached) scrobbles from the Client in a time range inclusive of the Play's listening timestamp and then scores existing scrobbles against the Play based on:

* Similarity of Title, Artists, and Album
* Temporal closeness of the Play's timestamp to the existing scrobble's timestamp
* Whether MS detected the Play as a repeat (applicable to Sources that report realtime Player data)

Detailed scoring breakdowns against each existing scrobble are logged at the `TRACE` logging level or in the [debug data](/help#copy-play-debug-data) for a scrobble.

See the [**Duplicate Scrobble Guidance**](/configuration/duplicates#how-duplicates-are-detected) page to learn how duplicates are detected and how you can ensure your configuration avoids possible duplicates.

### Dead Scrobbles

If multi-scrobbler is unable to submit a scrobble to a Client then it places the scrobble into a queue which is retried every 5 minutes for a number of times before it gives up.

After it stops _automatically_ retrying the scrobble still exists and can be retried from the dashboard. Dead scrobbles persist between restart so you will never lose a scrobble that hasn't been successfully submitted yet.

### Now Playing

Multi-scrobbler can report the currently **playing** tracks it is monitoring to some Scrobble Clients via their individual **Now Playing** functionality.

Now Playing is **default enabled** for all Clients that support it.

The behavior multi-scrobbler uses for determining Now Playing reporting:

* Now Playing can be explicitly enabled or disabled globally using ENV `NOW_PLAYING=true` or `NOW_PLAYING=false`
    * This only affects Clients that don't have behavior set via File/AIO (below)
* Now Playing will be only be reported to the same Clients a Source is configured to scrobble to
* A Source's Player status must be **Playing**, IE **active**, for reporting to occur
  * This status can be verified via Player UI on the Dashboard
* If multiple Sources having active Players then the scrobble Client will default to reporting the track based on Source **configuration** name, alphabetically
  * This is the `name` property set in [File or AIO source configs](/configuration?configType=file#configuration-types)

Clients can customize the Now Playing behavior individually using [File or AIO source configs:](/configuration?configType=file#configuration-types)

```json5 title="CONFIG_DIR/lastfm.json"
[
  {
    "name": "myLastFmClient",
    "configureAs": "client",
    "data": {
      // ...
    },
    "options": {
        // disable or enable
        //"nowPlaying": true
        //
        // OR define a list of Source *config* names that should be allowed to report Now Playing
        // order of the list determines priority for reporting Now Playing
        //"nowPlaying": ["mySpotify1","myJellyfin2"]
    }
  },
]
```