Skip to content

chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.12.0#157

Open
renovate[bot] wants to merge 1 commit intomainfrom
renovate/ghcr.io-foxxmd-multi-scrobbler-0.x
Open

chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.12.0#157
renovate[bot] wants to merge 1 commit intomainfrom
renovate/ghcr.io-foxxmd-multi-scrobbler-0.x

Conversation

@renovate
Copy link
Contributor

@renovate renovate bot commented Jan 15, 2025

ℹ️ Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Update Change
ghcr.io/foxxmd/multi-scrobbler (source) minor 0.8.80.12.0

Warning

Some dependencies could not be looked up. Check the Dependency Dashboard for more information.


Release Notes

FoxxMD/multi-scrobbler (ghcr.io/foxxmd/multi-scrobbler)

v0.12.0

Compare Source

What's New?

Overhauled Historical Scrobble Matching

MS was originally built with only real-time scrobbling as a design goal so the logic behind "check if this track-to-be-scrobbled already exists for Scrobbler X" only extended as far as checking scrobbles MS had already seen, or the first page of scrobbles returned from the scrobbler's API. MS has long since evolved beyond these (6 year old) goals but the existing scrobble logic had stayed mostly the same which means many users have had problems with MS when it comes to scrobbling old scrobbles that don't conform to this real-time assumption.

Now, ~3000 changed lines later and thanks to testing from @​4rft5 , this logic has been completely overhauled to enable arbitrary time-range checks for any historical scrobbles: allowing MS to scrobble everything with the assurance they won't be duplicated, regardless of when they were scrobbled.

Note: This is a fully internal, functional change that does not require any changes in configuration or behavior from you, the user.

Some caveats that will be improved in future releases:

  • This change does not yet apply to Rocksky or teal.fm due to constraints on searching PDS repositories. This will be addressed in a future release with manual user interaction.
  • There may be issues with fetching in some edge cases pertaining to many results returned. EX: you imported scrobbles into a client with no timestamps so "1 hour timerange" contains ~3000 scrobbles -- MS may behave unexpectedly in this scenario. Please file an issue if this scenario applies to you.

This change also paves the way for bulk scrobble migrations between clients. Be on the lookout for this in a future release ;)

Improved Support for File/AIO Config in Documentation

File and AIO Configuration for every Source/Client, on the documentation website, has been improved with new tools:

  • A schema explorer lets you browse all possible properties of the config to more easily understand its shape and what is required
  • A json editor enables you to modify the examples in-place, while validating your changes against the accompanying schema
    • You can edit plain json or use the point-and-click for a guided experience if you aren't comfortable with json yet
image

These same tools are available on the Config Playground for general AIO editing and exploration.

image

Breaking Changes

Koito Support in Listenbrainz Client

The Listenbrainz Client previously has partial support for scrobbling to Koito instances due to a partially compatible listenbrainz api. The new historical scrobble logic makes this support impossible so this support has been fully removed.

If you are still using a LZ client for interacting with a Koito instance you need to migrate your configuration to use the official Koito Client configuration.

This does not affect users already using the Koito client.

Spotify Premium

As of March 9th 2026 Spotify no longer allows Spotify Developer Apps to be owned by a non-premium account.

If you have a non-premium account in this scenario you will likely experience 403 errors the next time your authentication needs to be refreshed.

Note that non-premium accounts can still use MS but you need to re-create an app that is owned by a premium account, first. See the Premium Account Required expandable section in the Spotify Source docs for instructions on how to implement this workaround.

Full Changelog

⛰️ Features
  • (docs) Implement config example/structure guidance
  • (jellyin) Add external URL guidance
  • (scrobbler) Implement play-dependent, arbitrary timerange fetching for duplicate checks
  • (scrobbler) Re-implement scrobble preload
  • (scrobbler) Improved dupe detection
  • (ui) Add service status page link to dashboard
  • (ui) Default logs to trace
  • (No Category) Implement timerange consolidation
  • (No Category) Implement better request retry logic
