Skip to content

Releases: FoxxMD/multi-scrobbler

v0.6.0

04 Oct 13:59
Compare
Choose a tag to compare

What's New?

UI Improvements and Now Playing

When a Source player state is detected a "Now Playing" player will render in the Source card showing how MS tracks plays for scrobbling.

The UI has been reworked to reduce whitespace, compact the layout, use headers more effectively, and improve wording/visualization.

Recently played tracks are now linked to their source (Spotify, Maloja) if MS can parse them.

Backend Tests and Scrobbling Fixes

A suite of tests have been added to test core backend functionality. These tests helped surface multiple bugs that should, now fixed, reduce duplicate scrobbles and improve consistency for all sources/clients.

Other Notable Improvements and Fixes

  • Backlog on startup is configurable #100
    • In a source config options property use "scrobbleBacklog": false to disable backlogging on startup
  • Enable/disable configs via property
    • In a source/client config at the top level use "enable": false" to disable using that config
  • Scrobbling deferred until track finishes playing or is changed
    • This ensures an accurate "listened to" time is recorded for the scrobble, rather than scrobbling as soon as "listened to" time is valid
    • "listened to" is now sent in Maloja scrobble payload
  • Jellyfin endpoint now accepts more header content-type values #101
  • Updated youtube source library to work better with non-chromium browsers #98

Breaking Changes

Docker Image Base Updated (Linuxserver.io)

  • Updates alpine 3.17 -> 3.18
      * Main reason is to potentially fix DNS issues related to musl #88
      * Bumps npm 9.1.2 -> 9.6.6

If you are using Portainer to manage containers you should remove all non-MS related ENVs from the container template before pulling the latest image.

Increased Scrobble Threshold Defaults #73

Previously, the default settings for scrobbling a track specified to scrobble if it was played for more than 30 seconds. This has been increased to:

  • Played more than 240 seconds (4 minutes) OR
  • More than 50% of the track played (for sources that support reporting track duration)

If you have scrobbleThresholds set in config.json or in individual source configs this does not affect you.

Increased Default Polling Interval

Due to the above change the default polling interval for sources have been adjusted like so:

  • Default Interval: 30s -> 10s
  • Max Interval: 60s -> 30s

This provides more accurate "listened to" recording and, generally, better source tracking resolution. This should not adversely affect your usage of each provider other than increasing bandwidth a little. These default settings can be overridden using the interval and maxInterval properties in individual source configs.

Changelog

Bug Fixes

  • (backend) Fix how port is determined and used for localUrl
  • (deezer) Fix deezer passport generation
  • (docker) Normalize ownership of node_modules files
  • (flatpak) Add missing release node
  • (jellyfin) Enable parsing requests with more content-types and add logging on invalid types
  • (player) Fix some bugs and add param for easier testing
  • (player state) Fix stale/dead logic checks
  • (scrobble) Fix config destructing default value
  • (scrobble) Fix wrong artists used for comparison
  • (scrobble) Fix not using reference duration for fuzzy comparison
  • (scrobblers) Test auth when client completes auth callback
  • (ui) Use normal match parameters
  • (ui) Log line parsing missing line terminator capture
  • (ui) Fix wrong route for client auth #97
  • (ui) Remove duration percent display when duration is zero
  • (ui) For non-polling sources use last activity date for status
  • (youtube) Use updated yt music library #98
  • (No Category) Load variables from .env for backend
  • (No Category) Pass localUrl to scrobble clients for use by lastfm
  • (No Category) Fix missing destructure default value

Documentation

  • (jellyfin) Add request header workaround for jellyfin #101
  • (No Category) Update dashboard screenshot
  • (No Category) Clarify subsonic api compatibility

Features

  • (config) Implement property to control whether a source/client is used
  • (jellyfin) Initial testing suite
  • (lastfm) Add player support
  • (listenbrainz) Add player support #74
  • (maloja) Generate web links for scrobbled tracks
  • (maloja) Add listened duration to scrobble payload
  • (player) Add sourceOfTruth variable to control logging and future use
  • (player) Defer play discovery so listenedFor is accurate
  • (player) Log when play fails discovery on player change
  • (player) Implement seek and repeat detection
  • (player state) Preserve position when player is not in stopped status
  • (player state) Implement player status and listened duration in UI
  • (scrobble) Use new string approach for track
  • (scrobble) Use new string approach for artists
  • (scrobble) Implement artist dup bonus scoring heuristic
  • (scrobble) Initial scrobble queue implementation
  • (scrobble) Implement dead letter queue processing
  • (scrobble) Implement heartbeat task for scrobblers
  • (scrobble) Improve existing scrobble comparison logic
  • (source) Control backlogging via config #100
  • (ui) Remove player when dead
  • (ui) Compact ui
  • (ui) Make player dates human friendly
  • (ui) Remove unnecessary wording for track stats
  • (ui) Expand displayed plays
  • (ui) Implement status indicator
  • (No Category) Rework source api to include player states
  • (No Category) BREAKING Set default scrobble thresholds to standard values #73
  • (No Category) BREAKING Decrease default polling interval
  • (No Category) Implement Base URL
  • (No Category) Implement new string comparison logic

