Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Subsonic clients

tapedeck’s daemon speaks the Subsonic API, the protocol Navidrome and Airsonic use, so any Subsonic app plays your library and your ListenBrainz playlists straight from tapedeck and scrobbles through it. There is nothing to install besides the client: cliamp in a terminal, Symfonium, Tempo or DSub on Android, play:Sub on iOS, Feishin or Supersonic on the desktop. Plex stays optional.

Switch it on

The Subsonic endpoints share the HTTP API’s port, so [server] listen is all it takes:

[server]
listen = "0.0.0.0:8687"

In the client, add a Navidrome or Subsonic server with the URL http://<host>:8687 and any username and password: without [server.subsonic] the daemon treats every client as anonymous, which on a LAN or a Tailscale network is all you need. Anonymous clients get the [server] anonymous scopes, by default read, stream and listen, which is exactly what a player uses.

If the port faces the internet, require a sign-in:

[server.subsonic]
user = "mirza"
password_file = "/run/secrets/subsonic-password"   # or password = "…" for a quick test

Clients then authenticate the Subsonic way (a salted MD5 token or the password itself) and, once signed in, may do everything; the anonymous scopes no longer matter for them. The admin bearer token of the HTTP API passes too.

What a client sees

  • Playlists: every ListenBrainz playlist tapedeck has, the current ones under the title Plex shows (Weekly Jams), older editions under their ListenBrainz name, plus the Requests playlists from the Telegram bot.
  • Artists and albums: the library grouped by MusicBrainz release and artist, so names follow MusicBrainz and ids survive renames, plus every file of the external libraries (Lidarr’s), grouped by its tags. Search covers artists, albums and titles.
  • Cover art: from the Cover Art Archive by release id, fetched once per size and kept in covers/ next to the database.
  • Streaming: the original files with seeking, own and external ones alike.
  • Lyrics: synced through the OpenSubsonic songLyrics extension, plain through getLyrics, from what lyrics has gathered.
  • Scrobbling: the client’s “now playing” and “scrobble” calls become listens on your ListenBrainz account through the daemon’s token, with the same queue and retry as the TUI.

Favourites and ratings are accepted and dropped, since tapedeck keeps no stars; playlist editing from the client is not offered, playlists come from ListenBrainz. Artist and album info pages, lyrics, podcasts, bookmarks and the play queue answer empty, so clients that ask for them after login carry on. Both the ID3 (getArtists) and the folder (getIndexes, getMusicDirectory) browsing styles work, and responses are XML by default or JSON with f=json, as the protocol says.

cliamp

cliamp setup          # pick Navidrome, enter http://sado:8687 and any user and password
cliamp                # the tapedeck playlists are in the provider panel, N opens the browser

cliamp reports plays back to the server, so listening in cliamp scrobbles to ListenBrainz without a plugin.

For other projects

The protocol layer is its own crate, crates/subsonic-server: you implement a Library trait (songs, playlists, files, cover art, scrobbles) and mount the axum router it gives you. tapedeck’s own implementation is src/subsonic.rs, about two hundred lines, and the crate has no tapedeck types in it, so it can move to a repository of its own when someone wants it.