🐛 Bug Fixes
  • (discord) Add hidden activity type
  • (discord) Don't throw on unknown activity type
  • (lastfm) Check for singular scrobble response
  • (lastfm) Fix not returning nowPlaying scrobble
  • (lastfm) Default to not including now playing in history response
  • (nowPlaying) Scrobbler should report now playing if player state is known nowPlayingMode source
  • (plex) Also read MBIDs from guid field @​owendaprile
  • (sources) Add a confidence signal to plays generated from authoratiative sources to avoid fuzzy matching repeats
  • (transform) Fix missing defaults assignment for stage config parsing
  • (transform) Fix user transform default value
  • (transform) Fix transform for stage not using name for selection #​481
📚 Documentation
  • (spotify) Add premium account guidance
  • (No Category) Fix broken links and anchors
🚜 Refactor
  • (atproto) Replace naive TID impl with @​ewanc26/tid
  • (docs) Replace docusaurus json-schema-plugin
  • (listenbrainz) Remove Koito support
    • BREAKING: Remove Koito support
  • (source) Reduce logging noise for activity checks
  • (No Category) Use trace logging for defaults
  • (No Category) Re-implement retry logic for LZ with fixed request init
  • (No Category) Reorganized and consolidate source/client types
⚙️ Miscellaneous Tasks
  • (No Category) Exclude schema folder from search
  • (No Category) Add netlify-specific build command

v0.11.5

Compare Source

What's New?

Discord Rich Presence

MS now supports using Discord Rich Presence for Now Playing functionality.

This means that any Source that reports Now Playing or a real-time player, can be used to update your Discord status with a "Listening to..." activity 🎉

There are two types of Discord integrations to choose from:

  • App integration uses your existing Discord application on your desktop/laptop
  • Headless integration communicates directly with Discord's API gateway so it is not tied to any specific Discord instance

Check out the parent Discord docs page to get an overview of the differences between these integrations.

Upstream Service Status Page

There is now a status page for monitoring the reachability of public services used by some Sources/Clients is available at

https://status.multi-scrobbler.app

This monitor runs on a VPS and checks the uptime of actual APIs for these services, not just landing pages. On a ~minute interval it checks:

  • Listenbrainz API
  • Musicbrainz API
  • CoverArtArchive API
  • Last.fm API
  • A few MS-hosted support services

The idea is that this monitor can help you check if external service communication issues are internet-wide or if maybe the issue is in your network.

Full Changelog

⛰️ Features
  • (discord) Initial implementation #​468
  • (discord) Artwork fallback and ENV config
  • (discord) Add album art functionality
  • (discord) Use artwork url if its from a known domain
  • (discord) Use release mbid to get coverart if fallback would otherwise be used
  • (discord) Implement retry for cover art api
  • (musicbrainz) Implement CoverArtArchive API
  • (nowplaying) Update now playing based on play presence AND player status
  • (scrobblers) Run preCompare transform hook on playing now data
🐛 Bug Fixes
  • (scrobblers) Don't queue now playing data if scrobbler is not ready
  • (transform) Use temporally-invariant hash comparison
  • (No Category) Fix config validation error source
  • (No Category) Fix labels for MS heartbeat task
📚 Documentation
  • (discord) Add discord docs
  • (discord) Update artwork guidance for cover art archive
  • (discord) Add discord container instructions
  • (faq) Add connection/dns guidance
  • (No Category) Add status page to monitoring section

v0.11.4

Compare Source

What's New?

  • A very small release to fix a bug with parsing Spotify data #​470

v0.11.3

Compare Source

What's New?

Deezer Improvements

Errors in parsing Deezer history have been fixed thanks to @​Ectalite graciously sharing Deezer access to restart stalled development.

Additionally, the Deezer Source now supports scrobbling for a child account when the main account is the owner of a Family Plan.

Jellyfin Config Changes

The allowUnknown File Config property has been deprecated and will be removed in a future release.

It has been replaced by the allowMediaTypes list, which enables more granular control over what types of media can be scrobbled. The list should be one or more of the official media types listed in the jellyfin sdk. The undocumented MusicVideo type is also supported.

If you were using "allowUnknown": true, replace it with the below property in your jellyfin.json config:

{
  "allowMediaTypes": ["audio","unknown"]
}

This setting is also now available as an ENV of comma-separated media types.

JELLYFIN_MEDIATYPES_ALLOW=audio,video,musicvideo

Changelog

⛰️ Features
  • (deezer) Add family account monitoring #​344
