Releases: FoxxMD/multi-scrobbler
0.10.4
0.10.3
0.10.2
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:
- Main, general configuration
- Scrobble Clients section with overview and separate pages for each Client
- Scrobble Sources section with overview and separate pages for each Source
- This should additionally make searching easier since clients/sources show up under their own header instead of as excerpts under a huge configuration section
- 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
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
- (JellyfinApiSource) Add option to override the Jellyfin base url used in the frontend #374 by @wolffshots
- (listenbrainz) Add source as music service name #369 by @h-wb
- (plex) Enable accepting self-signed certs #372 (#373)
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
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
0.10.0 RC1
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.
This issue contains more instructions on customizing persistence configuration and guidance for using Valkey. Please use the issue for reporting any feedback or issues.
v0.9.11
v0.9.10
v0.9.9
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
0.9.8
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 better support/functionality for Koito configuration and any future features.
Thanks to all the feedback and testers in #300 !
Important
If you are currently using Koito with Listenbrainz Source/Client you DO NOT need to migrate. The existing LZ implementation will continue to support Koito.
It is still recommended to migrate as the LZ implementation has limited functionality for Koito and future releases will definitely add more functionality. Migrating is also easy! Just rename a few variables/fields and check your URL. See below:
Migrating
Instructions below based on which type of MS config you are using:
ENV Config
Rename LZ_ prefixed envs to KOITO_
File Config
Rename listenbrainz.json to koito.json. If you have additional non-koito listenbrainz client/sources then make sure to separate them into different files.
AIO Config
Rename "type": "listenbrainz" to "type": "koito"
Koito URL
Your existing URL config will continue to work as-is. However, I recommend that you change it to the Koito base url only as this will be easier for MS to work with. The "base url" is the same URL you would use to access Koito through a browser.
KOITO_URL |
MS Detected Base URL | Example Scrobble Api URL |
|---|---|---|
http://192.168.0.100:4110 |
http://192.168.0.100:4110 |
http://192.168.0.100:4110/apis/listenbrainz/1 |
https://koito.mydomain.com |
https://koito.mydomain.com |
https://koito.mydomain.com/apis/listenbrainz/1 |
http://192.168.0.100:4110/apis/listenbrainz |
http://192.168.0.100:4110 |
http://192.168.0.100:4110/apis/listenbrainz/1 |
http://192.168.0.100:80/koito |
http://192.168.0.100:80/koito |
http://192.168.0.100:80/koito/apis/listenbrainz/1 |
Docs Update
Docs have had a minor refresh. Some highlights:
- Source/Clients sorted alphabetically for better readability
- Removed outdated information in FAQ and on Flatpak sections
- Fixed anchor scrolling
- Added Koito to Quickstart clients
- Added MPRIS guidance for Docker installs and remote socket instructions
Full Changelog
Features
- (koito) Implement Koito client
- (koito) Implement Koito Source
- (listenbrainz) Add submission_client #224
- (listenbrainz) Add additional player/service meta info for LZ scrobbles #224
- (mpris) Better handling of socket error on connection check
- (plex) Add libraries allow/block warning
- (No Category) Add more logging to apprise errors #158
- (No Category) Add RT Player metrics to player logging
Bug Fixes
- (plex) Increase max drift to 35 seconds to account for symfonium lag #271
- (plex) Strict comparison of library names #326
- (No Category) Only return interpolated album value if not undefined
- (No Category) Superagent type error false positive
Documentation
- (mpris) Add remote socket guidance
- (No Category) Add Koito quickstart instructions
- (No Category) Add Koito client/source docs
- (No Category) Update MPRIS instructions for docker
- (No Category) Remove flatpak install guidance
- (No Category) Update docker installation wording
- (No Category) Sort Source/Clients alphabetically
- (No Category) Remove old FAQ entries
- (No Category) Add updating instructions
- (No Category) Fix anchor scrolling by specifying logo height
- (No Category) Hide navbar on scroll
Miscellaneous Tasks
- (listenbrainz) Add guidance in logging to switch to Koito source/client
- (No Category) Update superagent types