From 00d526740f216422682ffa0b3af7431991f6d907 Mon Sep 17 00:00:00 2001 From: InstaZDLL Date: Sun, 25 Oct 2026 02:08:14 +0200 Subject: [PATCH 1/8] docs: RFC-022 proposes playback and web client improvements ReplayGain in the web player through Web Audio, discography sections and appearances on the artist page, an installable client with no service worker, AAC in ADTS, a Subsonic format fallback, and a form body sized for the largest playlist. Signed-off-by: InstaZDLL --- docs/rfcs/RFC-022-playback-and-web-client.md | 263 +++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100644 docs/rfcs/RFC-022-playback-and-web-client.md diff --git a/docs/rfcs/RFC-022-playback-and-web-client.md b/docs/rfcs/RFC-022-playback-and-web-client.md new file mode 100644 index 00000000..37d0f58a --- /dev/null +++ b/docs/rfcs/RFC-022-playback-and-web-client.md @@ -0,0 +1,263 @@ +# RFC-022 — Playback and the web client: loudness, discography, install, AAC + +- **Status**: Proposed +- **Implemented by**: the pull request that carries this RFC. The *Status* + field above never flips in this project; this line is the one that says + what is running. +- **Date**: 2026-10-25 +- **Authors**: the WaveFlow project +- **Depends on**: [RFC-002](RFC-002-waveflow-server-v2.md) (the stream tickets, + the frozen Subsonic contract, the one set of domain services) + +## Problem + +A comparative audit of this server against Navidrome, Meelo, kima-hub and +Ampache (2026-10-24) listed five gaps in how music reaches a listener. Each +was checked in the code before this was written, and two of them turned out +smaller or different from what the audit said: + +1. **ReplayGain is read and never applied.** The scanner stores the four + ReplayGain values and `SongItem` carries them on `/api/v2`, but the web + client's `Song` type does not even declare them, and the player plays every + track at the level its master was cut at. +2. **An artist page is one flat grid.** `album.release_types` is stored, and — + contrary to the audit — it *is* on the native wire already: `AlbumItem` + serialises it on every album listing. What is missing is a decision about + what the values mean, so the page cannot group by them, and nothing lists + the albums an artist is credited on without being their album artist. +3. **The web client cannot be installed.** `webapp/public` has no manifest and + no icon a phone accepts, so "Add to home screen" makes a bookmark. +4. **Transcoding knows two formats, and refuses the rest.** `src/media.rs` + encodes MP3 and Opus only. A Subsonic `format=aac` or `format=flac` is + answered error 10, where every other server plays something. +5. **A Subsonic form POST is capped at 64 KiB.** The audit estimated the cap + at about 1,600 UUIDs. It is lower, and it depends on the name of the + parameter: `songId=&` is 44 bytes, so `createPlaylist` stops short of + 1,490 tracks; `songIdToAdd=&` is 49, so `updatePlaylist` stops short + of 1,338, less in both cases what the credentials take. A test sending the + playlist ceiling of 10,000 in one `updatePlaylist` was answered + `Invalid form body` under the old bound. `savePlayQueue` is a + different case: it is refused above 400 tracks by `MAX_QUEUE_TRACKS`, a + domain bound shared with the native API, long before the body is. + +## Decision 1 — ReplayGain in the web player, through Web Audio + +The `