🐛 Bug Fixes
  • (deezer) Fix error list access #​344
  • (jellyfin) Fix options being required #​469
  • (jellyfin) Allow all media types when allowUnknown is true #​445
  • (No Category) Compatibility for old scrobbles #​462
  • (No Category) Normalize state param for auth redirect URLs #​443
  • (No Category) Allow musicvideo media type and use allowedMediaTypes for NowPlayingItem check #​445
📚 Documentation
  • (plex) Add Musicbrainz stage guidance #​447
  • (No Category) Make compose default tab for installation
  • (No Category) Update screenshot
⚙️ Miscellaneous Tasks
  • (docker) Add source OCI labels #​463 thanks @​Kernald
  • (No Category) Fix links in issue templates
  • (No Category) Remove unused dockerfile
  • (No Category) Update git-cliff workflow
  • (No Category) Bump lastfm-ts-api version

v0.11.2

Compare Source

What's New?

Debugging Plays and Help

Plays found in the Source "Tracks Discovered" and Client "Scrobbled/Failed" lists now include a Debug button that, when clicked, copies a json object with data that can be used for troubleshooting issues with multi-scrobbler.

debug icon

At this stage the data is purely for me to help debug user issues. It should make reproduction of issues much easier and will provide insight into stage modifications. In the future the UI will include a Diff tool to help visualize Play changes over time for self-help.

Check the new Help docs for how to use this debug information to most effectively create an issue for Multi-scrobbler.

Full Changelog

Features
  • (scrobblers) Refactor scrobbling functions to capture transactional data
  • (No Category) Use json diff to track play changes
  • (No Category) Add debug copy action to ui
Bug Fixes
  • (librefm) Relax response content-type
  • (maloja) Fix logging objects
  • (musicbrainz) Check for undefined status #​458
  • (plex) Do not use album artist MBID when existing artist or is VA #​450
  • (sonos) Gracefully handle failure when fetching device state #​455
  • (sonos) Check for UpnpClass existing #​398
  • (No Category) TS typings for brainz meta and missed recording-track rename
  • (No Category) Deep clone discovered plays
Documentation
  • (No Category) Comment why compilations don't work for maloja
  • (No Category) Add help docs and update github issue template with play debug data
Refactor
  • (sonos) Move device/group filters before track type checks to enable easier user workarounds

v0.11.1

Compare Source

What's New?

Sonos Source

Sonos devices are now supported as Sources. MS can monitor all devices in your Sonos network given any device's IP. MS supports multiple listening sessions based on device/zone.

Big thanks to @​bkredell for the financial support that enabled me to purchase a speaker to do development with. Without this, the implementation would not have been possible.

ENV Config for all Sources

Previously, Sources that were also Clients could only be configured using File or AIO config. This was due to an old design decision that hasn't been relevant for quite some time. 0.11.1 removes this superficial limitation so that all Sources can be configured using ENV config. Explicitly, these Sources now have ENV config available:

Memory Optimizations

Several optimizations to reduce memory usage should result in 30-50% less memory used, after startup is finished.

Prometheus Metrics

Multi-scrobbler now exposes a prometheus metrics endpoint with these data points:

  • Count of discovered plays per Source
  • Count of Queued/Scrobbled/Deadletter scrobbles per Client
  • Number of issues per Source/Client
    • If any of these metrics is > 0 it means your Source/Client is not operating normally

Musicbrainz Track Search and Plex

One of the MBIDs Plex can provide is a Track MBID, which is associated with a Recording and specific Release. 0.11.1 implements searching by this MBID (generically) and fixes parsing of this ID from plex. Sources that provide this can ensure that the exact album you want for a scrobble is used.

Note: Musicbrainz will not search by this id by default. You will need to use the basicOrIds search method to leverage the Track MBID.

Full Changelog

Features
  • (lastfm) Add response content logging #​449
  • (musicbrainz) Search by track MBID using basicorids #​447
  • (sonos) Implement Sonos Source #​398
  • (sonos) Fix first media seen logging and add debug guidance to docs
  • (sonos) Add group/device filtering
  • (No Category) Add prometheus metrics #​438
  • (No Category) Implement ENV config for clients as sources
