Skip to content

Changelog

v0.11.4

What’s New?

  • A very small release to fix a bug with parsing Spotify data #470

v0.11.3

What’s New?

Deezer Improvements

Errors in parsing Deezer history have been fixed thanks to @Ectalite graciously sharing Deezer access to restart stalled development.

Additionally, the Deezer Source now supports scrobbling for a child account when the main account is the owner of a Family Plan.

Jellyfin Config Changes

The allowUnknown File Config property has been deprecated and will be removed in a future release.

It has been replaced by the allowMediaTypes list, which enables more granular control over what types of media can be scrobbled. The list should be one or more of the official media types listed in the jellyfin sdk. The undocumented MusicVideo type is also supported.

If you were using "allowUnknown": true, replace it with the below property in your jellyfin.json config:

{
"allowMediaTypes": ["audio","unknown"]
}

This setting is also now available as an ENV of comma-separated media types.

JELLYFIN_MEDIATYPES_ALLOW=audio,video,musicvideo

Changelog

⛰️ Features

  • (deezer) Add family account monitoring #344

🐛 Bug Fixes

  • (deezer) Fix error list access #344
  • (jellyfin) Fix options being required #469
  • (jellyfin) Allow all media types when allowUnknown is true #445
  • (No Category) Compatibility for old scrobbles #462
  • (No Category) Normalize state param for auth redirect URLs #443
  • (No Category) Allow musicvideo media type and use allowedMediaTypes for NowPlayingItem check #445

📚 Documentation

  • (plex) Add Musicbrainz stage guidance #447
  • (No Category) Make compose default tab for installation
  • (No Category) Update screenshot

⚙️ Miscellaneous Tasks

  • (docker) Add source OCI labels #463 thanks @Kernald
  • (No Category) Fix links in issue templates
  • (No Category) Remove unused dockerfile
  • (No Category) Update git-cliff workflow
  • (No Category) Bump lastfm-ts-api version

v0.11.2

What’s New?

Debugging Plays and Help

Plays found in the Source “Tracks Discovered” and Client “Scrobbled/Failed” lists now include a Debug button that, when clicked, copies a json object with data that can be used for troubleshooting issues with multi-scrobbler.

debug icon

At this stage the data is purely for me to help debug user issues. It should make reproduction of issues much easier and will provide insight into stage modifications. In the future the UI will include a Diff tool to help visualize Play changes over time for self-help.

Check the new Help docs for how to use this debug information to most effectively create an issue for Multi-scrobbler.

Full Changelog

Features

  • (scrobblers) Refactor scrobbling functions to capture transactional data
  • (No Category) Use json diff to track play changes
  • (No Category) Add debug copy action to ui

Bug Fixes

  • (librefm) Relax response content-type
  • (maloja) Fix logging objects
  • (musicbrainz) Check for undefined status #458
  • (plex) Do not use album artist MBID when existing artist or is VA #450
  • (sonos) Gracefully handle failure when fetching device state #455
  • (sonos) Check for UpnpClass existing #398
  • (No Category) TS typings for brainz meta and missed recording-track rename
  • (No Category) Deep clone discovered plays

Documentation

  • (No Category) Comment why compilations don’t work for maloja
  • (No Category) Add help docs and update github issue template with play debug data

Refactor

  • (sonos) Move device/group filters before track type checks to enable easier user workarounds

v0.11.1

What’s New?

Sonos Source

Sonos devices are now supported as Sources. MS can monitor all devices in your Sonos network given any device’s IP. MS supports multiple listening sessions based on device/zone.

Big thanks to @bkredell for the financial support that enabled me to purchase a speaker to do development with. Without this, the implementation would not have been possible.

ENV Config for all Sources

Previously, Sources that were also Clients could only be configured using File or AIO config. This was due to an old design decision that hasn’t been relevant for quite some time. 0.11.1 removes this superficial limitation so that all Sources can be configured using ENV config. Explicitly, these Sources now have ENV config available:

Memory Optimizations

Several optimizations to reduce memory usage should result in 30-50% less memory used, after startup is finished.

Prometheus Metrics

