Skip to content

Releases: FoxxMD/multi-scrobbler

0.9.7

07 Jul 12:44

Choose a tag to compare

What's New?

Now Playing

Multi-scrobbler can now report the currently playing track (Now Playing) for scrobble services that support this functionality -- Last.fm and Listenbrainz.

This functionality is default enabled for all clients but can be configured globally through ENVs or individually per-client. Consult the docs to see how this functionality works and how it can be customized.

Thanks to @msparkles for the PR providing initial support for this feature! 🎉

Full Changelog

Features

  • (subsonic) Implement filtering plays by user in #319
  • (lastfm) Now Playing by @msparkles in #316 #164
  • (listenbrainz) Implement Now Playing functionality #74
  • (listenbrainz) Include more ids/fields in submit additional_info #311
  • (No Category) Add config source to startup logging #309

Bug Fixes

  • Guard against undefined type in config.json #310

Documentation

  • Improve example config rendering for ambiguous configs #310

Now Playing Release Candidate 1

03 Jul 15:18

Choose a tag to compare

Pre-release

What's New?

This is a pre-release that introduces Now Playing functionality for Last.fm and Listenbrainz scrobble Clients. Please see this comment for MS behavior/configuration for this functionality and report any issues, thanks.

v0.9.6

20 Jun 20:11

Choose a tag to compare

What's New?