Bug Fixes
  • (musicbrainz) Find correct release when release or track mbid is present
  • (prometheus) Set content type to plain text #​438
Documentation
  • (sonos) Update admonitions
  • (tealfm) Update tealfm links
  • (No Category) Add missing default preset to quickstart MB instructions
  • (No Category) Add prometheus usage
Refactor
  • (musicbrainz) Rename recording mbid property to recording
  • (sonos) Add missing sonos source dynamic usage
  • (No Category) Add type label for prometheus metrics
  • (No Category) Use compiled json for schema in production
  • (No Category) Use dynamic import for components
Miscellaneous Tasks
  • (No Category) Add config types to issue template

v0.11.0

Compare Source

What's New?

Libre.fm Source/Client

Mutli-scrobbler now supports Libre.fm as a Source and Client.

Additionally, if you are running your own Libre.fm instance there are options for defining your own instance as the endpoint.

Musicbrainz Search Improvements

When enhancing your scrobbles with Musicbrainz there are now 1) additional methods for searching and 2) an additional album sorting mechanism to bias matches towards the actual text from your original scrobble.

The order in which searches are executed has also been updated to be fully user-configurable. However, this is a breaking change if you previously had search-related file-config options (fallback*) or are using PRESETS ENV. See Breaking Changes below for how to migrate.

Breaking Changes

Musicbrainz Stage

If you are using the Musicbrainz Stage transformer with any of the following options then you will eventually need to update your config to maintain existing behavior:

  • File Config
    • fallbackAlbumSearch
    • fallbackArtistSearch
    • fallbackFreeTextSearch
  • ENV Config
    • MB_PRESETS

If none of these apply to you no action is required.

If these do apply to you: your existing configuration WILL continue to work but these options have been deprecated and will be removed in a future release. You should still migrate as soon as convenient.

In v0.11.0 Musicbrainz uses a searchOrder list to define the order that search methods are run in. See the Search Methods docs section for more information.

To migrate:

File Config
  • "fallbackAlbumSearch": true replace with "searchOrder": ["album"]
  • "fallbackArtistSearch": "native"
    • replace with "searchOrder": ["artist"]
    • and add "searchArtistMethod": "native" (or naive)
  • "fallbackFreeTextSearch": "true" replace with "searchOrder": ["freetext"]

The directions above assume you are using each option by itself. If you are using more than one then simply combine replacements.

EX using both fallbackFreeTextSearch and fallbackAlbumSearch, replace with "searchOrder": ["album", "freetext"]

You will likely also want to add isrc and basic search methods to the front of your searchOrder, as this emulates the previous MB search behavior:

"searchOrder": ["isrc","basic","album","freetext"]
ENV Config
  • MB_PRESETS=... add default to beginning of your list IE MB_PRESETS=default,native,sensible

Removed Deprecated Jellyfin Source

The old, webhook-based Jellyfin source has been deprecated since v0.8.4 (September 2024). It has not been in the documentation for well over a year. It has now been fully removed.

Removed Deprecated Plex/Tautulli Sources

The old webhook-based Plex and Tautulli (notification agent) Sources have been deprecated since v0.8.7 (October 2024). They have not been in the documentation for well over a year. They have now been fully removed.

Full Changelog

Features
  • (No Category) Librefm Source/Client #​401
  • (musicbrainz) Improved missing mbid parsing and tests
  • (musicbrainz) BREAKING: Replace fallback search with searchOrder for more search control
  • (musicbrainz) BREAKING: Improve ENV presets
  • (musicbrainz) Add exclusive search by recording MBID #​431 thanks @​gabeklavans
  • (musicbrainz) Implement basic-or-ids search
  • (musicbrainz) Implement field scoring
  • (plex) Retrieve MusicBrainz IDs #​426 thanks @​owendaprile
Bug Fixes
  • (endpointlz) Mark play as new from source
  • (librefm) Log warning for empty account rather than throwing #​401
  • (mpd) Add missing MPD envs to source building #​432
  • (musicbrainz) Simplify config parsing and log original ids
  • (musicbrainz) Check for release data type before logging #​434
  • (tealfm) Don't define brainz artist array if empty
  • (No Category) Move preCompare transform hook for clients to the correct place in lifecycle #​435
  • (No Category) Don't mutate original error when merging cause stack for logging
  • (No Category) Remove cache assignment in child class
  • (No Category) Add missing undici dependency #​437 thanks @​jackwilsdon