Multi-scrobbler now exposes a prometheus metrics endpoint with these data points:

  • Count of discovered plays per Source
  • Count of Queued/Scrobbled/Deadletter scrobbles per Client
  • Number of issues per Source/Client
    • If any of these metrics is > 0 it means your Source/Client is not operating normally

Musicbrainz Track Search and Plex

One of the MBIDs Plex can provide is a Track MBID, which is associated with a Recording and specific Release. 0.11.1 implements searching by this MBID (generically) and fixes parsing of this ID from plex. Sources that provide this can ensure that the exact album you want for a scrobble is used.

Note: Musicbrainz will not search by this id by default. You will need to use the basicOrIds search method to leverage the Track MBID.

Full Changelog

Features

  • (lastfm) Add response content logging #449
  • (musicbrainz) Search by track MBID using basicorids #447
  • (sonos) Implement Sonos Source #398
  • (sonos) Fix first media seen logging and add debug guidance to docs
  • (sonos) Add group/device filtering
  • (No Category) Add prometheus metrics #438
  • (No Category) Implement ENV config for clients as sources

Bug Fixes

  • (musicbrainz) Find correct release when release or track mbid is present
  • (prometheus) Set content type to plain text #438

Documentation

  • (sonos) Update admonitions
  • (tealfm) Update tealfm links
  • (No Category) Add missing default preset to quickstart MB instructions
  • (No Category) Add prometheus usage

Refactor

  • (musicbrainz) Rename recording mbid property to recording
  • (sonos) Add missing sonos source dynamic usage
  • (No Category) Add type label for prometheus metrics
  • (No Category) Use compiled json for schema in production
  • (No Category) Use dynamic import for components

Miscellaneous Tasks

  • (No Category) Add config types to issue template

v0.11.0

What’s New?

Libre.fm Source/Client

Mutli-scrobbler now supports Libre.fm as a Source and Client.

Additionally, if you are running your own Libre.fm instance there are options for defining your own instance as the endpoint.

Musicbrainz Search Improvements

When enhancing your scrobbles with Musicbrainz there are now 1) additional methods for searching and 2) an additional album sorting mechanism to bias matches towards the actual text from your original scrobble.

The order in which searches are executed has also been updated to be fully user-configurable. However, this is a breaking change if you previously had search-related file-config options (fallback*) or are using PRESETS ENV. See Breaking Changes below for how to migrate.

Breaking Changes

Musicbrainz Stage

If you are using the Musicbrainz Stage transformer with any of the following options then you will eventually need to update your config to maintain existing behavior:

  • File Config
    • fallbackAlbumSearch
    • fallbackArtistSearch
    • fallbackFreeTextSearch
  • ENV Config
    • MB_PRESETS

If none of these apply to you no action is required.

If these do apply to you: your existing configuration WILL continue to work but these options have been deprecated and will be removed in a future release. You should still migrate as soon as convenient.

In v0.11.0 Musicbrainz uses a searchOrder list to define the order that search methods are run in. See the Search Methods docs section for more information.

To migrate:

File Config

  • "fallbackAlbumSearch": true replace with "searchOrder": ["album"]
  • "fallbackArtistSearch": "native"
    • replace with "searchOrder": ["artist"]
    • and add "searchArtistMethod": "native" (or naive)
  • "fallbackFreeTextSearch": "true" replace with "searchOrder": ["freetext"]

The directions above assume you are using each option by itself. If you are using more than one then simply combine replacements.

EX using both fallbackFreeTextSearch and fallbackAlbumSearch, replace with "searchOrder": ["album", "freetext"]

You will likely also want to add isrc and basic search methods to the front of your searchOrder, as this emulates the previous MB search behavior:

"searchOrder": ["isrc","basic","album","freetext"]

ENV Config

  • MB_PRESETS=... add default to beginning of your list IE MB_PRESETS=default,native,sensible

Removed Deprecated Jellyfin Source

The old, webhook-based Jellyfin source has been deprecated since v0.8.4 (September 2024). It has not been in the documentation for well over a year. It has now been fully removed.

Removed Deprecated Plex/Tautulli Sources

