Skip to content

Releases: FoxxMD/multi-scrobbler

v0.10.7

17 Dec 14:21

Choose a tag to compare

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

12 Dec 14:01

Choose a tag to compare

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

11 Dec 17:31

Choose a tag to compare

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

21 Nov 16:54

Choose a tag to compare

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

0.10.3

17 Nov 16:02

Choose a tag to compare

Bug Fixes

  • (rocksky) Fix wrong config value used for Rocksky API auth
  • (rocksky) Fix url path for token validation
  • (rocksky) Use duration_ms instead of duration since Rocksky ignores duration

0.10.2

13 Nov 17:40

Choose a tag to compare

What's New?

teal.fm Scrobble Client/Source

teal.fm is a social discovery and web viewing service for scrobbles stored/available on the ATProto network/your repository in a PDS (Personal Data Server).

This release includes a Client and Source implementation for teal.fm. #378

The teal.fm website is still in development and does not have a public release yet but you can start scrobbling, now, and your data wil be ready to use when they launch publicly.

Rocksky Client Fixes and Source

A fix for the previously-released Rocksky client #391 is included, as well as a brand-new implementation for both the Client and a new Source.

Notable QoL Improvements

  • Now Playing functionality is now more temporally-accurate for downstream scrobbler clients and in the UI #395
  • Subsonic Sources now have repeat detection implemented so your tracks are scrobbled mutliple times when you play them over and over again #375

Documentation Overhaul

Some of you may have already noticed but the docs at foxxmd.github.io/multi-scrobbler have been reworked to improve readability and add more information:

  • The monolithic configuration page has been split into separate pages/sections:
  • Scrobble Clients/Sources include a matrix of supported features and clearer breakdowns of what each feature means + configuration
  • Components have been refactored into reusable snippets which will make future documentation easier
  • The URL pattern for the entire site has been simplified by removing the docs/ prefix
    • All old pages should redirect to new pages, but if they don't please open an issue

Full Changelog

Bug Fixes

  • (endpointlz) Return expected OK response body #380
  • (listenbrainz) Use duration_ms if duration not provided
  • (listenbrainz) Fix interfaces for submit/listen and consolidate
  • (rocksky) Add scrobble to deadletter when ignored
  • (tealfm) Fix scrobble play date context
  • (No Category) Fix Source/Client data types
  • (No Category) Improve timing and update frequency to match scrobbler behavior #395

Documentation

  • (endpointlz) Add navidrome url setup instructions
  • (tealfm) Add docs
  • (No Category) Move landing page to docs to simply url structure
  • (No Category) Add commonly used components to global scope
  • (No Category) Move Source configs to own files
  • (No Category) Add client own files
  • (No Category) Reorganize doc contents
  • (No Category) Improved linking on config/landing and configuration type refinement
  • (No Category) Change installation to category doc link
  • (No Category) Update kitchensink
  • (No Category) Improve sources documentation
  • (No Category) Add redirects for old pages
  • (No Category) Add subsonic guidance for lz scrobbling

Features

  • (endpointlz) Add more logging for invalid routes
  • (jellyfin) Add frontend url override as env #374
  • (listenbrainz) Use end-of-string token and wildcard route to better log malformed LZ endpoint routes
  • (listenbrainz) Add request body to logging for debugging
  • (rocksky) Implement Rocksky Source/Client
  • (subsonic) Add basic repeat detection based on listened duration #375
  • (tealfm) Implement app password auth
  • (tealfm) Massage handle for users who don't read docs
  • (No Category) Implement working tealfm client
  • (No Category) Make ATProto handle transform usable by RockSky and teal.fm

Miscellaneous Tasks

  • (frontend) Update sass package and vite config to remove deprecation warnings
  • (No Category) Update schema

Refactor

  • (frontend) Update tailwind and move generation into vite
  • (frontend) Migrate tailwind config to v4
  • (listenbrainz) Move parsing functions out of static
  • (listenbrainz) Consolidate lz endpoint submit parsing into lz response parsing
  • (tealfm) Move common functionality to api client

Testing

  • (No Category) Use zizmor to fix and audit image publish action
  • (No Category) Harden remaining workflows using zizmor

v0.10.1

30 Oct 13:25

Choose a tag to compare

What's New?

Rocksky Client

Rocksky, a music tracking and discovery platform built on the AT Protocol (Bluesky) has been added as a client to the docs. It uses a listenbrainz-compatible API so multi-scobbler users can set it up as a regular Listenbrainz Client with a custom URL.

