Skip to content

Releases: FoxxMD/multi-scrobbler

v0.9.1

21 Jan 15:11
Compare
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
Compare
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
Compare
Choose a tag to compare

See 0.8.7 for the recent major changes.

v0.8.7

29 Oct 17:43
Compare
Choose a tag to compare

What's New?

Plex API Source

A new Source has been implemented for Plex that uses the official API instead of webhooks. There are many benefits to the new source:

  • Does not require Plex Pass (webhooks are Plex Pass only) so all users can use it
  • Simplified networking and setup
  • Leverage MS's calculated player to better record listening activity instead of relying on Plex's scrobble behavior
  • Automatic scrobbling user filtering based on authentication

The old webhook-based Plex Source has been deprecated. See the documentation for migration steps.

Tautulli Deprecation

The Tautulli Source was initially implemented as a way for non Plex Pass users to monitor Plex. I am considering deprecating it for maintainability of the project and because the new Plex API Source should replace it. Please provide feedback if you think it should not be deprecated or what else needs to be implemented for the new Plex source to accommodate your use case.

MS Player Improvements

The internal logic for MS's "player", which is used for calculating play state and listening activity for Source's that report Player position, has had a major rework to leverage a "real-time" simulation of the Source rather than relying on timestamps. There should be no functional change for end-users besides more accurate player reporting. If you notice any regression in behavior or bugs please create an issue.

Daylight Savings Time Fix

Thanks to the users in #214 for discovering and isolating an issue with MS's logging library that caused empty files to be created on dates that transitioned from Standard Time to DST. This release bumps the logging library version that includes a fix for this issue that should save American users the headache European users had to endure 😅

Full Changelog

Bug Fixes

  • (No Category) Bump @foxxmd/logging to fix DST rolling file issue

Documentation

  • (plex) Clean up api/webhook sections and add migration guide
  • (tautulli) Add deprecation notice and discussion link
  • (No Category) Fix Jellyfin API migration version

Features

  • (player) Implement real-time positional state tracking
  • (plex) Initial Plex API Source implementation
  • (plex) Add track progress tracking to api source
  • (plex) Implement album art for UI
  • (ui) Show indeterminate state for non-positional players
  • (No Category) Reduce drop reason logging noise for jellyfin/plex API sources
  • (No Category) Improved filtering for platform players with multiple states

v0.8.6

16 Oct 16:51
Compare
Choose a tag to compare

What's New?

Jellyfin API Improvements