The old webhook-based Plex and Tautulli (notification agent) Sources have been deprecated since v0.8.7 (October 2024). They have not been in the documentation for well over a year. They have now been fully removed.

Full Changelog

Features

  • (No Category) Librefm Source/Client #401
  • (musicbrainz) Improved missing mbid parsing and tests
  • (musicbrainz) BREAKING: Replace fallback search with searchOrder for more search control
  • (musicbrainz) BREAKING: Improve ENV presets
  • (musicbrainz) Add exclusive search by recording MBID #431 thanks @gabeklavans
  • (musicbrainz) Implement basic-or-ids search
  • (musicbrainz) Implement field scoring
  • (plex) Retrieve MusicBrainz IDs #426 thanks @owendaprile

Bug Fixes

  • (endpointlz) Mark play as new from source
  • (librefm) Log warning for empty account rather than throwing #401
  • (mpd) Add missing MPD envs to source building #432
  • (musicbrainz) Simplify config parsing and log original ids
  • (musicbrainz) Check for release data type before logging #434
  • (tealfm) Don’t define brainz artist array if empty
  • (No Category) Move preCompare transform hook for clients to the correct place in lifecycle #435
  • (No Category) Don’t mutate original error when merging cause stack for logging
  • (No Category) Remove cache assignment in child class
  • (No Category) Add missing undici dependency #437 thanks @jackwilsdon

Documentation

  • (musicbrainz) Update search methods
  • (No Category) Improve MB docs
  • (No Category) Add read-only install instructions #429 thanks @drake7707
  • (No Category) Re-style details and add custom admonition details component
  • (No Category) Use AdmonitionDetails

Miscellaneous Tasks

  • (No Category) BREAKING: Remove deprecated Jellyfin Source
  • (No Category) BREAKING: Remove deprecated Plex/Tautulli Sources

Testing

  • (lastfm) Improve artist and mbid parsing

v0.10.8

Changelog

Features

  • (tealfm) Implement service filtering and parse isrc/music service from records

Bug Fixes

  • (musicbrainz) Don’t assume duration is missing
  • (No Category) Convert MB length to seconds #423 #427
  • (rocksky) Fix generated name for ENV configured rocksky client #424 thanks to @SilverKnightKMA

Documentation

  • (No Category) Add valkey docker compose connection example

Refactor

  • (No Category) Move ISRC to main play data

v0.10.7

This release includes more accurate and granular Musicbrainz search, flow control for scrobble transformations, and secrets interpolation into config files.

What’s New?

Flow Control for Scrobble Enhancements

Stages for enhancing your Scrobbles now support Flow Control, enabling you to configure how Scrobbles are transformed based on the outcome of a Stage. Three properties are added to Stage configuration:

  • onSuccess (default continue) - If the Stage successfully finishes processing
  • onFailure (default stop) - If the Stage encounters an error while processing, or otherwise fails to achieve the transformation result
  • onSkip (default continue) - If the Stage does not process the Play data due to stage-level when or other stage-specific skip conditions

This enables more complex transformation scenarios like: only run Native Stage if Musicbrainz Stage fails to find a match.

More Musicbrainz Search Improvements

  • Album+title fallback search is now configurable, rather than automatic, using fallbackAlbumSearch
  • Search uses ISRC codes to match, if available. This will greatly improve matching when using the Spotify Source
  • Musicbrainz docs have been reworked for clarity and to add more examples.

Secrets Interpolation

Multi-scrobbler can now interpolate ENV values directly into any json config files using bracketed identifiers like [[MY_SECRET]].

This enables sensitive data to be removed from config files which should make using secrets injection platforms easier as well as committing configs to git safer.

Quickstart Musicbrainz

The Quickstart docs have been updated to include an optional step for setting up Musicbrainz via ENV.

Full Changelog

Features

  • (musicbrainz) Make fallback album search configurable #414
  • (musicbrainz) Search by ISRC before anything else #418
  • (transformers) Add onSkip flow control #414
  • (transformers) Log more transform stage detail for components
  • (No Category) Add additional metadata from spotify and for listenbrainz submissions #418
  • (No Category) Implement secret interpolation from ENV #420
  • (No Category) Log as WARN if there are unmatched interpolation keys

