2026.05.28
[2026.05.28]
Added
netstream: background prefetch thread per HTTP stream — a dedicated thread fills a 2 MBVecDequebuffer from the network sorb_net_readdrains in sub-µs without ever blocking on TCP; forward seeks within the prefetch window consume buffered bytes without issuing a newRangerequest; backward or large (>2 MB) forward seeks issue aRangerequest and replace the reader thread atomically
Fixed
- HTTP streaming: removed reqwest total-request timeout (only
connect_timeout15 s remains) — the previous 30 s deadline killed large remote files mid-stream;read_as_file()reverted to a retry-loop that fills the full requested buffer - Buffering interleaving:
fill_buffer()now passesBUFFERING_DEFAULT_FILECHUNKinstead of0when a second handle has remaining data, so next-track pre-buffering round-robins with the current track instead of monopolising the buffering thread and starving the ring buffer - HTTP pre-buffering cutting current-track playback:
buffer_handle()caps HTTP handles to oneBUFFERING_DEFAULT_FILECHUNKper call;streamfd.creplaces per-chunkfprintf(stderr, …)withlogf()(compiled out in production) to eliminate hundreds of blockingwrite(2)syscalls per track - Expo: Navidrome cover art now appears in the miniplayer, full-screen player, and queue when playing ND HTTP streams —
coverArtUrlFromStreamUrl()added tonavidrome-client.tsreconstructs agetCoverArtURL from theid,u,t,sparameters embedded in the stream URL; used as a fallback intrackFromProtowhenalbum_artis empty
Full Changelog: 2026.05.27...2026.05.28