github FoxxMD/multi-scrobbler 0.12.0
v0.12.0

7 hours ago

What's New?

Overhauled Historical Scrobble Matching

MS was originally built with only real-time scrobbling as a design goal so the logic behind "check if this track-to-be-scrobbled already exists for Scrobbler X" only extended as far as checking scrobbles MS had already seen, or the first page of scrobbles returned from the scrobbler's API. MS has long since evolved beyond these (6 year old) goals but the existing scrobble logic had stayed mostly the same which means many users have had problems with MS when it comes to scrobbling old scrobbles that don't conform to this real-time assumption.

Now, ~3000 changed lines later and thanks to testing from @4rft5 , this logic has been completely overhauled to enable arbitrary time-range checks for any historical scrobbles: allowing MS to scrobble everything with the assurance they won't be duplicated, regardless of when they were scrobbled.

Note: This is a fully internal, functional change that does not require any changes in configuration or behavior from you, the user.

Some caveats that will be improved in future releases:

  • This change does not yet apply to Rocksky or teal.fm due to constraints on searching PDS repositories. This will be addressed in a future release with manual user interaction.
  • There may be issues with fetching in some edge cases pertaining to many results returned. EX: you imported scrobbles into a client with no timestamps so "1 hour timerange" contains ~3000 scrobbles -- MS may behave unexpectedly in this scenario. Please file an issue if this scenario applies to you.

This change also paves the way for bulk scrobble migrations between clients. Be on the lookout for this in a future release ;)

Improved Support for File/AIO Config in Documentation

File and AIO Configuration for every Source/Client, on the documentation website, has been improved with new tools:

  • A schema explorer lets you browse all possible properties of the config to more easily understand its shape and what is required
  • A json editor enables you to modify the examples in-place, while validating your changes against the accompanying schema
    • You can edit plain json or use the point-and-click for a guided experience if you aren't comfortable with json yet
image

These same tools are available on the Config Playground for general AIO editing and exploration.

image

Breaking Changes

Koito Support in Listenbrainz Client

The Listenbrainz Client previously has partial support for scrobbling to Koito instances due to a partially compatible listenbrainz api. The new historical scrobble logic makes this support impossible so this support has been fully removed.

If you are still using a LZ client for interacting with a Koito instance you need to migrate your configuration to use the official Koito Client configuration.

This does not affect users already using the Koito client.

Spotify Premium

As of March 9th 2026 Spotify no longer allows Spotify Developer Apps to be owned by a non-premium account.

If you have a non-premium account in this scenario you will likely experience 403 errors the next time your authentication needs to be refreshed.

Note that non-premium accounts can still use MS but you need to re-create an app that is owned by a premium account, first. See the Premium Account Required expandable section in the Spotify Source docs for instructions on how to implement this workaround.

Full Changelog

⛰️ Features

  • (docs) Implement config example/structure guidance
  • (jellyin) Add external URL guidance
  • (scrobbler) Implement play-dependent, arbitrary timerange fetching for duplicate checks
  • (scrobbler) Re-implement scrobble preload
  • (scrobbler) Improved dupe detection
  • (ui) Add service status page link to dashboard
  • (ui) Default logs to trace
  • (No Category) Implement timerange consolidation
  • (No Category) Implement better request retry logic

🐛 Bug Fixes

  • (discord) Add hidden activity type
  • (discord) Don't throw on unknown activity type
  • (lastfm) Check for singular scrobble response
  • (lastfm) Fix not returning nowPlaying scrobble
  • (lastfm) Default to not including now playing in history response
  • (nowPlaying) Scrobbler should report now playing if player state is known nowPlayingMode source
  • (plex) Also read MBIDs from guid field @owendaprile
  • (sources) Add a confidence signal to plays generated from authoratiative sources to avoid fuzzy matching repeats
  • (transform) Fix missing defaults assignment for stage config parsing
  • (transform) Fix user transform default value
  • (transform) Fix transform for stage not using name for selection #481

📚 Documentation

  • (spotify) Add premium account guidance
  • (No Category) Fix broken links and anchors

🚜 Refactor

  • (atproto) Replace naive TID impl with @ewanc26/tid
  • (docs) Replace docusaurus json-schema-plugin
  • (listenbrainz) Remove Koito support
    • BREAKING: Remove Koito support
  • (source) Reduce logging noise for activity checks
  • (No Category) Use trace logging for defaults
  • (No Category) Re-implement retry logic for LZ with fixed request init
  • (No Category) Reorganized and consolidate source/client types

⚙️ Miscellaneous Tasks

  • (No Category) Exclude schema folder from search
  • (No Category) Add netlify-specific build command

Don't miss a new multi-scrobbler release

NewReleases is sending notifications on new releases.