Synced lyrics view (web player)
A full-viewport lyrics overlay that highlights the current line and scrolls to follow it.
- Lyrics button uses a microphone icon.
- Tap any line to seek playback to it.
- Auto-scroll suspends the moment you scroll, and a jump-back control returns you to the current line.
- Font size stepper and sync offset nudge, both persisted per device.
Lyrics from your own files
Lyrics stored in a song's audio file tag are now a first-class source, preferred over LRCLIB when timed.
- The lyrics tools work with LRCLIB disabled, serving file lyrics only.
Lyrics tools split
get_lyrics now takes an identity, not metadata. It accepts a Navidrome songId or an LRCLIB lrclibId.
search_lyricsis new and owns the LRCLIB metadata search. It returns candidate records plus any matching library song.- Fixed an LRCLIB lookup that missed synced lyrics that exist.
Radio station URL validation
- Control characters are rejected in station URLs. A value with a line break can no longer be stored or played.
create_radio_stationvalidates the home page URL scheme. It previously had no server-side check.- The URL error messages are separate. A line break no longer reports as a bad scheme.
Client compatibility (#32)
The streamUrl and homePageUrl patterns in create_radio_station are now fully anchored. An unanchored pattern made llama.cpp's json-schema-to-grammar converter reject the whole tool set, so every tool from this server failed for native function calling.
Other
- New
GET /api/lyrics/:songIdendpoint, backed by the shared lyrics resolver. - Content-Security-Policy header now served on the web player.
- Live-read tests moved to
pnpm test:live, sopnpm test:runis deterministic.