This is a minor update to improve the scrobbling capability of Listenbrainz scrobblers (Koito) when a track has multiple artists (#312). Nothing new otherwise!

v0.9.5

19 Jun 16:37

Choose a tag to compare

What's New?

Deezer ARL Source

Thanks to @Ectalite providing a premium account for development, as well as a proof of concept for accessing Deezer with ARL, the previously deprecated Deezer Source now has a new, working implementation! 🎉

See the documentation for setup and configuration

This new implementation comes with a few caveats to be aware of:

  • Only works with a premium account because Deezer only records full plays of a track which is a feature only available with premium
  • The method for accessing Deezer's API (ARL), while widely used by other projects, is unofficial:
    • Deezer may break this functionality at any time
    • Using it likely violates Deezer's TOS. Use this method at your own risk.

If you have any issues with Deezer reporting duplicate plays when using third party devices (Sonos), see the docs to tweak detection behavior.

Full Changelog

Features

  • (deezer internal) Add fuzzy discovery ignore option
  • (No Category) Implement Deezer Internal (ARL) Source #296
  • (No Category) Fuzzy diff threshold configurable
  • (No Category) Implement better during/range temporal comparisons

Documentation

  • (deezer) Rewrite Deezer Source with ARL implementation

0.9.4

16 Jun 19:29

Choose a tag to compare

What's New?

Initial Koito Implementation

Multi-scrobbler now supports Koito, a new scrobbler application, as both a Client and a Source using the existing Listenbrainz implementation.

Use a Listenbrainz configuration, as a Client or Source, with a custom url pointing to the Koito scrobble endpoint like http://your_koito_server/apis/listenbrainz/1.

A more fully-featured, independent, Koito implementation will be introduced in a future release.

Full Changelog

Features

  • (jellyfin) Add musicbrainz metadata #297
  • (listenbrainz) Detect /1/ version prefix on base URL
  • (listenbrainz) Implement limited support for Koito as Listenbrainz Source/Client #300

Bug Fixes

  • (listenbrainz) Normalize URL and join parts correctly

v0.9.3

29 May 13:30

Choose a tag to compare

What's New?

Removed Flatpak

Flatpak has been a technical burden that has not gotten easier to maintain since its inception. Due to being a tiny percentage of the install base, and a disproportionate developer effort for this percentage, I have decided to drop support for this installation method.

You can read more about the challenges MS has had with Flathub here. If anyone is willing to contribute and maintain a flatpak distribution I would be willing to support it again.

Fixes for Plex

Previous refactoring to introduce real-time player emulation has had a few kinks since implementing the new Plex Source, mainly due to some inconsistencies with how Plex reports duration and playback position. This release includes a few fixes that should resolve these bugs and make the Plex Source more stable.

Full Changelog

Bug Fixes

  • (plex) On Plex webhook routes filter plex sources to get webhook source only #291
  • (ui) Guard against null listenedDuration #285
  • (No Category) Fix NaN and undefined initial states for rt player #292

Documentation

  • (No Category) Remove flatpak installation method #287

Miscellaneous Tasks

  • (No Category) Update flatpak description
  • (No Category) Update devcontainer to node 20 to match docker image

Testing

  • (No Category) Fix real time player not triggered during event loop

0.9.2

25 Mar 01:33

Choose a tag to compare

What's New?

So many new Sources! With this release Multi-Scrobbler now supports 20+ Sources!

Additionally, many improvements to resuming scrobbles from long-lived Sources have made their way into this release. Users who keep their players open for long periods should see less false positive scrobbles.

Listenbrainz and Last.fm "Scrobble Endpoint" Sources

Multi-scrobbler can now "pretend" to be a custom Listenbrainz or Last.fm server so that your apps that support scrobbling to custom endpoints for these services can now use Multi-scrobbler instead. See Source configuration for Listenbrainz (Endpoint) and Last.fm (Endpoint).

Azuracast Source

Monitor an Azuracast radio station and scrobble tracks when it is live, has X number of listeners, or manually from the UI.

Icecast Source

Monitor an Icecast or Shoutcast radio station and scrobble tracks automatically or manually from the UI.

Yamaha MusicCast

Scrobble from Yamaha receiver/devices that support the MusicCast service. Currently supports any music played from USB/Network/CD inputs.

Changelog Highlights

Bug Fixes

  • (player) Check for 0 duration before finalizing listen session with duration-based calculation
  • (source) Do not calculate polling interval decrease if duration does not exist
  • (ui) Update status indicator for ingress sources
  • (ytm) Recover artist/album from YTM when not surfaced by youtube.js #280
  • (No Category) Missing optional period on vs. when parsing artist
  • (No Category) Filter components by name and check for undefined #273
  • (No Category) Use last known position for final range when cleaning up stale RT player
  • (No Category) Better handling of 0 duration tracks

Documentation

  • (No Category) Fix extra array in title modification example
  • (No Category) Add primary artist extraction examples for scrobble modification

Features

  • (azuracast) Add azuracast source implementation
  • (icecast) Implement Icecast Source
  • (lastm) Implement Lastfm endpoint source
  • (listenbrainz) Implement LZ endpoint source
  • (musiccast) Implement MusicCast Source
  • (source) Add stale/orphaned intervals as user configurable
  • (source) Clear listening range on stale to prevent erroneous scrobble on resume
  • (source) Add relative time since last activity to logging
  • (No Category) Use human-friendly timestamp for stale/ophan interva logging
  • (No Category) Add ENVs for default scrobble threshold for duration/percent

Miscellaneous Tasks

  • (No Category) Add more log guidance on bug report
  • (No Category) Bump YTM dependency version
  • (ci) Add context to build-push so it uses checked out PR ref

Testing

  • (No Category) Add modification example for parsing a primary artist from delimited string
  • (No Category) Add tests for scrobble behavior when cleaning up players

Full Changelog: 0.9.1...0.9.2

v0.9.1

21 Jan 15:11

Choose a tag to compare

What's New?

Fix Spotify Bug

A bug introduced with 0.9.0 could cause the last Spotify scrobble to fail if the player became stale. 0.9.1 fixes #254

Github Actions and Install Improvements

Project setup (npm install, etc..) now has an optional, parallel track that installs the application and builds the docsite at the same time. This, along with upgrading Docusarus to leverage @docusaurus/faster, has greatly reduced the time it takes to build MS from scratch.

Additionally, MS now uses a refactored Github Actions workflow that leverages a native ARM runner instead of emulating the ARM docker build, as well as parallelizing the build.

The end result is a workflow runtime on GHA that decreased from 20 minutes to 4 minutes 🎉

Changelog Highlights

  • docs: Update to Docusaurs 3.6 to improve build times by @FoxxMD in #251
  • feat(docker): Paralellize npm install and build processes by @FoxxMD in #252
  • Implement multi-runner image build for multi-arch improvements by @FoxxMD in #246
  • fix(spotify): Generate played object from cleanup with correct TS by @FoxxMD in #255

Full Changelog: 0.9.0...0.9.1

v0.9.0

15 Jan 16:09

Choose a tag to compare

What's New?

It's a big release! Happy 2025!

Youtube Music

Auth Fixes

Migrated YTM source communication from youtube-music-ts-api to youtubei.js which is actively developed and has fixed code for authenticating with cookies. Users using cookies are recommended to refresh their cookies using the newer guidance in the docs to help ensure they are not invalidated.

This new library also supports OAuth authentication which may be a more stable alternative for users experiencing constant authorization failures.

Scrobble Improvements

The code used for detecting YTM history has been overhauled with more sophisticated change detection which should prevent more false positive scrobbles. If you still experience scrobble issues please read through the updated FAQ section for YTM to enable detailed logging and guidance on how to report these issues in a useful way.

ENV Support

YTM source config now has full ENV support.

Plex and Jellyfin Improvements

A number of bugs related to the new Jellyfin and Plex API sources have been fixed which should incidentally improve scrobbling experiences for all polling-type sources.

DEPRECATION: The legacy (webhook-based) sources for Jellyfin, Plex, and Tautulli have all now been officially deprecated. These will be removed in an upcoming release. If you are still using these (from MS < 0.8.4) please consult the respective configuration docs for migration steps and migrate as soon as possible.

Improved Source/Client Start and Restart

Code related to initializing and restarting sources/clients has been overhauled to enable restart from basically any error state. You should no longer need to restart multi-scrobbler in the event a single component fails. The UI now includes a

Restart (Force)

button on each component. Using Force will cause the component to be initialized from scratch.

Incidentally, this overhaul paves the way for eventually reloading config changes into MS without restarting, in a future release. 👀

Debug Mode

A new, global Debug Mode option has been implemented to help with troubleshooting multi-scrobbler. Instead of needing a file configuration to enable optional, "debugging" options for logging on a specific component, etc... users can now simply use the ENV DEBUG_MODE=true to enable all options at once. This can also be configured from the AIO config.json. See the new Debug Mode docs.

Config Explorer and Validation Improvements

The new configuration migration from v0.8.7 has enabled improving the built-in configuration explorer found in the docs. The explorer is now always up to date with whatever docker tag or branch it is used on and is automatically generated on docs build. The explorer should also now have more friendly names and a simpler structure making it actually useful.

Changelog

Bug Fixes

  • (jellyfin) Fix missing check for undefined play #239
  • (plex) Use track artist from response data when album artist is present #241
  • (source) Implement player cleanup with play discovery for stale platforms #223
  • (spotify) Album artists no longer missing @Fratt
  • (ui) Wording for non-polling sources start/restart
  • (ytm) Implement bump-only list change detection #248 #227 #228 #226
  • (ytm) Use diff type to restrict valid history changes #248 #227 #228 #226
  • (ytm) Compare recent changed history to detect outdated responses #248 #227 #228 #226
  • (No Category) Fix WARN: FromAsCasing: 'as' and 'FROM' keywords' casing do not match @CodeWithMa
  • Remove deprecated version from docker-compose.yml @CodeWithMa
  • (No Category) Default positional listen range to 0 position if none is provided #245

Documentation

  • (ytm) Add new auth docs and update FAQ
  • (ytm) Clearer wording for troubleshooting content
  • (No Category) Improve schema generation and compatibility #208 #202
  • (No Category) Add lnav config
  • (No Category) Add debug mode information #244
  • (No Category) Add final deprecation notices for Plex/Tautull/Jellyfin legacy sources
  • (No Category) Update kitchensink with newer jellyfin/plex examples

Features

  • (jellyfin) Bump client major version
  • (jellyfin) More robust connection check and logging
  • (notifications) Make init more granular and always complete init #216 #215
  • (source) Add experimental file logging
  • (source) Ensure delay on close-interval for scrobbling is less than interval
  • (ui) Disable minifiying frontend identifiers
  • (ytm) BREAKING Use oauth-based api library for better stability #236 #195 #229
  • (ytm) Add config option to always log diff
  • (ytm) Re-implement auth with cookie and oauth #236 #195 #229
  • (ytm) Implement ENV config
  • (ytm) Conservative skip detection #248 #227 #228 #226
  • (ytm) Use durations to generate play dates for interim tracks #248 #227 #228 #226
  • (ytm) Debug mode enables log diffs
  • (ytm) Add more innertube options to user configuration
  • (ytm) Custom redirectUri checks
  • (No Category) Add stage Error classes and cause chain for notification
  • (No Category) Initialize usage refactored everywhere #221 #220 #231
  • (No Category) Implement start/restart/force init from UI regardless of status #216 #215
  • (No Category) Fully implement use of DEBUG_MODE #244
  • (No Category) Reduce polling log noise
  • (No Category) Log player state when using debug mode #244
  • (No Category) Include comment in play diff when present

Miscellaneous Tasks

  • (deps) Bump the npm_and_yarn group across 2 directories with 3 updates
  • (No Category) Add docker-compose dev file and vscode task
  • (No Category) Generate schema files during docker build for docsite #208 #202
  • (No Category) Bump plexjs version

Refactor

  • (ytm) Clean up tests and history parsing functions
  • (ytm) Improve auth handling for reauthentication

Testing

  • (spotify) Test album artist parsing

Ci

  • (No Category) Generate schema files for docsite in GH docs deploy workflow #208 #202

New Contributors

Full Changelog: 0.8.8...0.9.0

v0.8.8

30 Oct 17:55
640d2ff

Choose a tag to compare

See 0.8.7 for the recent major changes.