feat: add Kodi/XBMC Media Server browsing via kodi:// scheme
This follows the exact pattern from the Navidrome/Jellyfin/Plex commits. It covers:
- New rockbox-kodi crate with mDNS discovery (_xbmc-jsonrpc-h._tcp.local.), browse_sources /
browse_directory via JSON-RPC, optional Basic auth, and kodi:// URL parsing
- gRPC (crates/rpc/browse.rs) and GraphQL (crates/graphql/schema/browse.rs) routing for
kodi:// paths
- GPUI desktop: KodiServers/KodiBrowse modes, KodiAuthState, auth form (manual-add only),
discovered servers navigate directly
- macOS Swift app: Kodi tile, server list, optional-credentials sheet, connectToKodi() via
URLSession
- React webui: KodiIcon, connect modal (no CORS-violating direct call — purely URL
construction), navigation handlers
- Bug fix: browse_directory used properties: [] (not ["file","filetype","label","type"] which
Kodi rejects with -32602)
feat: Navidrome/Subsonic support in macOS Swift app
- NavidromeService: Subsonic API client (albums, artists, songs, playlists,
starred, search3, star/unstar/scrobble) with MD5 token auth
- NavidromeManager: multi-server persistence to Application Support JSON,
active server switching, optimistic star toggling, cover art URL derivation
from stream URLs for miniplayer and queue
- NdResponseCache: stale-while-revalidate actor cache (30 min fresh TTL,
24 h eviction); background refresh on stale hit; skip on mutations
- NdLibraryView: Albums/Artists/Songs/Liked/Playlists sections; infinite
scroll pagination for Songs list; NdServerManagerView for add/remove/switch
- NdSongRowView: track number, art toggle (showArt), hover play, star button,
Play Next/Last + Go to Album/Artist context menu
- NdAlbumDetailView, NdArtistDetailView, NdPlaylistDetailView with Play/Shuffle
- Search: when a Navidrome server is active, search3 replaces local gRPC search;
results show ND artist circles, album cards, and song rows
- Miniplayer and QueueRowView resolve cover art from Navidrome stream URLs
chore: release 2026.06.29 — Jellyfin-compatible API server
Add an audio-only Jellyfin sidecar in `crates/jellyfin/src/server/` gated
behind the new `server` cargo feature, spawned alongside Navidrome from
`crates/server/src/lib.rs`. Activation is opt-in via `jellyfin_port` in
`~/.config/rockbox.org/settings.toml`; omit the key to disable. Reuses
`subsonic_username` / `subsonic_password` as the Jellyfin credentials.
Spoofs `ProductName: "Jellyfin Server"` + `Version: 10.11.11` so the
SDK-generated clients (Finamp, Findroid, Streamyfin, Amcfy Music,
Symfonium) treat it as a real Jellyfin server. Tokens are persisted in a
new `jellyfin_tokens` table and accepted via `X-Emby-Token`, the
`MediaBrowser Token="…"` Authorization header, or `?api_key=` on
streaming URLs. Item IDs are deterministic dashed UUIDs derived from the
native `Artist/Album/Track` ids, round-tripped via a `jf_guids` lookup
table so subsequent requests resolve back to the right row.
Discovery runs in two tokio tasks: `_jellyfin._tcp.local.` mDNS plus a
UDP listener on port 7359 answering the `"Who is JellyfinServer?"`
probe.
Album art handler mirrors Navidrome's resolver: HTTP(S) URLs proxied via
reqwest, absolute paths read as-is, bare filenames resolved under
`~/.config/rockbox.org/covers/`, with the same "fall back to any track
in the album" fallback Navidrome already uses.
Also bumps deb/rpm packaging to 2026.06.29, documents the new server in
CHANGELOG/README, adds it to the mintlify reference (ports table,
settings-toml, API intro, index card, nav entry) and a new
`api-reference/jellyfin/overview.mdx` covering enabling, discovery,
tested clients, endpoint surface, and what's not supported.