Releases: FoxxMD/multi-scrobbler
v0.14.1
Important
Release 0.14.0 contains breaking changes. Read the Upgrade Path docs and 0.14.0 Release Notes before upgrading from Multi-Scrobbler earlier than 0.14.0!
Full Changelog
🐛 Bug Fixes
- (ui) Update JSX namespace to fix missing ambient in react 19
- (No Category) Fix argument order for logger labels
- (No Category) Add missing artist credit transforms causing Navidrome Source plays to create errors #613
⚙️ Miscellaneous Tasks
- (No Category) Re-generate lock file
v0.14.0
Important
This release contains breaking changes. Read the Upgrade Path docs before upgrading. The migration should be simple for the majority of users.
Summary:
- You should add ids to your Sources/Clients
- If you have queued scrobbled these will be automatically migrated
- If you have any Cache settings you will need to review the guide before upgrading
What's New?
I am excited to release Multi-Scrobbler 0.14.0 🎉 This is one of the largest releases for MS in years which significantly rewrites large portions of MS's architecture to allow it to scale in preparation for even more exciting, near-future functionality like the upcoming ui overhaul and eventual bulk scrobble transfer feature (move all your scrobbles from Client X to Client Y).
Stats for this release:
- 158 commits
- 243 files touched
- +15,400 additions
- -4,200 deletions
- No AI was used during development. This is organic, free-range coding.
I want to acknowledge and say a big thank you to all the users who helped test and give feedback during this release process. Your input, patience, and reporting was invaluable ❤️ :
@4rft5 @FestiveByteRider @gabeklavans @psyciknz @DigitalStarSys @owendaprile @timmyhbk @Sioeen @Ectalite @HStep20
Backend Overhaul
This release introduces a huge architectural upgrade for the backend: almost all data is now backed by a sqlite database powered by drizzle.
Some visible change highlights:
- Discovered plays (from sources) are persisted
- Backlogged, already discovered plays are not re-sent to clients on each startup (they are found in database and ignored)
- Scrobbled plays (successfully sent by clients) are persisted
- Reduces dupe scrobbles since identical scrobble data in MS can now be compared across restarts
- Database migrations are automatic and also automatically make a backup of your database before upgrading
- All queues and Plays are now managed in database instead of in-memory
- Reduced memory usage in all usecases
- Drastically reduced memory when there are many sources/client (5+) or many queued scrobbles (100+)
- Source and Client statistics are persisted
- (breaking) Simplified cache configuration to leverage database where feasible
To prepare for database usage in 0.14.0, please read the Upgrade Path docs.
The migration should be simple for the majority of users. For edge cases and power users, the docs cover how to migrate more advanced settings.
Documentation Improvements
The introduction of the database forced a good look at, and cleanup of, the existing docs. Application-wide config should now be easier to read and the kitchensink examples are now more straight-forward and relevant to common usecases.
Other Changes (Changelog Highlight)
⛰️ Features
- (database) Implement database structures needed for historical plays
- (database) Track component last ready and last active at
- (tealfm) Add now playing support with
fm.teal.alpha.actor.statusby @HiiJax 🎉 - (tealfm) Update lexicon defs with new mbid uri format teal-fm/teal#102
- (now playing) More robust handling of clients with real time status updates (teal, discord) #608
- (now playing) reduced logging noise
- (lastfm) bypass scrobble rejection for very short tracks (< 30 seconds) by omitting duration #596
- (No Category) refactor artists to directly map/associate MBIDs
⚙️ Miscellaneous Tasks
- (No Category) update all dependencies #594 by @philocalyst 🎉
📚 Documentation
- (lastfm) Document 2 week scrobble window
- (No Category) Overhaul kitchensink
- (No Category) Add
_IDand_NAMEexamples to all instances of ENV configs - (No Category) Add
idto all instances of file/aio configs - (No Category) Add more descriptive error logging for example config file parsing
0.14.0 Beta 3
Important
This is a beta release for 0.14.0
The 0.14.0 release contains breaking changes.
See the Release Notes for Beta 1 for upgrade instructions before using this release.
Changes Since Beta 2
⛰️ Features
- (tealfm) Update lexicon defs with new mbid uri format teal-fm/teal#102
- (No Category) Make artist name to credit function more robust
- (now playing) More robust handling of clients with real time status updates (teal, discord) #608
🐛 Bug Fixes
- (jellyfin) Handle string or object data for album props when parsing to play
- (listenbrainz) Fix artist credit mapping for minimum track data
- (now playing) Fix accessing undefined play when source player state is reported but without any data #608
0.14.0 Beta 2
Important
This is a beta release for 0.14.0
The 0.14.0 release contains breaking changes.
See the Release Notes for Beta 1 for upgrade instructions before using this release.
Changes Since Beta 1
⛰️ Features
- (database) Implement database structures needed for historical plays
- (database) Track component last ready and last active at
- (tealfm) Add now playing support with
fm.teal.alpha.actor.statusby @HiiJax 🎉
🐛 Bug Fixes
- (docs) Fix missing comma in discord config example
- (scrobbler) Fix migrated play not being added to queue
- (scrobbler) Fix try-catch block so queued scrobble is still added if queue check fails unexpectedly
- (No Category) Add missing sort order to failed/scrobbled api calls
- (No Category) Guard against old/bad cached listen range data
📚 Documentation
- (lastfm) Document 2 week scrobble window
- (No Category) Overhaul kitchensink
- (No Category) U{p => t}most typo by @nabijaczleweli 🎉
- (No Category) Add more descriptive error logging for example config file parsing
0.14.0-beta.1
0.14.0 Beta 1
Important
This is a beta release for 0.14.0
I am personally using this build in production but there may still be bugs. Please help test this pre-release build and report any bugs, errors, or unexpected behavior in the pre-release issue.
Additionally: use the preview docs when using this build as there have been documentation changes.
Warning
This release contains breaking changes. Read the Upgrade Path docs before upgrading.
Summary:
- You should add ids to your Sources/Clients
- If you have queued scrobbled these will be automatically migrated, but watch for issues
- If you have any Cache settings you will need to review the guide before upgrading
What's New?
Backend Overhaul
0.14.0 represents a huge architectural shift for the multi-scrobbler backend: almost all data is now backed by a sqlite database powered by drizzle.
Some visible change highlights:
- Discovered plays (from sources) are persisted
- Backlogged, already discovered plays are not re-sent to clients on each startup (they are found in database and ignored)
- Scrobbled plays (successfully sent by clients) are persisted
- Reduces dupe scrobbles since identical scrobble data in MS can now be compared across restarts
- Database migrations are automatic and also automatically make a backup of your database before upgrading
- All queues and Plays are now managed in database instead of in-memory
- Reduced memory usage in all usecases
- Drastically reduced memory when there are many sources/client (5+) or many queued scrobbles (100+)
- Source and Client statistics are persisted
- (breaking) Simplified cache configuration
There are many more non-visible changes that complete the foundation required for the upcoming ui overhaul and eventual bulk scrobble transfer feature (move all your scrobbles from Client X to Client Y).
Other Changes
Some "regular" bug fixes and improvements are folded into this release:
- (lastfm) bypass scrobble rejection for very short tracks (< 30 seconds) by omitting duration #596
- (lastfm) increase logging on connection for better debugging
- refactor artists to directly map/associate MBIDs
- update all dependencies #594 thanks @philocalyst
- (nowplaying) reduced logging noise
0.13.3
What's Changed
🐛 Bug Fixes
- (transform) Fix bad usage of cache potentially causing older-timestamped plays to be returned when newer play data was identical
- (spotify) Don't use platform creation timestamp as
stateLastUpdatedAt, fixes spotify player accidentally going stale while still active
⚙️ Miscellaneous Tasks
- (lastfm) Increase connection test timeout for slow networks and add DNS resolution logging
v0.13.2
What's New?
Discord Improvements
- Fall back to using release group MBID to retrieve album art if the defined release does not have associated art
- Use zero-width padding to allow single-character titles
Fresher Now Playing
For Sources that support multi-platform (plex, jellyfin), MS will more aggressively mark players as stale when there has been no activity but the Source still reports a player is alive. It will also switch Now Playing to the player that has actual activity if the "current" Now Playing player goes inactive (paused, stopped, stale).
Duplicate Scrobble Detection Docs
A new section in the docs has been added that goes into depth on:
- How MS detects duplicate scrobbles
- Configurations that won't cause dupes
- Configurations that MAY cause dups
- Solutions for avoiding these scenarios
Full Changelog
⛰️ Features
- (discord) Implement fallback to release group art if present #578
- (endpointlz) Add stubbed playing-now route to make some clients happy(er) #579
- (endpointlz) Implement proper username handling for validate and now-playing routes #579
- (lastfm) Add more logging to auth process and clean up host detection
- (mpd) Rewrite with newer MPD client for better payload parsing #574
- (player) Skip stale updates based on state timestamp and prevent dead players from being created from stale updates
- (source) Add timestamps to play state to track player and play last updated, if present
🐛 Bug Fixes
- (cache) Explicitly define auth/metadata as memory when testing file caching
- (discord) Include known spotify cdn for media providers #569
- (discord) Workaround activity minimum character limit #578
- (endpointlz) Fix fallback route not returning a response
- (lastfm) Fix total results reporting for librefm
- (now playing) Prefer fresher players #480
- (player) Initialize player state in the past to prevent false positive on stale update check if update happens at the same time player is initialized
- (transformer) Try-catch cached steps and fallback to non-cache generation
- (webscrobbler) Convert express wildcard path to regex #583
- (No Category) Check undefined on correct property #567
- (No Category) Simplify listenrange usage
- (No Category) Fix missing await on stagger mapper initial sleep
- (No Category) Workaround for old play structure
📚 Documentation
- (mpd) Add permission guidance
- (No Category) Add base site env detection for cloudflare pages
- (No Category) Order BASE_SITE first to allow overriding other envs
- (No Category) Fix missing backticks causing template errors on version equality
- (No Category) Try to replace canonical urls for github.io with new site
- (No Category) Add duplicate scrobble guidance
- (No Category) Remove extra dupe detection section from client overview
🚜 Refactor
- (No Category) Replace fast-deep-equal with fast-equals #569
🧪 Testing
- (player) Fix incorrect variable used for advanced timestamp
⚙️ Miscellaneous Tasks
v0.13.1
v0.13.0
What's New?
Yandex Music Source
Thanks to @Druidblack for implementing a new source for the Yandex Music service! 🎉
Check the docs for setup and configuration.
Improved Source/Client Restart
An overhaul of the functionality responsible for Source polling and Client scrobble processing makes restarts from the dashboard cleaner and more dependable. There shouldn't be any more instances of unable to restart due to waiting for signal... 🎉
New Docs Domain and Social Previews
Docs are now "officially" located at https://docs.multi-scrobbler.app
Note
The old site at https://foxxmd.github.io/multi-scrobbler will continue to work and both sites are the same documentation. Eventually, the old site will be retired and redirect to the new one automatically.
Docs have also been improved with nice social graph preview images (og:image) that will display when a page is shared on a social site. There are images generated for each page that include the page title and/or description.
Tip
You can help improve these cards:
- click the ✏️ Edit this page link at the bottom of any page to open the corresponding file in the repo
- open a PR (or click Pencil Icon at the top of the file) and fill in the
descriptionortitleproperty
Docker Log Colors
Logs viewed through docker logs now have ~f a n c y~ colors that mirror what is seen in the dashboard.
These are turned on by default but if you prefer plain logs they can be disabled by setting this environmental variable:
COLORED_STD=false
Image Cleanup Space Savings 🧹
Fixing how the frontend is served from the backend enabled almost all frontend packages to be removed from the production build. This, along with a node_modules cleanup script, results in a ~32% decrease in docker image size.
Breaking Changes
Important
BREAKING: Node has been updated to 24.14.0. This does not affect docker users but if you are running a local installation you will need to update your local node/npm install.
Changelog Highlights
⛰️ Features
- (client) Make scrobble processing abortable
- (client) Strict ENV types
- (docker) Use prune-mod to remove unneeded files in image
- (docker) Make colored console output the default
- (docs) Update docusaurus to 3.9.2
- (musicbrainz) Handle rate limiting within api calls
- (source) Make discover abortable
- (sources) Better type enforcement
- (yandex) add yandex music by @Druidblack #523
🐛 Bug Fixes
- (jellyfin) Fix typo on devicesBlock env assignment #522
- (scrobbler) Fix stagger map generation variable usage
- (No Category) Fix circular dependency in error utils
- (No Category) Align dockefile and devcontainer node/npm versions to fix lockfile mismatch
- (No Category) Initialize plays in correct scope
- (No Category) Build vite-express config based on production env to avoid making vite fallback to development
⚙️ Miscellaneous Tasks
- (No Category) Remove unused testing libraries and fix storybook version
- (No Category) Update node/npm engine constraints in package.json
- (No Category) Bump node to 24
- BREAKING: Bump node to 24
📚 Documentation
- (No Category) Add Yandex Music Source docs
- (No Category) Replace instances of foxxmd.github.io
- (No Category) Finalize a working social card strategy
🚜 Refactor
- (No Category) Implement abortable source polling
- (No Category) Reduce docker image by moving frontend packages to devDependencies
- (No Category) Install expressjs@5
- (No Category) Replace awaitjs/express with express usage
🧪 Testing
- (No Category) Make loop stop wait time configurable so tests run faster/more stable