[2026.06.29]
Added
jellyfin: Jellyfin-compatible HTTP API server on its own port — newcrates/jellyfin/src/server/module gated behind theservercargo feature, spawned alongside Navidrome fromcrates/server/src/lib.rs; opt-in by settingjellyfin_portinsettings.toml(conventionally8096) — omitting the key disables the server entirely; spoofsProductName: "Jellyfin Server"andVersion: 10.11.11so the SDK-generated clients (Finamp, Findroid, Streamyfin, Amcfy Music, Symfonium) treat it as a real Jellyfin server; reusessubsonic_username/subsonic_passwordfromsettings.tomlas the Jellyfin credentials (additionally gated on the password being non-empty); tokens are persisted in a newjellyfin_tokenstable (migration applied at startup) and accepted viaX-Emby-Token,Authorization: MediaBrowser Token=…, or?api_key=query param on streaming URLs; item IDs are deterministic dashed-UUIDs derived from the nativeArtist/Album/Trackids and round-tripped via a newjf_guidslookup table; full route surface covers/System/Info{,/Public},/Users/AuthenticateByName(PascalCase + lowercase variants for Amcfy),/Users/Public,/Users/{id}/Views,/UserViews,/Library/MediaFolders,/Items(withparentId,includeItemTypes,searchTerm,albumArtistIds/artistIds,ids, pagination — accepts both camelCase and PascalCase plus repeated keys),/Items/{id}+/Items/{id}/{Images/Primary,File,PlaybackInfo},/Audio/{id}/{stream,stream.{ext},universal}with HTTP Range support,/Search/Hintsbacked by the samerepo::{artist,album,track}::filterLIKE queries,/Sessions{,/Capabilities/Full,/Playing,/Playing/Progress,/Playing/Stopped}acks,/ScheduledTasks/Running/{id}+/Library/Refresh(return 204 — actual scans are owned byaudio_scan::start_watcher),/Shows/*+/UserItems/*+/Items/{Suggestions,Resume,Latest}stubs for client home rails, and/Items/{id}/Images/{kind}(both PascalCase and lowercase/items/...paths for Findroid); discovery runs in two tokio tasks —_jellyfin._tcp.local.mDNS broadcast plus a UDP listener on port7359that answers the literal"Who is JellyfinServer?"probe with{"Address":"http://<lan-ip>:<port>","Id":…,"Name":…}settings: new optionaljellyfin_port: Option<u16>field onNewGlobalSettings(defaults to8096); also added to theInto<NewGlobalSettings>impl incrates/rpc/src/lib.rsso gRPC settings round-trips don't drop the field
Fixed
jellyfin: album art now resolves correctly —rockbox-librarystoresalbum_artas one of three forms (bare filename living under~/.config/rockbox.org/covers/, absolute filesystem path, orhttp(s)://URL for Rocksky-sourced artist images), but the initial Jellyfin image handler joined bare filenames againstmusic_dirand gotNotFound; replaced with aserve_art_valuethat mirrors Navidrome's resolver (proxyhttp(s)://viareqwest, read absolute paths as-is, prefix bare filenames with~/.config/rockbox.org/covers/), and added the "if the album row has no art, search its tracks" fallback Navidrome already uses
Full Changelog: 2026.06.26...2026.06.29