Releases: FoxxMD/multi-scrobbler
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(defaultcontinue) - If the Stage successfully finishes processingonFailure(defaultstop) - If the Stage encounters an error while processing, or otherwise fails to achieve the transformation resultonSkip(defaultcontinue) - If the Stage does not process the Play data due to stage-levelwhenor 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
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
0.10.3
0.10.2
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:
- Main, general configuration
- Scrobble Clients section with overview and separate pages for each Client
- Scrobble Sources section with overview and separate pages for each Source
- This should additionally make searching easier since clients/sources show up under their own header instead of as excerpts under a huge configuration section
- 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
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
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
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.