What's New?
New UI ๐
Multi-Scrobbler has a new UI that has been completely rewritten from scratch!
This is the same UI that has been in preview for awhile. It now completely replaces the old UI. In conjunction with replacing the UI, all the old UI code and associated API endpoints have been ripped out, removing 4400 lines of code and 15 dependencies.
The UI refresh has been a long time coming: #500 was opened March 24 and was the impetus for both the database and queue overhaul implementation. The kinds of features I wanted to see in the UI would not have been possible without these prerequisites so it has spurred much of the quality upgrades for MS over the last half year.
A HUGE thank you goes out to everyone who has helped test the new UI and all its features, giving me feedback on design and exposing bugs. Especially @4rft5 ๐
There is still much to improve with the new UI so look out for new features coming soon!
Musicbrainz User Agent
Like with the Listenbrainz User Agent change from 0.17.2, contact is no longer required for configuring the Musicbrainz API for transformer use. If you are using this API you do not need to make any changes to continue using it, but you can remove contact if you want to.
If you only have the contact field for your aio confg and want to remove it, replace it with "enable": true.
Musicbrainz Rate Limit Improvements
0.17.0 introduced BrainzMash as a recommended, supplementary Musicbrainz server to increase transformer throughput but the API rate limiting functionality in Multi-Scrobbler still enforced it, and other non-official servers, with the same rate limits as the official Musicbrainz server.
This functionality has been overhauled to be both optionally configurable and load balanced based on rate limit capacity.
Configuration
Set the max requests within seconds-based time frame in your MB API config:
"apis": [
{
// uses default Musicbrainz server https://musicbrainz.org
// hard-limited to 1req/s
"enable": true
},
{
// non-official musicbrainz server
"url": "my.mb.server",
"rate": {
"requests": 6, // max number of requests
"perTime": 1 // can be made within X number of seconds
}
}
]- Official Musicbrainz server is hard-limited to max 1req/s
- Brainzmash is hard-limited to max 4req/s
- Other, custom Musicbrainz servers default to 1req/s but have no hard limit
Load Balancing
Based on the rate limits you set, or that are hardcoded based on the above, Mutli-Scrobbler will automatically load balance requests between your servers based on which has the most number of requests left for the time span.
Subpath Deployments
For users deploying Multi-Scrobbler behind a reverse proxy, subpaths are now supported using BASE_URL env.
To deploy to https://mydomain.com/multi-scrobbler:
services:
multi-scrobbler:
# ...
environment:
- BASE_URL=https://mydomain.com/multi-scrobblerFurther setup is required if you also need self-hosted docs, see Base URL guidance in the installation docs.
Other Changelog Highlights
โฐ๏ธ Features
- (db) Check for existing play by parent hash
- (No Category) Add hash regeneration migration
๐ Bug Fixes
- (dedup) Match backlog plays against live-tracked duration window #709 @plttn
- (dedup) Anchor the duration/listenedFor window on playDate, not the SOC-adjusted date #709 @plttn
- (listenbrainz) Try to coerce tracknumber to number #705
- (source) Don't mark oldest of set of duplicate inputs as a duplicate of the newer inputs #707
- (spotify) Backfill missing ISRC from real-time polling endpoints #703 @plttn
- (No Category) Regenerate play hash and mbid columns on play entity update db operaiton
๐ Documentation
- (endpointlfm) Add API docs callout
- (endpointlz) Add api doc callouts and summaries to popular apps
- (endpointz) Add tidal hi-fi guidance
- (webscrobbler) Add api docs callout
- (No Category) Remove contact from listenbrainz example config file
- (No Category) Update express-typed-router for pathExample handling
- (No Category) Update development docs to reflect current architecture and implementation
๐ Refactor
- (No Category) Consolidate repo hydration and existing play function
- (No Category) Consolidate play queuing into abstract component
- (No Category) Consolidate ingress queue pre/post processing into abstract component