A future release will see a Rocksky Source as well, so you can mirror scrobbles from your PDS to another service.

Full Changelog

Features

  • (JellyfinApiSource) Add option to override the Jellyfin base url used in the frontend #374 by @wolffshots
  • (listenbrainz) Add source as music service name #369 by @h-wb
  • (plex) Enable accepting self-signed certs #372 (#373)

Bug Fixes

  • (notification) Parse and use the tags in Apprise config #369 by @gabeklavans
  • (plex) Use better url parsing method

Documentation

  • (No Category) Add Rockysky setup instructions
  • (No Category) Update listenbrainz json example to include url

Miscellaneous Tasks

  • (JellyfinApiSource) Extract URL replacement to func and add tests

Testing

  • (No Category) Add more tests for url parsing

v0.10.0

23 Sep 16:12

Choose a tag to compare

What's New?

Persistent Queue/Failed Scrobbles

This release implements persisted data across multi-scrobble restarts. Initial support will be for Queued and Failed Scrobbles.

This means that MS will save any Plays that have not successfully been scrobbled to Clients. They will be restored when MS is restarted.

This functionality is enabled by default so no configuration changes are required. Scrobble data will be saved in the existing CONFIG_DIR directory bound into the docker container.

Data can be persisted to file (default) or Valkey. See the docs for more information and configuration.

This is a non-breaking change but the app version has been bumped to signify major functionality updates.

Youtube Music Auth Issues

Google/YT seems to have permanently broken authentication using the Oauth client method for Youtube Music. However, cookie authentication is still working and a simpler process.

If you are using Oauth and encounter 400 errors please switch to cookies instead.

Full Changelog

Bug Fixes

  • (jellyfin) Guard against undefined NowPlaying Path
  • (lastfm) Remove VA from album artist #340
  • (lastfm) Full destructure recent response and log respon on error #353
  • (listenbrainz) Fix missing album/release_name for listenbrainz endpoint #342
  • (No Category) Add additional logging for ytm history request #346 #345
  • (No Category) Do not use transform until after client is ready #356
  • (No Category) Add full coverage for cached queue updating during client lifecycle
  • (No Category) Update object hashing function #358

Documentation

  • (ytm) Add oauth warning #346 #345
  • (No Category) Remove koito from listenbrainz example
  • (No Category) Add caching docs

Features

  • (lzendpoint) Accept artist and release artist names in submit payload
  • (ui) Add Now Playing behavior for ui Player #338
  • (webscrobbler) Use Now Playing Player #338
  • (ytm) Add debug logging #346 #345
  • (ytm) Allow user-defined oauth scopes #346 #345
  • (No Category) Change stale/orphan interval to match current play duration for Players that only track Now Playing data #352
  • (No Category) More artist parsing improvements
  • (No Category) Improve artist string parsing
  • (No Category) Add Access Token auth for Ntfy webhook #350
  • (No Category) Implement caching backend
  • (No Category) Implement cache file streaming with progress logging

Miscellaneous Tasks

  • (No Category) Bump logging version
  • (No Category) Update iti usage
  • (No Category) Bump with-local-tmp-dir version
  • (No Category) Remove unused object-hash package

Refactor

  • (No Category) Refactor di cache to allow singleton or transient

Testing

  • (ytm) Fix failing type assertion
  • (No Category) Fix/workaround tests for new transformrule assumptions
  • (No Category) Add scrobble client caching test

Build

  • (vscode) Update devcontainer to use compose stack with valkey for caching integration
  • (No Category) Move net-interceptor to dev packages

0.10.0 RC1

17 Sep 13:51
c8c3b48

Choose a tag to compare

0.10.0 RC1 Pre-release
Pre-release

What's New?

Persistent Queue/Failed Scrobbles

This release implements persisted data across multi-scrobble restarts. Initial support will be for Queued and Failed Scrobbles.

This means that MS will save any Plays that have not successfully been scrobbled to Clients. They will be restored when MS is restarted.

This functionality is enabled by default so no configuration changes are required. Scrobble data will be saved in the existing CONFIG_DIR directory bound into the docker container.

Data can be persisted to file (default) or Valkey.

This issue contains more instructions on customizing persistence configuration and guidance for using Valkey. Please use the issue for reporting any feedback or issues.

v0.9.11

20 Aug 13:26

Choose a tag to compare

What's New?

Maloja Source

Implemented Maloja as a Source 🎉 #295

All Clients can now also be used as Sources so you have full freedom to scrobble to any service with the ability to relay to any other service!