Skip to content

Add ListenBrainz support - #1

Open
bradsk88 wants to merge 4 commits into
ericcastro:mainfrom
bradsk88:feat/scrobble-targets
Open

Add ListenBrainz support#1
bradsk88 wants to merge 4 commits into
ericcastro:mainfrom
bradsk88:feat/scrobble-targets

Conversation

@bradsk88

@bradsk88 bradsk88 commented Aug 9, 2026

Copy link
Copy Markdown

This is a cool project. But I personally prefer self-hosted over last.fm.

This PR adds the ability to choose that. I tested it with Koito.

Screenshot_20260809_150946

retro added 4 commits August 9, 2026 21:49
Scrobbling now goes through a small target interface (connect/disconnect/
nowPlaying/scrobble). Last.fm is refactored into lib/scrobblers/lastfm.js
with unchanged behavior; the new listenbrainz target speaks the
ListenBrainz submit-listens protocol to a user-configured server, intended
for self-hosted Multi-Scrobbler instances.

- settings UI: scrobble target dropdown (Last.fm stays default), server
  URL + token fields with eager validation on connect
- validation uses an empty playing_now probe rather than validate-token,
  which Multi-Scrobbler answers 200/valid even for wrong tokens
- design docs: CONTEXT.md glossary + ADRs 0001-0003
- connect() treats Koito's 400 'payload is nil' as auth success: Koito's
  auth middleware runs before the payload check, so that 400 proves the
  token was accepted (bad tokens get 401)
- normaliseBaseUrl strips pasted /1 or /1/submit-listens suffixes, since
  Koito documents {host}/apis/listenbrainz/1 as the base URL
Comment thread renderer/index.html
</div>

<div class="panel-title">Last.fm</div>
<div class="panel-title">Scrobbling</div>

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Image Image

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.

1 participant