The new Jellyfin API Source was missing a decent amount of polishing from its initial release (#196 #200 #209). This release fixes many bugs and also introduces new configuration for allow/block scrobbling by library and media type enforcement.

Configuration Validation Improvements

The maintenance-mode typescript-json-schema library that was being used to validate configuration has been replaced with the much improved ts-json-schema-generator. Validation rules are now generated at runtime instead of using static files from the project which will make maintenance easier. This change, along with refactored validation logic, should make validation errors in logs easier to read and more specific.

Album Art

Players in Sources on the dashboard now support album art. This has been implemented for Jellyfin and Spotify so far. Other sources will have album art implemented in the future.

image

Github Issues

The issues template have been refactored to use forms and additional templates have been added for feature requests and source/client suggestions. The new templates should help make bug issues easier to write for new users and easier for me to read!

Full Changelog

Features

  • (jellyfin) Add debug options for media data troubleshooting
  • (jellyfin) Support and enforce library collection type
  • (ui) Improve player ui when in stopped state
  • (No Category) Improve client/source schema validation generation and error handling
  • (No Category) Implement platform output when building track info

Bug Fixes

  • (jellyfin) Guard against undefined playback data #209
  • (jellyfin) Guard against active session without now playing data #209
  • (jellyfin) Fix not handling stopped session state preventing last play in playlist from scrobbling #209
  • (jellyfin) Enforce media type when determining session validity
  • (jellyfin) Detect theme song extras play and discard #209
  • (ytmusic) Allow authUser to be number or string
  • (player) Fix missing calculated status on player stop
  • (No Category) Fix some source schemas to reflect documentation WRT optional properties
  • (No Category) Fix example configs so they pass validation tests

Documentation

  • (No Category) Update jellyfin instructions in quickstart to use API Source
  • (No Category) Update/fix docker-compose usage
  • (No Category) Fix link typo for flatpak
  • (No Category) Enable parsing json5 for AIO examples

Miscellaneous Tasks

  • (vscode) Add markdown extension to devcontainer
  • (No Category) Migrate bug report template to form
  • (No Category) Add templates for feature request and new source/client
  • (No Category) Add issue template config
  • (No Category) Use silent logger for source config tests
  • (No Category) Missing schema package in regular deps and freeze ts version
  • (No Category) Replace typescript-json-schema with ts-json-schema-generator

Testing

  • (jellyfin) Update valid activity tests
  • (No Category) Add tests for example configs and test parsing/validation
  • (No Category) Add long timeout to first config parse due to slow schema generation

Ci

  • (No Category) Add ACT run for just backend test
  • (No Category) Make test workflow reusable and add run sanity check
  • (No Category) Fix sanity test checkout ref and shorten APP_VERSION sha usage for PRs

0.8.5

30 Sep 15:11
Compare
Choose a tag to compare

What's New?

  • Fix documentation mismatch between new Jellyfin API Source config allow/block options #196
  • Fix missing lowercase transform for Jellyfin API Source config options

0.8.4

27 Sep 13:25
Compare
Choose a tag to compare

What's New?

Jellyfin Source API

A new Jellyfin Source that uses the official API library has been implemented. This supersedes and deprecates the existing webhook-plugin-based Jellyfin Source. Benefits of new implementation:

  • More accurate information about plays fixes multiple artists reporting
  • Eliminates need for exposed MS instance (to Jellyfin) which simplifies networking
  • User can authenticate using user/pass OR Api Key
  • More attention/development on @jellyfin/sdk should mean better support going forward

See the Jellyfin Source docs for migration steps from webhook to API. The webhook Source will be removed in a future version of MS.

Scrobble Modification Conditions

Scrobbles Modifications, introduced in the last release, can now have "conditional" criteria to help you decide when a search-replace operation on a scrobble should occur.

See the Scrobble Modification docs for how to use this and examples.

Development Improvements

Git Workflow

Workflows for MS have been simplified. The develop branch has been removed in favor of using master as the active development branch. All PRs should now target master instead of develop. Additionally, the develop docker image has been renamed edge.

VS Code

VS Code settings have been committed and docs have been added to make MS development with VS Code as close to one-click as possible. Settings include debug configurations, test running, typescript build, and devcontainer environment.

Full Changelog

Bug Fixes

  • (jellyfin) Map AlbumArtist Name property
  • (plex) Refactor plex webhook formdata parsing to be more defensive
  • (No Category) Bump @foxxmd/logging version to fix read-only system issues -- thanks to @jackwilsdon for the fix in FoxxMD/logging#2
  • (No Category) Strip wrapping quotes from base url
  • (No Category) Freeze typescript to fix weird unused error directive problem

Features

  • (jellyfin) Update schema
  • (jellyfin) Refactor Jellyfin source to use Jellyfin API
  • (jellyfin) Implement partial WS client for future use
  • (modifications) Implement "when" conditions for scrobble modifications
  • (modifications) Refactor hooks to accept an array of parts
  • (No Category) Improve upstream scrobble refresh logic and caching controls
  • (No Category) Add VSCode native dev settings
  • (No Category) Add VSCode devcontainer

Documentation

  • (No Category) Fix link -- thanks to @jackwilsdon
  • (No Category) Fix redirect for local documentation -- thanks to @jackwilsdon
  • (No Category) Fix youtube music identifier
  • (No Category) Update development docs for VSCode usage
  • (No Category) Add when condition docs and examples
  • (No Category) Add scrobble modification logging docs

Miscellaneous Tasks

  • (ci) Disable alpine builds for PR image
  • (ci) Add dependabot PR test gh action
  • (deps) Bump the npm_and_yarn group across 2 directories with 7 updates
  • (vscode) Add default built task
  • (No Category) Refactor git/dev workflow to use master as unstable branch
  • (No Category) Fix latest/tag for images and disable alpine builds
  • (No Category) Update faker to official release
  • (No Category) Update dockerfile to ignore devcontainer and vscode settings

Testing

  • (No Category) Add missing version prop for test components

Full Changelog: 0.8.3...0.8.4

v0.8.3

28 Aug 13:44
Compare
Choose a tag to compare

What's New?

VLC as Source

VLC has been implemented as a Source. In addition to scrobbling based on reported fields (ID3 tags) of audio tracks played in VLC a user can specify regular expressions to parse artist/title/album information from filenames when no ID3 tag is present.

Recent Scrobbles bug fix

A major bug was fixed that caused a scrobble client to not store upstream scrobbles (used for duplicate checking) on startup.

Youtube Music Woes

Improvements to logging and handling of inconsistent YTM upstream data has been added as well as entries in the FAQ regarding these problems.

Full Changelog

Features

  • (vlc) Implement vlc Source #177
  • (vlc) Use regex from configuration to extract metadata from filenames
  • (youtube) Increase level of auth update logging when configured to output changes #158
  • (youtube) Use just-validated history as recently played on new plays #156

Bug Fixes

  • (maloja) Improve handling for Maloja warnings-as-errors #180
  • (No Category) Actually store recent scrobbles

Documentation

  • (vlc) Add VLC docs
  • (vlc) Some fixes for VLC docs
  • (youtube) Add FAQ entries for YTM auth and scrobble issues

v0.8.2

20 Aug 13:37
Compare
Choose a tag to compare

What's New?

MPD (Music Player Daemon) Source

MPD is now a supported Source.

Scrobble Modification

Multi-scrobbler now supports modifying a scrobble (artists, album, track) in-flight using search-and-replace or regex patterns from configuration. The scrobble can be modified:

  • on discovery from a source
  • during comparison when checking duplicates
  • before sending to scrobble client

Why?

You may need to "clean up" data from a Source or before sending to a scrobble Client due to any number of reasons:

  • ID3 tags in your music collection are dirty or have repeating garbage IE [YourMusicSource.com] My Artist - My Title
  • A Source's service often incorrectly adds data to some field IE My Artist - My Title (Album Version) when the title should just be My Title
  • An Artist you listen to often is spelled different between a Source and a Client which causes duplicate scrobbles

In any scenario where a repeating pattern can be found in the data it would be nice to be able to fix it before the data gets downstream or to help prevent duplicate scrobbling. Multi-scrobbler can help you do this. See the documentation for examples and usage.

Deezer Deprecation

Deezer has discontinued support for their API and so the Deezer Source is now deprecated. The Source will continue to function and will not be removed any time soon but it is still recommended to switch to a more stable alternative such as Deezer -> last.fm -> lfm source for multi-scrobbler.

See this issue for more information.

Full Changelog

Bug Fixes

  • (tests) Do not re-use scrobbler between tests

Features

  • (mpd) Implement MPD Source MVP
  • (mpd) Use idle event to wake up from polling early
  • (musikcube) Provide more error logging and example config
  • (scrobble) Enable forcing existing scrobbles refresh on every scrobble #173
  • (ui) Add timestamp to recent pages #167
  • (No Category) On polling error retry check source is initialized and reinitialize if not
  • (No Category) Implement common play transform functionality
  • (No Category) Add album option to play string building function
  • (No Category) Improve logging for play transforms
  • (No Category) Implement play transforms in source/client logic #173
  • (No Category) Implement removing field if field is an empty string after transforming

Documentation

  • (deezer) Deprecate due to discontinued API support #175
  • (No Category) Add Play Transform docs
  • (No Category) Fix compare example

Miscellaneous Tasks

  • (ci) Update untagged package schedule to run once a week

Refactor

  • (listenbrainz) Simplify scrobble api calls and logging
  • (scrobbler) Consolidate refresh logic and add more logging
  • (scrobbler) Change refresh force to user-configurable staleness time #173

Testing

  • (No Category) Use faker 9.1RC for more plausible artist/album names in generated data

v0.8.1

17 Jul 17:23
Compare
Choose a tag to compare

What's New?

This release is entirely for documentation and developer experience improvement.

100% Docusaurus and Self-Hosted Docs

While MS was already using Docusaurus for the docs website the prior approach to writing docs was to keep them as plain markdown as possible so they were still accessible without needing access to an external website. With the "plain" markdown docs you could potentially browse from your own markdown reader in a cloned repository.

The downside to this interoperability is that docs, specifically configuration, had grown to be very long and full of nested/too many headers for each iteration of env/file + regular sections for clients/services. Adding additional examples made the problem even worse.

The solution, then, was to make the Docusaurus documentation part of multi-scrobbler! Now the same docs found at https://foxxmd.github.io/multi-scrobbler can also be found at the /docs URL on your multi-scrobbler instance (http://yourHost:9078/docs)

This enabled me to lean fully into Docusaurus and all of the layout, styling, and organization it offers. Alongside general improvements new docs have been added to help onboarding. Some highlights:

  • A Quickstart guide has been added for aiding onboarding
  • Improved readability and usefulness of all content in Configuration docs
    • ENV, File, and all-in-one File configuration has moved to Tabs under each Source/Client
      • Switching config type syncs tabs selection across all sections and in the URL
    • Full configuration examples are displayed for file and AIO-file parsed from the examples in the config directory
  • Improved styling across all docs
    • Copious usage of collapsed sections for examples to make scanning docs easier
    • Improved Table of Contents with only important headings
    • Admonition elements for increasing readability for tips/notes/warnings...
  • Installation docs use Tabs for docker and docker-compose examples
  • Actual development docs and tutorial (!)

And many more...check out the docs site or click on Docs in your MS dashboard to see the updated site.

Flatpak Convenience Setup

A bash script for automating building flatpak from source has been added at flatpak/setup.sh:

  • Removes node_modules and generates sources for flatpak-builder for both MS and the docsite
  • Builds the flatpak app in a given directory

Effectively making flatpak builds a one-line process rather than the manual 7-8 commands it was before.

See flatpak build instructions in the new docs.

Full Changelog

Documentation

  • (feat) Add architecture overview, common dev structures, and dev guidance for Sources
  • (fix) Update package scripts to use npx to invoke docusarus
  • (fix) Add missing docsite build steps to alpine docker variant
  • (flatpak) Implement bash setup script and move flatpak instructions to docsite
  • (No Category) Update docusaurus to v3
  • (No Category) Update docusaurs playground schema for MS to latest
  • (No Category) Improve TOC for docusaurus and github
  • (No Category) Implement self-hosted docs
  • (No Category) Replace manual notes with admonitions
  • (No Category) Lean 100% into docusaurus documentation
  • (No Category) Refactor installation.md for docusaurus
  • (No Category) Update kitchensink.md code block titles
  • (No Category) Parse and render config examples from repository
  • (No Category) Add quick start guide
  • (No Category) Use relative paths for volume mounting