a Jellyfin & Subsonic client for the terminal — powered by mpv, Chromecast and UPnP MediaRenderer
mpv
chromecast
mpris
navidrome
jellyfin
upnp
tui
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