Documentation
  • (musicbrainz) Update search methods
  • (No Category) Improve MB docs
  • (No Category) Add read-only install instructions #​429 thanks @​drake7707
  • (No Category) Re-style details and add custom admonition details component
  • (No Category) Use AdmonitionDetails
Miscellaneous Tasks
  • (No Category) BREAKING: Remove deprecated Jellyfin Source
  • (No Category) BREAKING: Remove deprecated Plex/Tautulli Sources
Testing
  • (lastfm) Improve artist and mbid parsing

v0.10.8

Compare Source

Changelog

Features
  • (tealfm) Implement service filtering and parse isrc/music service from records
Bug Fixes
  • (musicbrainz) Don't assume duration is missing
  • (No Category) Convert MB length to seconds #​423 #​427
  • (rocksky) Fix generated name for ENV configured rocksky client #​424 thanks to @​SilverKnightKMA
Documentation
  • (No Category) Add valkey docker compose connection example
Refactor
  • (No Category) Move ISRC to main play data

v0.10.7

Compare Source

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 (default continue) - If the Stage successfully finishes processing
  • onFailure (default stop) - If the Stage encounters an error while processing, or otherwise fails to achieve the transformation result
  • onSkip (default continue) - If the Stage does not process the Play data due to stage-level when or 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

Compare Source

Bug Fixes

  • (musicbrainz) Wrong default argument for preRequest
  • (transformer) Don't try to build env transformer when no ENV exists

v0.10.5: - Musicbrainz Matching

Compare Source

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

v0.10.4

Compare Source

Bug Fixes

  • (rocksky) Round duration to integer to fix 400 on submit #​400
  • (tealfm) Round duration to integer
    • Float duration did not prevent writing record to PDS but seems to improve compatibility with apps using tealfm data

v0.10.3

Compare Source

Bug Fixes

  • (rocksky) Fix wrong config value used for Rocksky API auth
  • (rocksky) Fix url path for token validation
  • (rocksky) Use duration_ms instead of duration since Rocksky ignores duration

v0.10.2

Compare Source

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:
  • 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

Compare Source

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
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

Compare Source

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

v0.9.11

Compare Source

What's New?

Maloja Source

Implemented Maloja as a Source 🎉 #​295

All Clients can now also be used as Sources so you have full freedom to scrobble to any service with the ability to relay to any other service!

v0.9.10

Compare Source

What's New?

  • fix(listenbrainz): Improve MusicBrainz metadata parsing so more data is included in Play metadata
  • fix(koito): Send recording_mbid in scrobble payload to fix missing metadata #​333

v0.9.9

Compare Source

What's New?

This is a small release mainly for some bug fixes and documentation improvements.

Plex Source Temporary Fix

Plex 1.41.9.9912 introduced changes in their API that have not been accounted for in the underlying library multi-scrobbler uses to communicate with Plex. This causes issues in multi-scrobbler so this release merges a temporary fix for this error. No interaction is required to fix this error from the user side.

Another minor release will be cut once @​lukehagar/plexjs merges the upstream fix for the API.

Intentional Scrobble Repeat Detection

Improvements to how multi-scrobbler tracks Sources that provide Player position data now prevents scrobbles from being detected as duplicates when they are intentionally repeated by the user. #​328 #​318

You can now keep that track on repeat to your heart's content knowing MS will scrobble all 20+ consecutive plays. I don't judge ❤️

Full Changelog

Bug Fixes
  • (lastfm) Fix lastfm providing empty string for non-defined album #​323
  • (listenbrainz) Fix sending undefined release_name in scrobble #​323
  • (plex) Fix regression with allowing non-music when using librariesAllow
  • (plex) Temporary fix for library response validation #​314
  • (No Category) Add last played data and check for repeat on new Play #​318
Documentation
  • (No Category) Add Source client config guidance #​325
  • (No Category) Update docusaurus to 3.8
  • (No Category) Fix social card image
  • (No Category) Add clarifying callout for multi-use components
  • (No Category) Remove koito mentions from LZ docs
  • (No Category) Update readme Koito entries
  • (No Category) Improve wording around Now Playing state
