This (rather large) update clears out some older feature requests: album collapsing, select mode, browsing by genre and year, and a ton of other features and improvements. Oh, and it works with Navidrome now 😊
As far as Jellyfin 12.0: Supported, but I wouldn't recommend updating it just yet as the performance of the WEB UI for me has been extremely lackluster.
What's changed
Album collapsing
Much improved usability for discographies with many albums. Press o to collapse the album under the cursor, Shift+o to collapse or expand all of them. The album that's playing stays marked in italic, and if it's hiding inside a collapsed one its header lights up so you don't lose it.
Collapsing is only visual. Enter on a collapsed header still plays the whole album, and search ignores it completely so every track stays findable.
You can pick the default in the track popup (p → Album collapsing):
- Expanded - never collapse
- Collapsed - always collapse
- Auto - collapse once an artist has more than N albums (5 by default, +/- to change)
Select mode
closes #176, #109. by @alberto-is in #233 and #235 (thank you!)
Press v in a discography, album or playlist to start selecting. Space/Enter/v toggles a track, Esc cancels. Toggling an album header (de)selects the whole album (✓ when all of it is marked, • when only some).
Then:
p→ Add to playlist adds the whole selection in one requestDeletein a playlist removes everything selected (it asks first... relax, guy)
Browse by genre and year
Press 2 while you're already on the Albums tab to cycle Albums → Genres → Years. Enter opens a group, Esc takes you back out. Genres merge case-insensitively, so Rock, rock and rock are grouped. Albums with no genre or year are aggregated at the bottom.
The popup on a group lets you play or queue all of it (Alt+Enter works too) and change the sort. Genres start with the biggest ones first, years with the oldest.
Playing a huge group fetches in batches and warns you it might take a moment. Some of you have 600 albums tagged "Rock". I see you.
⚠️ If the genre list looks empty, give it a sync from the global popup (
Shift+P).
Hideable album column
closes #229
The Album column in the discography now hides itself in narrow panes by default, where the track titles need the room more. It comes back while searching, since results jump across albums and you'd have no idea where a track is from otherwise.
album_column: auto # options: 'auto', true, false
album_column_threshold: 140 # columns; only used when album_column is 'auto'
Tiny notifications
Got rid of those "Ok" popups that you had to dismiss even though they were purely informative. Copying a URL, adding to a playlist, renaming, creating, deleting all show a tiny notification in the corner that goes away on its own.
Slow stuff (global shuffle, instant mix, big genre groups) now tells you it's working instead of looking frozen. And things that can't happen, like reordering offline or starting radio without a connection, now tell you why instead of just silently doing nothing.
Background failures do the same and say what actually failed ("Library sync failed: ...") instead of opening a popup telling you to restart the app.
Smarter syncing
jellyfin-tui now listens for library changes on the server. Add an album in Jellyfin and a sync kicks off about 10 seconds after the server goes quiet, at most once every 5 minutes so a big import doesn't cause a sync storm. No more waiting around or syncing manually.
Otherwise it syncs every hour, and on startup if the last sync is over 10 minutes old. The timer is counted across restarts, so opening the app five times in a row doesn't sync five times. A sync that fails waits half an hour before trying again.
The websocket keepalive is fixed too, so the remote control connection should stay up now.
Navidrome
Since v0.64.0 Navidrome ships an experimental Jellyfin API, and jellyfin-tui works against it! Streaming, transcoding, genres, playlists, the lot. Everything except "Run a Jellyfin task", which is an admin API rather than a music one.
The API is off by default, so set Jellyfin.Enabled = true in navidrome.toml (or ND_JELLYFIN_ENABLED=true) and point jellyfin-tui at https://<your-navidrome>/jellyfin. There's an example server block in the README.
It's experimental on their side and only lightly tested on mine, so open an issue if something misbehaves.
Lyrics
- Lyrics load in the background now, so skipping to a track you've never played doesn't hang on the request. Cached ones show up instantly.
- Timing is smoother. The highlight no longer flickers back a line when mpv's position catches up, and resuming from pause doesn't jump.
- Wrapping is measured in terminal columns instead of bytes, so accented, Cyrillic and CJK lyrics stop breaking way too early.
- Lyrics and the queue both got scrollbars.
Faster playlists
Adding, removing and reordering tracks is mirrored locally right away, so reopening a playlist doesn't show you the pre-edit version until the next sync. New playlists show up immediately instead of after a full library sync, and track counts stay correct.
Discord cover art
discord_art: "musicbrainz" got a lot better. It is more accurate and shows the actual front cover more consistently. It also handles backoff a bit better, so you should see less instances of blank cover art. It is also now the default discord_art option.
Queue track popup
by @Charlie284 in #225
p on the queue opens a popup for that track: locate it in its discography, locate the now-playing track, or add it to a playlist.
Play counts
by @alberto-is in #237
Play counts now refresh from the server after a track stops, instead of waiting for the next sync.
Smaller stuff
- Instruction footers show your actual keybindings. If you remapped something, the UI finally knows about it
- ♥ next to favorites in the player bar, zen mode and search results
- Search results got counts, favorites, the now-playing italic and album artists. The empty search pane tells you what to do instead of being a sad empty box
- The empty queue tells you how to put something in it
- Durations use one format everywhere (
3:45,1:02:33) - Popup toggles use proper checkboxes and radio buttons. Cover art source is now its own little submenu
- The status bar and zen mode now respect your custom
play,pause,sleepandshufflesymbols - A big UI cleanup. All panes share the same styling code now, so they stop drifting apart
- New symbols you can override:
symbols:
selector: ">>"
editing: "E:"
# popup markers: checked/unchecked for multi-select, radio_on/radio_off for single choice
checked: "☑"
unchecked: "☐"
radio_on: "●"
radio_off: "○"- New default keys:
ocollapse album,Ocollapse all,vselect mode. If you usekeymap_inherit: false, bindCollapseAlbum,CollapseAllAlbumsandToggleSelectModeyourself
Fixed bugs
- Fixed a panic while loading when switching windows in tmux #238
- Fixed a panic when filtering strings containing
İ(U+0130) #241 - Fixed
failed to open lock file: no such file or directoryon first launch #234 - The cover art cache is now split per server, so covers from multiple servers don't mix. Your existing covers get migrated on the first launch and orphaned ones are cleaned up
- MusicBrainz album ids survive a round trip through the local cache, so Discord art for a cached track doesn't fall back to a name search
- Starting a new queue with shuffle on no longer skips the first track
- Fixed some cases where the queue would jump to the wrong track
- Progress reports are sent for the track that's actually playing, not whatever was last loaded
- Appending an album header to the temporary queue appends exactly that album, even when nothing is playing yet
- Enter on a local search result and "locate now-playing" land on the right track and keep the album header in view
auto_browse: 0is actually instant now- The discography cursor is restored by track after a restart instead of by row number
Other
- Tests now run in CI. There are actual tests now 🎉
- nix: updated inputs, set rust-src path for rust-analyzer by @onelocked in #240
New Contributors
- @Charlie284 made their first contribution in #225
- @danvincent made their first contribution in #224
- @alberto-is made their first contribution in #233
Full Changelog: v1.5.2...v1.6.0