a Jellyfin & Subsonic client for the terminal — powered by mpv, Chromecast and UPnP MediaRenderer
mpv chromecast mpris navidrome jellyfin upnp tui
0

Configure Feed

Select the types of activity you want to include in your feed.

fin / CHANGELOG.md
7.4 kB 146 lines
1# Changelog 2 3All notable changes to `fin` are documented here. 4 5The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), 6and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 8## [0.5.0] - 2026-07-08 9 10### Added 11- **MPRIS support** (`fin-mpris`) — on Linux and the BSDs, fin registers 12 `org.mpris.MediaPlayer2.fin` on the D-Bus session bus while the TUI 13 runs, so media keys, GNOME/KDE applets, waybar and `playerctl` can 14 drive playback: play/pause, next/previous, seek and SetPosition, 15 volume, shuffle and repeat (mapped to MPRIS `LoopStatus`), with track 16 metadata (title, artist, duration, cover art) pushed as 17 `PropertiesChanged`/`Seeked` signals. The MPRIS player shares the same 18 swappable renderer handle as the TUI and the UPnP MediaRenderer, so 19 desktop controls follow you when you switch to a Chromecast or UPnP 20 device. Built on zbus (pure Rust — no dbus system library needed); 21 starting without a session bus (headless/SSH) is a non-fatal warning. 22 A second fin instance falls back to a pid-suffixed bus name per the 23 MPRIS spec. 24 25## [0.4.0] - 2026-07-07 26 27### Added 28- **Built-in UPnP MediaRenderer** (`fin-mediarenderer`) — fin now advertises 29 *itself* as a cast target on the LAN while the TUI runs. Any UPnP control 30 point (BubbleUPnP, Kodi, Jellyfin's "Play On", …) can push streams at 31 this machine: audio decodes in-process via symphonia, video is handed to 32 mpv, and the pushed track shows up in the Now Playing bar with a 33 `⇊ UPnP` badge plus a status-line notice naming what arrived. Includes 34 SSDP presence (alive/byebye + M-SEARCH answers), AVTransport / 35 RenderingControl / ConnectionManager SOAP control, and GENA `LastChange` 36 eventing. On by default; disable with `--no-media-renderer`, 37 `FIN_NO_MEDIA_RENDERER=1`, or `media_renderer.enabled = false`. 38 `media_renderer.friendly_name` / `.port` are also configurable, and the 39 device UDN is generated once and persisted so control points recognize 40 the machine across restarts. 41 42### Changed 43- **Logs no longer corrupt the TUI** — while the TUI owns the terminal, 44 tracing output is routed to `fin.log` in the cache directory instead of 45 stderr (any GENA notify failure, cast-in notice, or playback warning 46 used to print straight over the interface). CLI one-shot commands still 47 log to stderr, and `-v`/`RUST_LOG` behave as before. 48 49### Fixed 50- **Idle volume readback** — `LocalRenderer` reported 100% volume while 51 idle even after a volume change; it now mirrors the audio player's 52 actual volume, so the TUI slider and UPnP `GetVolume` stay truthful 53 between tracks. 54- **Queue marker stuck while casting** — when playing to a UPnP or 55 Chromecast renderer, auto-advance and Next/Previous moved the queue 56 cursor without updating the shared playback state, so the Queue 57 screen's ▶ marker and `(n/total)` counter stayed on the old track. 58- **Shuffle & repeat while casting** — `z` and `Shift+R` were silent 59 no-ops on UPnP and Chromecast renderers; both now drive the shared 60 queue, so shuffle order and repeat one/all work the same as local 61 playback. 62 63## [0.3.1] - 2026-07-05 64 65### Added 66- **Shuffle-play shortcut** — `Shift+X` plays the highlighted container 67 (album, artist, playlist, series) or, on flat views, everything in the 68 current list (all favorite tracks, all videos, an open album/playlist's 69 tracks) in random order. The pool is shuffled up front so the first track 70 is random too, and shuffle mode is switched on for whatever joins the 71 queue later. 72 73### Changed 74- **Videos tab is now Jellyfin-only** — Subsonic has no video API, so on a 75 Subsonic server the tab is hidden from the bar, `Tab`/`Shift+Tab` skip it, 76 and `2` shows a hint. Switching servers while on Videos bounces to Music. 77- **ReplayGain now runs in the Rockbox DSP** — upgraded `rockbox-dsp` to 78 0.2.0 and moved gain application into its pre-gain (PGA) stage, the same 79 fixed-point pipeline as the EQ and tone controls. Tag extraction stays in 80 fin; the old f32 multiplier survives only as a fallback for paths the PGA 81 can't reach (crossfade-incoming track, non-stereo output, first primed 82 packet). 83 84## [0.3.0] - 2026-07-05 85 86### Added 87- **Subsonic backend** with auto-detection at login — point `fin login` at a 88 Jellyfin *or* Subsonic server (Navidrome, Airsonic, Gonic, Astiga, …) and 89 the flavour is probed automatically. Multiple servers of either kind can be 90 saved side by side. 91- **Favorites tab** (`♥`, key `4`) listing everything you've liked — Jellyfin 92 favorites and Subsonic stars alike. Supports the usual actions (Enter to 93 play/drill, `a` enqueue, `n` play next, `x` play container, `r` refresh). 94- **Like / dislike shortcuts** — `Shift+L` favorites (stars) the highlighted 95 item, `Shift+D` removes it. Both fall back to the now-playing track on 96 screens without a library selection, so you can like a song from anywhere 97 while it plays. Disliking from the Favorites tab drops the row immediately. 98- **Server-backend badge** — the header shows `◈ Jellyfin` / `≋ Subsonic` for 99 the active server, and each row in the Settings server list shows its 100 backend between the name and URL. 101- **In-process audio path** — HTTP streaming, `symphonia` decode, resampling, 102 and `cpal` output all run in-process; mpv is now used only for video. 103- **10-band Rockbox equalizer** with interactive band selection and per-band 104 gain nudging on the Settings screen. 105- **Bass & treble shelves** (Rockbox tone controls), `b`/`Shift+B` and 106 `y`/`Shift+Y`. 107- **ReplayGain** (off / track / album) and **crossfade** (crossfade / mixed 108 modes, cyclable duration). 109- **Queue persistence**, shuffle, repeat, and queue-management keys; Enter on 110 the Queue screen jumps the playhead instead of collapsing the queue. 111- **Album detail view** with disc grouping, track numbers, year, and a 112 client-side sort safety net. 113- **`?` keyboard-shortcuts help modal.** 114 115### Changed 116- Screen tab shortcuts: Music `1`, Videos `2`, Playlists `3`, Favorites `4`, 117 Queue `5`, Search `6`, Devices `7`, Settings `8`. 118- README, in-app header, and help modal describe fin as a Jellyfin **and 119 Subsonic** client rather than Jellyfin-only. 120 121### Fixed 122- "Recent listens not updated" on the Jellyfin/Subsonic scrobble path. 123- Scrobble/session errors now stay warn-only instead of interrupting playback. 124- Now-playing marker no longer shifts by one after a play-triggered crossfade. 125 126## [0.2.0] - 2026-07-03 127 128### Added 129- **UPnP MediaRenderer** discovery and streaming (Sonos, Kodi, Roon endpoints, 130 Samsung/LG TVs, gmediarender, …) alongside the existing local and Chromecast 131 renderers. 132 133## [0.1.0] - 2026-07-03 134 135### Added 136- Initial release — a Ratatui TUI plus one-shot CLI for Jellyfin. 137- Local **mpv** playback and **Chromecast** streaming. 138- fzf-style instant search, playlist browsing, and drill-in navigation. 139- Full pagination of the Items endpoint so large libraries load completely. 140 141[0.5.0]: https://github.com/tsirysndr/fin/compare/v0.4.0...v0.5.0 142[0.4.0]: https://github.com/tsirysndr/fin/compare/v0.3.1...v0.4.0 143[0.3.1]: https://github.com/tsirysndr/fin/compare/v0.3.0...v0.3.1 144[0.3.0]: https://github.com/tsirysndr/fin/compare/v0.2.0...v0.3.0 145[0.2.0]: https://github.com/tsirysndr/fin/compare/v0.1.0...v0.2.0 146[0.1.0]: https://github.com/tsirysndr/fin/releases/tag/v0.1.0