Miscellaneous Tasks

  • (docker) BREAKING Bump lsio base image version to 3.18
  • (No Category) Use constant for default retry multiplier
  • (No Category) Remove unused dashboard backend endpoint
  • (No Category) Ensure production mode for webpack without relying on env

Refactor

  • (player) Move listen progress/range functionality into own class (SRP)
  • (player state) Refactor handling of non-updated players
  • (player state) Remove old play logic
  • (scrobble) Print score breakdown in different statement
  • (scrobble) Adjust dup score weights
  • (scrobble) Refactor scrobble delay and scrobble processing sleep behavior
  • (ui) Prevent nodemon from restarting on tailwind config change

Testing

  • (player) Add player tests
  • (scrobble) Implement basic scrobble tests
  • (scrobble) Add more tests for similar-but-unique scrobble detection
  • (scrobble) Add test for duplicate when exact title/time
  • (scrobble) Improve test durability by using mixed duration sources
  • (scrobble) Add tests for scrobble processing queue and existing comparisons

v0.5.2

13 Sep 16:10
Compare
Choose a tag to compare

What's New?

MS now has a scheduled "heartbeat" that runs every 20 minutes. It's purpose, for now, is to is start (or restart) sources that have stopped due to upstream issues. The use-case for a Source is:

  • request/polling retry attempts are low
  • source was initially OK (auth OK, initial communication OK)
  • and there is a non-auth related upstream communication issue

The heartbeat tasks will automatically try to restart polling for this Source so MS can recover from an upstream API communication error without user intervention.

Changelog

Features

  • (No Category) Schedule heartbeat task to restart sources that should be polling #6 #65 #93

Bug Fixes

  • (listenbrainz) Artist parsing joiner phrases must begin with non-word character #94

v0.5.1

31 Aug 15:02
Compare
Choose a tag to compare

Changelog

Bug Fixes

  • (tautulli) fix redirect path
  • (plex/jellyfin) fix redirect allowing relative paths that breaks url when source endpoint has a trailing slash #92

v0.5.0

29 Aug 13:54
Compare
Choose a tag to compare

🎉 0.5.0 contains a significant internal rewrite for the entire front-end and some fundamentals of the back-end.

Refer to the RC release for full details and Breaking Changes


Changes since RC

  • Fixed tsconfig compiler options to make mocha tests run correctly
  • Fixed out locations and tsconfig location for generating schema
  • Updated flatpak build process to reflect build changes

Breaking Changes since RC

Flatpak

Flatpak installations now default to starting the ui on port 9079.

  • New Installations -- Automatically generates a default config that resets port to 9078
  • Existing Installations -- Port can be defined using ENV or FILE-config, if you want to change it back to 9078

v0.5.0-RC1

24 Aug 16:24
Compare
Choose a tag to compare
v0.5.0-RC1 Pre-release
Pre-release

🎉 0.5.0 contains a significant internal rewrite for the entire front-end and some fundamentals of the back-end.

Updates and Rewrites

Scrobble Source State Tracking

The way MS monitors Sources has seen a major overhaul. Previously MS kept track of some basic information about what was being listened to -- title/artist info, when it was first seen, and some meta info -- in a somewhat ad-hoc manner.

Now, MS implements a full source "player state" model that mirrors the current state of the source as much as possible. This allows MS to keep track of things like:

  • Current playing status (paused, stopped, playing, etc.)
  • What ranges of the current track have been listened to (if MS starts monitor in the middle of a track of user seeks in track)
  • How much of the current track has been listened to based on those ranges so scrobble thresholds are more accurate
  • Ensures better accuracy for de-duplicating scrobbles

And much more. A preview of this technical info can be enabled by setting LOG_LEVEL=debug and enabling "options": {"logPlayerState": true} in your config:

[nodemon-server] 2023-08-24T11:23:02-04:00 debug   : [Sources] [Spotify - default] [Player 10ef8b79eb-foxx-arch-SingleUser] New Play: (2fkAbl3FCAj9BKc4Z5GIdr) The Free Label - Boys Don't Sob
[nodemon-server] 2023-08-24T11:23:02-04:00 debug   : [Sources] [Spotify - default] [Player 10ef8b79eb-foxx-arch-SingleUser] Started new Player listen range.
[nodemon-server] 2023-08-24T11:23:02-04:00 debug   : [Sources] [Spotify - default] [Player 10ef8b79eb-foxx-arch-SingleUser] 
[nodemon-server] (2fkAbl3FCAj9BKc4Z5GIdr) The Free Label - Boys Don't Sob @ 2023-08-24T15:23:02.546Z
[nodemon-server] Reported: PLAYING | Calculated: UNKNOWN | Stale: No | Orphaned: No | Last Update: 2023-08-24T15:23:02.546Z
[nodemon-server] [▇▇▇▇▇▇—————————]43% 75/176s | Listened For: 0s 0%

