Skip to content

v3.14 - Jellyfin v12 support! Fixes

Choose a tag to compare

@MrSimmo MrSimmo released this 12 Oct 14:34
· 33 commits to main since this release

I have combined v3.13 and v3.14 into one release.

v3.13 brought Jellyfin support to Sonance. Use it exactly the same as you have done before with Navidrome with Jellyfin!

v3.14 I noticed a couple of regressions - holding the ok/select/enter button on the Samsung silver remote didn't cause the context menu to trigger, and longer lines of lyrics were getting truncated. Both of these should now be fixed.

So you have two for one! Enjoy!

3.14 Fix Release

Fixed

  • Long lyric lines are no longer cut off. With lyrics open on Now Playing, a line longer than the panel now wraps onto further rows at whole words (no hyphens), at every interface size, and shows in full: nothing is cut at the right edge, and at 175 % and 200 % the lyrics no longer run under the controls on the left. When the song reaches a wrapped line, all of its rows light up together. The amount of wrapping follows the interface size you choose in Settings. A single word too long for a row is the one thing that breaks mid-word, rather than being cut. A line so long that it is taller than the lyrics panel (only at the largest sizes) shows its first rows highlighted, with the rest below.
  • Holding OK opens the menu on the Samsung silver remote. On the simple remote without coloured buttons, holding OK on a song started playing it instead of opening the options menu. Holding OK now opens the menu after about half a second on that remote too, as it does on the remote with coloured buttons. A short press still plays the song.
  • At 175 % and 200 %, the credits panel (ⓘ on Now Playing) also no longer runs under the controls.

For developers

  • A key trace in the Performance overlay. With Settings → Advanced → Performance overlay on, a panel under the readout lists the last 12 key events, newest last: down or up, the key code, the key name, the repeat flag and the milliseconds since the previous event. It shows what a remote sends while OK is held, so a photo of the TV can settle a remote that still misbehaves. With the overlay off nothing is attached, as before.
  • Hold OK, in js/focus.js: a keyup on a long-press zone is provisional: an OK keydown within 100 ms (RELEASE_GRACE_MS) continues the hold, so a short press there now activates 100 ms after its keyup. Once an OK keyup has been seen since launch, a key still down at 500 ms opens the sheet with or without auto-repeats. After a hold opens the sheet, OK is swallowed until the key is really released.
  • Lyrics: synced lines are laid out at calc(100% / 1.15) with overflow-wrap: break-word, the lyrics and credits panels clear the left column above about 164 %, and the scroller reads the active line's real height and keeps it out of the top fade.
  • Fixtures and specs: ?mockLyricsLong=1 (long synced lines, or unsynced with mockLyricsUnsynced=1, on both mock backends); e2e/lyrics-wrap.spec.ts, e2e/hold-ok-sequences.spec.ts and e2e/perf-hud-keys.spec.ts. The suite has 386 tests.

3.13 adds Jellyfin as a second kind of server. Navidrome works exactly as in 3.12.

New

  • Jellyfin 12.2 servers. On the login screen, type your Jellyfin server's address and port, your username and password, as for Navidrome. Sonance works out which kind of server it is and signs in. Every screen and feature then works as it does on Navidrome, fed by Jellyfin.
  • Accounts without a password. On a Jellyfin server, leave the password empty. (A Navidrome account always has one; an empty password there still shows "Please enter a password".)
  • Your Jellyfin music libraries appear in Settings → Libraries, including any you have hidden from your Jellyfin home screen, and choosing them works as it does with Navidrome's.
  • On a Jellyfin server, Settings → Server → API Version reads "Jellyfin" and the server's version, and an empty Playlists screen tells you to create playlists in Jellyfin.

What is different on Jellyfin

The screens are the same; some of what fills them comes from Jellyfin, which keeps different information from Navidrome:

  • Your favourites are listed A–Z (Jellyfin does not record when you favourited something). With more favourites than a Home row holds, the row shows the first ones A–Z rather than the most recent.
  • Popular on an artist's page lists the songs you have played most by that artist, and hides until you have played some. On Navidrome it comes from Last.fm.
  • Start radio and Similar artists come from Jellyfin's own Instant Mix and similarity, from your library, instantly.
  • Biography shows Jellyfin's artist overview, which is often empty; the section hides when it is, as before.
  • Song credits are fuller on Navidrome: Jellyfin has the writing and production roles (composer, producer, mixer …) and the file details, but no performers' instruments, no BPM and no original release year.
  • Playlist cards show the number of songs but not the total time (Jellyfin's playlist list does not include it); the playlist itself has it.
  • Search matches names: an artist search finds album artists, an album search album titles, a song search song titles. Navidrome searches every artist and matches albums by other fields too, so the same words can find different results.
  • Resume last queue is saved on the TV, for that server and user, rather than on the server, so it does not follow you to another device.
  • An artist reached from a song or a similar-artist link who has no albums of their own shows the albums they appear on (Navidrome shows none).
  • Logout also signs this TV out on the Jellyfin server.

Not supported: Quick Connect, single sign-on or LDAP plugins, a user picker, Jellyfin before 12.x, and Jellyfin's video, audiobook or other non-music libraries.

For developers

  • js/jellyfin-api.js is a translation adapter: it inherits SubsonicAPI and turns each Subsonic call the app makes into Jellyfin requests, answering in the Subsonic shape, so the screens, both caches, the album cursor and the song pager are shared by both servers. js/api.js gained one additive hook.
  • The mock server answers as a Jellyfin server too (?mockBackend=jellyfin), from the same fixtures, and the suite compares the two screen by screen (e2e/jellyfin-parity.spec.ts), checks every Navidrome request against 3.12's (e2e/navidrome-identity.spec.ts), and covers login, playback, the queue and every translated call.