Features
  • (No Category) Track if play is a repeat and use in duplicate scrobble detection #​318
Refactor
  • (No Category) Move Play position closeness and duration comparisons to own functions

v0.9.8

Compare Source

What's New?

Koito Source/Client

v0.9.4 introduced Koito support using the existing Listenbrainz Source/Client.

Now, this release introduces full Source and Client implementations for Koito which enables bette


Configuration

📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.0 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.1 Jan 21, 2025
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from 4a62396 to 837dfb3 Compare January 21, 2025 18:41
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from 837dfb3 to ed28f39 Compare March 25, 2025 01:47
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.1 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.2 Mar 25, 2025
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.2 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.3 May 29, 2025
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from ed28f39 to 354d2e1 Compare May 29, 2025 14:56
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from 354d2e1 to 0ecdbdc Compare June 16, 2025 20:08
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.3 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.4 Jun 16, 2025
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.4 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.5 Jun 19, 2025
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from 0ecdbdc to 0ebbf24 Compare June 19, 2025 20:09
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.5 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.6 Jun 20, 2025
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from 0ebbf24 to 1b8e956 Compare June 20, 2025 22:45
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from 1b8e956 to 29a7ea8 Compare July 7, 2025 19:32
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.6 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.7 Jul 7, 2025
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from 29a7ea8 to 1140444 Compare July 14, 2025 15:35
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.7 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.8 Jul 14, 2025
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from 1140444 to b65fb81 Compare July 28, 2025 18:05
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.8 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.9 Jul 28, 2025
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from b65fb81 to 90bf152 Compare August 1, 2025 14:01
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.9 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.10 Aug 1, 2025
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.10 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.11 Aug 20, 2025
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from 90bf152 to e7001be Compare August 20, 2025 18:47
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from e7001be to 3030545 Compare September 23, 2025 17:37
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.9.11 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.10.0 Sep 23, 2025
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from 3030545 to 4bed3c9 Compare October 30, 2025 16:45
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.10.0 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.10.1 Oct 30, 2025
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from 4bed3c9 to f71b560 Compare October 30, 2025 23:38
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from f71b560 to e128394 Compare November 13, 2025 20:43
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.10.1 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.10.2 Nov 13, 2025
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from e128394 to 2433f95 Compare November 18, 2025 03:01
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.10.2 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.10.3 Nov 18, 2025
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from 2433f95 to 9374f11 Compare November 21, 2025 21:50
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.10.3 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.10.4 Nov 21, 2025
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from 9374f11 to ec59c16 Compare December 11, 2025 19:59
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.10.4 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.10.5 Dec 11, 2025
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from ec59c16 to 1dba739 Compare December 12, 2025 17:43
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.10.5 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.10.6 Dec 12, 2025
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from 1dba739 to 1b77728 Compare December 17, 2025 18:01
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.10.6 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.10.7 Dec 17, 2025
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from 1b77728 to 47d677b Compare January 1, 2026 07:08
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.10.7 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.10.8 Jan 1, 2026
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from 47d677b to fa4e071 Compare January 15, 2026 17:58
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.10.8 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.11.0 Jan 15, 2026
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from fa4e071 to c8ccff9 Compare January 23, 2026 00:45
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.11.0 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.11.1 Jan 23, 2026
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from c8ccff9 to 5aa346c Compare January 30, 2026 17:59
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.11.1 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.11.2 Jan 30, 2026
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from 5aa346c to baf32e4 Compare February 2, 2026 18:24
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from baf32e4 to 35b25f8 Compare February 11, 2026 17:03
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.11.2 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.11.3 Feb 11, 2026
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from 35b25f8 to 70d493a Compare February 12, 2026 17:00
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.11.3 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.11.4 Feb 12, 2026
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from 70d493a to aada909 Compare March 1, 2026 08:47
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.11.4 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.11.5 Mar 1, 2026
@renovate renovate bot force-pushed the renovate/ghcr.io-foxxmd-multi-scrobbler-0.x branch from aada909 to f695d6f Compare March 16, 2026 17:44
@renovate renovate bot changed the title chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.11.5 chore(deps): update ghcr.io/foxxmd/multi-scrobbler docker tag to v0.12.0 Mar 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants