0c9c30d1c2
* feat(ipc): report live radio metadata in status A stream's playlist entry only carries the station name, so status reported that with no artist while the TUI showed the actual song. Stations broadcast now-playing text inline as ICY metadata (the StreamTitle field of the SHOUTcast/Icecast protocol), which the UI polls but never reached the IPC response. Apply the UI's own resolution in both the TUI and daemon status handlers, and add TrackInfo.StreamTitle (the raw StreamTitle value) plus TrackInfo.Station so a client can show station, artist/song, and progress together. Resolved at the status handlers rather than in ipcTrackInfo/trackInfo, since only the now-playing track has stream context. * fix(ipc): keep the stored title when an ICY tag has no song A StreamTitle of "Artist - " cuts to an empty title, which blanked the display instead of falling back to the station name. Guard the split in resolveTrackDisplay (fixing the TUI and Lua events too, not just status) and in the daemon, and derive Station from the resolved title so both paths agree. Also handle a stream title with no artist in the docs jq example. Addresses review feedback on #319. * test(ipc): cover the daemon's stream-title contract Extract the daemon's stream branch into applyStreamTitle so the test exercises the real implementation rather than a copy of it, and cover the "Artist - Title", "Artist - ", title-only, no-metadata, and non-stream cases. statusResponse needs a live player, so the helper is the seam. Also guard the docs jq example against a missing .track, which printed a literal "null" when nothing was loaded. Addresses review feedback on #319.