Skip to content

2026.06.29

Latest

Choose a tag to compare

@tsirysndr tsirysndr released this 29 Jun 15:58
· 6 commits to master since this release

[2026.06.29]

Added

  • jellyfin: Jellyfin-compatible HTTP API server on its own port — new crates/jellyfin/src/server/ module gated behind the server cargo feature, spawned alongside Navidrome from crates/server/src/lib.rs; opt-in by setting jellyfin_port in settings.toml (conventionally 8096) — omitting the key disables the server entirely; spoofs ProductName: "Jellyfin Server" and Version: 10.11.11 so the SDK-generated clients (Finamp, Findroid, Streamyfin, Amcfy Music, Symfonium) treat it as a real Jellyfin server; reuses subsonic_username / subsonic_password from settings.toml as the Jellyfin credentials (additionally gated on the password being non-empty); tokens are persisted in a new jellyfin_tokens table (migration applied at startup) and accepted via X-Emby-Token, Authorization: MediaBrowser Token=…, or ?api_key= query param on streaming URLs; item IDs are deterministic dashed-UUIDs derived from the native Artist/Album/Track ids and round-tripped via a new jf_guids lookup table; full route surface covers /System/Info{,/Public}, /Users/AuthenticateByName (PascalCase + lowercase variants for Amcfy), /Users/Public, /Users/{id}/Views, /UserViews, /Library/MediaFolders, /Items (with parentId, 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/Hints backed by the same repo::{artist,album,track}::filter LIKE queries, /Sessions{,/Capabilities/Full,/Playing,/Playing/Progress,/Playing/Stopped} acks, /ScheduledTasks/Running/{id} + /Library/Refresh (return 204 — actual scans are owned by audio_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 port 7359 that answers the literal "Who is JellyfinServer?" probe with {"Address":"http://<lan-ip>:<port>","Id":…,"Name":…}
  • settings: new optional jellyfin_port: Option<u16> field on NewGlobalSettings (defaults to 8096); also added to the Into<NewGlobalSettings> impl in crates/rpc/src/lib.rs so gRPC settings round-trips don't drop the field

Fixed

  • jellyfin: album art now resolves correctly — rockbox-library stores album_art as one of three forms (bare filename living under ~/.config/rockbox.org/covers/, absolute filesystem path, or http(s):// URL for Rocksky-sourced artist images), but the initial Jellyfin image handler joined bare filenames against music_dir and got NotFound; replaced with a serve_art_value that mirrors Navidrome's resolver (proxy http(s):// via reqwest, 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