...

[nodemon-server] 2023-08-24T11:23:18-04:00 debug   : [Sources] [Spotify - default] [Player 10ef8b79eb-foxx-arch-SingleUser] Player position changed between current -> last update. Updated calculated status to playing
[nodemon-server] 2023-08-24T11:23:18-04:00 debug   : [Sources] [Spotify - default] [Player 10ef8b79eb-foxx-arch-SingleUser] 
[nodemon-server] (2fkAbl3FCAj9BKc4Z5GIdr) The Free Label - Boys Don't Sob @ 2023-08-24T15:23:02.546Z
[nodemon-server] Reported: PLAYING | Calculated: PLAYING | Stale: No | Orphaned: No | Last Update: 2023-08-24T15:23:18.695Z
[nodemon-server] [▇▇▇▇▇▇▇▇———————]52% 91/176s | Listened For: 16s 9%

This enables eventually implementing a "Now Playing" web interface #74 which is now possible due to the other big update...

Front-end Rewrite

The web dashboard, previously written as server-side rendered pages written in EJS/express, has been replaced by a standalone, CRA-based React web app. This also required a new API implementation for the backend which will eventually be documented.

The UI looks and behaves essentially the same in this release but it is now much better positioned for future improvements. (Now Playing being the first up).

Breaking Changes

If you are using MS with ENV configuration or "bare minimum" file configs, with docker, there should be no breaking changes. I expect 99% of MS users will be able to upgrade in-place. However, for those of you using a slightly more advanced setup:

Config Options

If your configs include logPayload or logFilterFailure properties in the data object (Plex, Tautulli, Jellyfin) you will need to move these to "options" as a sibling of "data" like this:

OLD Config

[
  {
    "name": "MyJellyfin",
    "clients": [],
    "data": {
      "users": ["FoxxMD"],
      "servers": ["myServer","anotherServer"],
      "logPayload": false,
      "logFilterFailure": "warn"
    }
  }
]

NEW Config

[
  {
    "name": "MyJellyfin",
    "clients": [],
    "data": {
      "users": ["FoxxMD"],
      "servers": ["myServer","anotherServer"]
    },
    "options": {
      "logPayload": false,
      "logFilterFailure": "warn"
    }
  }
]

Running MS Locally

The default port for the UI/api is now 9079. This can be changed by setting the env PORT=9078 or adding a .env file to the project root with PORT=9078

Development

This only applies if you are developing MS.

Development mode is now started with npm run dev. In development mode:

  • the front end is available on ENV PORT, defaulting to 3000.
  • the back end (api) is available on ENV API_PORT, defaulting to 9079.

Feedback

If you have any trouble running 0.5.0-RC1 or find a breaking change please open a ticket and let me know.

v0.4.8

17 Jul 19:47
Compare
Choose a tag to compare

Changelog

Features

Bug Fixes

  • (plex) More config data normalization #84

Documentation

  • (No Category) Update docker registry options (Added GHCR)
  • (No Category) Fix docker heading
  • (No Category) Use external links for config examples

v0.4.7

12 Jun 18:23
Compare
Choose a tag to compare

Changelog

Bug Fixes

  • (lastfm) Only scrobble pimary artist when multiple are present #81 -- contributed by @Whhoesj

Docs

  • (No Category) Add FAQ entries for multiple artist scrobbling issues

v0.4.6

07 Jun 13:31
Compare
Choose a tag to compare

Changelog

Bug Fixes

  • (kodi) Fix hardcoded string #79
  • (ntfy) Include authorization object correctly in publish request data #80
  • (tautulli) More response formatting safeguards #77
  • (No Category) Limit number of plays returned by deezer #67
  • (No Category) Respect maloja response status and throw on error #57
  • (No Category) Handle null/non-string values when truncating
  • (No Category) Re-initialize auth state after receiving auth callback #76
  • (No Category) Passing wrong argument to tautulli payload formatter #77

Features

  • (No Category) Use pre/post auth hooks for polling start to simplify logic

v0.4.5

27 Mar 13:51
Compare
Choose a tag to compare

Changelog

Features

Refactor

Documentation

v0.4.4

20 Mar 15:08
Compare
Choose a tag to compare

Changelog

Features

  • Added Kodi as a source

Documentation