Bug Fixes

  • (musicbrainz) Throw errors on pre/post fetch so onFailure works as expected #414
  • (musicbrainz) Add missing duration logic
  • (spotify) Don’t report player state if spotify api doesn’t return an item #412
  • (transformer) Improve stage error logging
  • (transforms) Update types to allow json validation without type for user #267

Documentation

  • (transformers) Add Flow Control
  • (No Category) Add musicbrainz step to quickstart
  • (No Category) Better language for mb quickstart section
  • (No Category) Add config interpolation docs
  • (No Category) Better warnings for ENV interpolation
  • (No Category) Improve general transform docs

v0.10.6

Bug Fixes

  • (musicbrainz) Wrong default argument for preRequest
  • (transformer) Don’t try to build env transformer when no ENV exists

v0.10.5 - Musicbrainz Matching

What’s New?

Scrobble Enhancements Overhaul

Scrobble Enhancements, previously known as Scrobble Modifications, have gone through a complete rewrite in order to support more types of modifications and future extensibility.

There are now three types of enhancements, now referred to as Stages:

  • User Stage is the same functionality as the old Scrobble Modifications – define search-and-replace patterns to correct your scrobble data
  • Native Stage use more sophisticated, built-in heuristics to extract multiple artists from strings and clean up track titles
  • Musicbrainz Stage uses the Musicbrainz database to match your Scrobbles, correct bad data, enrich missing fields, and supply MBIDs to downstream Scrobble Clients.

If you were previously using Scrobble Modifications your existing configuration will work without any changes.

The overhaul also implements these new features:

  • Multiple stages can be created with different defaults, allowing you to define config once and apply it everywhere OR override for specific Sources/Clients
  • Stages are highly configurable to ensure your scrobble data ends up exactly how you want it
  • Stages can be combined sequentially
  • Presets for Native and Musicbrainz Stage allow ENV Config users to take advantage of Stages without requiring File Config

Musicbrainz

The Musicbrainz Stage Configuration provides many ways to configure matching that should cover most usecases.

However, if you find your scrobbles are not matching or an option is not working as expected, please turn on Debug Mode to log more information about what/how multi-scrobbler is trying to match. If you open an issue, please include this log information.

Quickstart Improvements

The Quickstart have been updated to include Source setup for Navidrome, Plex, and Last.fm as a Source.

Full Changelog

Bug Fixes

  • (lastfm) Fix network error default value
  • (plex) Fix library filter when media has no library #405
  • (tealfm) Allow DID identifier

Documentation

  • (transforms) Add default stage
  • (No Category) Fix kitchensink links
  • (No Category) Refactor transformer docs with stages
  • (No Category) Add musicbrainz stage
  • (No Category) Add native stage
  • (No Category) Add user stage
  • (No Category) Add more sources in quickstart

Features

  • (transform) Implement abstract transformer #365
  • (transform) Implement more exhaustive, human-readable transform diff
  • (transform) Add proper support for meta and duration transform parts
  • (transformer) Allow configuring artist parsing string sources #384
  • (transformer) Implement staggered api calls to respect rate limit
  • (transformer) Implement filtering and sorting of fetched musicbrainz recordings
  • (transformer) Implement country filter/priority for musicbrainz
  • (transformer) Add musicbrainz api url logging
  • (transformers) Implement applyng limited transform configs via ENV
  • (transformers) Implement user transformer
  • (transformers) Add native transformer #364 #384
  • (transformers) Add flow control to transforms #365
  • (transformers) Implement musicbrainz api client
  • (transformers) Implement musicbrainz transformer #362 #334

Miscellaneous Tasks

  • (No Category) Bump logging for bug fix

Refactor

  • (No Category) Move abstract init into own abstract class

Testing

  • (musicbrainz) Add basic sanity test
  • (tranformer) Add longer timeout and fix logger used in musicbrainz suite
  • (No Category) Add edge case musicbrainz tests

0.10.4

Bug Fixes

  • (rocksky) Round duration to integer to fix 400 on submit #400
  • (tealfm) Round duration to integer
    • Float duration did not prevent writing record to PDS but seems to improve compatibility with apps using tealfm data