Psysonic v1.46.0 #775
Psychotoxical
announced in
Announcements
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Under the Hood — Refactoring & Test Suite
By @cucadmuh + @Psychotoxical
Alongside the user-facing changes, this release closes out a large engineering effort across the codebase. None of it changes how Psysonic behaves — it changes how fast and how safely the next features can land.
cargo testand Vitest with per-file coverage gates in CI on hot paths (playback, queue, auth, offline cache, API, core UI).Foundational work: faster reviews, narrower diffs, and a safety net under the parts of the app that matter most.
Added
Discord — album cover art from your own server
By @Sayykii, PR #462
getAlbumInfo2endpoint (requires the server to be publicly reachable).Queue — preserve "Play Next" insertion order (toggle)
By @Psychotoxical, suggested by @Sayykii, PR #464
enqueueAtpath and gets undo + server-sync support that the album path already had.Library — "favorites only" filter on Albums, Artists and Advanced Search
By @Psychotoxical, suggested by @lilgringo, PR #466
Search — artist photos in live and mobile results
By @cucadmuh, PR #470
Artist page — group albums by release type
By @Sayykii, PR #471
releaseTypes(Album, EP, Single, Compilation, Live, Soundtrack, Remix). Section order is deterministic across languages, with unknown types appended at the end.releaseTypesor all albums share the default Album type — no behaviour change for non-OpenSubsonic servers.Library — Browse by Composer
By @Psychotoxical, suggested by mmourez (issue #465), PR #487
getArtistonly walks AlbumArtist relations and returns zero albums for composer-only credits). Older / pure-Subsonic servers see a one-line capability banner. Music-folder scope is honoured.psysonic2-share links and the right-click Share menu both copy acomposerlink. Sidebar entry is off by default (classical-music use case is a niche).Song Info — absolute file path on Navidrome servers
By @Psychotoxical, suggested by volcs0, PR #504
getSongnever returned a usable path. Non-Navidrome servers fall back to whatever the Subsonic response carried.Lossless Albums — rail on Home + dedicated page + sidebar entry
By @Psychotoxical, PR #506
/lossless-albumspage with full Albums-page header parity (selection mode + Enqueue / Add Offline / Download ZIPs).m4aandwmaare excluded because they can carry both lossless and lossy. Albums stream into the page progressively as they are found.Settings — OpenDyslexic font option for dyslexic readers
By @Psychotoxical, PR #507
b/d,p/qglyphs that many dyslexic readers find easier to track than a typical sans. Continues the accessibility line started by the WCAG contrast audits and the colour-vision-deficiency themes.@fontsource/opendyslexic, SIL OFL — no CDN dependency). Covers Latin, Latin-Extended and Cyrillic; Chinese falls back to the system font, called out via a new font-subtitle field on the picker.Player Bar — album context menu on song title right-click
By @Psychotoxical, PR #512
Orbit — in-app diagnostics popover with copyable event log
By @Psychotoxical, prompted by reports from nzxl + RavingGrob, PR #524
[ISO] [scope] bodylines on the clipboard — paste straight into a bug report. Events are also bridged tofrontend_debug_logwhen Settings → Logging is on Debug.initial-sync,track-changefollowed / diverged,play-pause-flip) plus host state pushes, so the "stopped after the first song" symptom is now diagnosable from the buffer alone.Queue Toolbar — customizable button order + per-button visibility
By @kveld9, PR #534
queueToolbarStore(Zustand + localStorage), so the layout survives restarts.[Shuffle] [Save] [Load] [Share] [Clear] | [Gapless] [Crossfade] [Infinite]— same buttons in the same order as before.Settings — Advanced Mode toggle + playlist page layout
By @kveld9 + @Psychotoxical, PR #556
Romanian (ro) translation
By @MihaiCatalin120, PR #663
ro) locale for navigation, player, playlists, settings, help, and errors.HTTP — gzip + brotli decompression for the Rust-side clients
By @Psychotoxical, PR #704
Accept-Encodingand transparently decodes compressed responses. The JSON-heavy endpoints — Navidrome native/api, Bandsintown, Radio-Browser, Last.fm — were the gap; earlier curl measurements put the wire savings on those payloads at roughly 76–93 %. No behaviour change beyond smaller transfers.Search — queue pasted share links from Live Search and mobile search
By @cucadmuh, inspired by @DanielWTE's PR #551, PR #716
psysonic2-share link into Live Search or the mobile search overlay shows a dedicated row: track and queue links enqueue instead of replacing the queue like global paste; album, artist, and composer links preview on the share server without switching the active server until you confirm.Offline Library — show cached albums from all servers
By @cucadmuh, PR #719
Settings → Personalisation — player bar layout
By @kveld9 + @Psychotoxical, based on PR #627, PR #721
Queue panel — persist header duration mode
By @kveld9 + @Psychotoxical, based on PR #625, PR #724
Tracklists — Plays / Last played / BPM columns + Song Info rows
By @Psychotoxical, suggested by jbigginswyl (#516), PR #730
playCount/played/bpmfrom the Subsonic response — no extra API calls. The playlist tracklist also gets the Genre column for parity with Album + Favorites.—when Navidrome returns 0 (untagged file); Plays / Last played render—only when truly absent.Mainstage hero — prev / next arrow buttons
By @Psychotoxical, thanks to zunoz for the report on the Psysonic Discord, PR #735
Settings — Clock Format setting (Auto / 24h / 12h)
By @Psychotoxical, thanks to zunoz for the report on the Psysonic Discord, PR #742
Album page — OpenSubsonic disc subtitles after the CD heading
By @Psychotoxical, thanks to zunoz for the report on the Psysonic Discord, PR #753
Home — "Because you listened" recommendation rail
By @Psychotoxical, PRs #489, #493
Playlists — virtualized tracklist for large playlists
By @artplan1, PR #755
@tanstack/react-virtualon the shared app scroll viewport — the same convention as Artists, Composers, and the library card grids.PlaylistRowwith a stable callback bundle so virtualizer scroll updates do not re-render the full list.Changed
Build — lazy-loaded routes and Vite chunk warnings
By @cucadmuh, PR #463
Dependencies — npm / Cargo refresh and rodio 0.22
By @cucadmuh, PR #463
UI — cover cache, mainstage rails, and smoother virtual lists
By @cucadmuh, PR #468
Covers / image cache — parallel fetch + downscale, registry guard, search slot hints
By @cucadmuh, PR #470
Settings — adding a server no longer switches to it
By @Psychotoxical, PR #475
/loginis unchanged: signing in there still selects the chosen server.Most Played — quick actions, real context menu, prominent plays badge
By @Psychotoxical, suggested by nzxl, PR #482
11 playsin EN,11× gespieltin DE), since the play count is the central datum on this page.Multi-select — Shift+Click range selection on grid pages
By @Psychotoxical, PR #484
Help — full rewrite with live search and 10 cleanly-themed sections
By @Psychotoxical, PR #485
Community themes — redesign pass
By @kveld9, PR #490
Settings — collapse-by-default cleanup, font picker without dropdown, OpenDyslexic at top
By @Psychotoxical, PR #508
Settings — language picker uses endonyms
By @Psychotoxical, suggested by cucadmuh, PR #514
English,Deutsch,Español,Français,Nederlands,Norsk,Русский,中文,Română— same nine labels in every locale instead of translating each name into the current UI language. A native speaker can recognise their own language regardless of which UI language is active; same convention used by most OS-level language pickers.Backend — Cargo workspace with 5 domain crates (Rust refactor)
By @cucadmuh + @Psychotoxical, PR #532
Covers — no flash of previous track artwork on skip
By @cucadmuh, PR #695
Library card grids — virtualization + configurable column cap
By @cucadmuh, PR #711
Hot cache — promote completed ranged streams larger than 64 MiB
By @cucadmuh, PR #737
Playback — stream buffering indicator on cover art
By @cucadmuh, PR #737
Frontend — large modules split into focused files (React/TypeScript refactor)
By @cucadmuh + @Psychotoxical
Removed
Settings — Animations 3-state setting under Seekbar Style
By @Psychotoxical, PR #495
data-perf-disable-animations, seekbar via per-feature toggles).'reduced'or'static'selected silently lands on the normal animation path on first launch — the persist layer strips the obsolete field, no user-facing prompt.Fixed
Hot cache, HTTP streaming replay, and queue source indicator
By @cucadmuh, PR #463
video/mp4Content-Type is no longer mistaken for audio.Sidebar — New Releases read state under storage cap
By @cucadmuh, PR #463
Windows — tray double-click
By @cucadmuh, PR #463
Playback stability — preview seekbar, sleep/wake recovery, and card-hover jitter
By @cucadmuh, PR #476
Analysis queue control — prune stale backfill jobs and cap warmup window
By @cucadmuh, PR #480
Sidebar — Playlists icon and hover hitbox in collapsed mode
By @Psychotoxical, PR #481
Tracklist — drop now-playing pulse + EQ-bar animations
By @Psychotoxical, PR #488
.track-row.activekeeps the accent-tinted background but no longer pulses. The "now playing" indicator is now a singleAudioLinesicon — one SVG per active row instead of three animated spans.Tray — broken navigation after restoring via desktop / start-menu shortcut
By @Psychotoxical, reported by netherguy4, PR #501
opacity: 0. Both restore paths are now consistent.Track preview — volume slider ignored during preview
By @Psychotoxical, reported by netherguy4, PR #502
audio_set_volumeonly ramped the main sink, so slider drags during preview had no audible effect on the preview level. The preview sink now stays in lock-step with the slider while a preview is in flight.Radio — queue navigation, dedup, and similar-first variety
By @Psychotoxical, reported by netherguy4, PR #503
next()/previous()/ repeat-one / queue-row click now pass an explicit target index instead of resolving by id.enqueueRadio, thenext()top-up, and intra-batch overlap (top + similar) is now closed by a radio-session-scoped seen-set, reset on artist change andclearQueue.Security — Tauri patch for IPC origin-confusion (GHSA-7gmj-67g7-phm9)
By @Psychotoxical, PR #509
Home — Because-you-listened rail compact in narrow layouts
By @Psychotoxical, PR #520
AlbumRowlayout instead of stretching the hero-style cards to full width.Context menu — render above the floating player bar
By @Psychotoxical, reported by Prymz, PR #522
zIndex: 999on the menu wrapper overrode the stylesheet'sz-index: 10000and sat below the floating bar at1000. The override is removed so the stylesheet rule wins; submenus follow.Orbit — guest playback fixes
By @Psychotoxical, reported by nzxl + RavingGrob, PR #525
currentTime(resets to 0 onaudio:ended, mid-track on real pause), so the guest no longer sits silent on host-driven track changes that arrive in the 0–2.5 s gap after the guest's own track has ended.playTrackpoll now waits forcurrentTime > 0.1before applying the seek, so the waveform no longer snaps back to 0:00 (PR #528).playTrack(track, [track])call (e.g. "Play this album" on a single-track album) slipped past the orbit bulk-guard. Now intercepted: appends + jumps instead of replacing (PR #529).isPlayingflip, in addition to the 2.5 s timer. Previously a pause could take up to ~5 s to land (PR #537, reported by xrexy on Discord).not-allowedcursor. Previously a guest seek would jump the local player and either snap back or push the guest into a diverged state (PR #537, reported by xrexy on Discord).Offline downloads — the cancel button works again + the sidebar toast keeps its size
By @Psychotoxical, PR #694
.partfiles are cleaned up). Tracks that already finished before the cancel are kept.Player UI — broken album-art icon when switching tracks
By @cucadmuh, PR #695
Album & player — split OpenSubsonic album credits and performers
By @cucadmuh, PR #696
Search — hide duplicate artist hits with zero albums
By @cucadmuh, thanks to zunoz for the report on the Psysonic Discord, PR #697
Internet Radio — Add / Edit station modal no longer clipped on empty library
By @cucadmuh, thanks to voidboywannabe for the report on the Psysonic Discord, PR #699
Settings — contributors list sorted chronologically
By @Psychotoxical, PR #700
Now Playing — stable list keys on dashboard cards
By @cucadmuh, PR #703
Playback — track no longer clipped at the end with gapless and crossfade off
By @Psychotoxical, PR #708
Artists — infinite scroll after first page
By @cucadmuh, PR #709
Statistics / playlists — duration totals rounded to the nearest minute again
By @Psychotoxical, PR #710
formathelper consolidation had switched the shared formatter from rounding to truncating; the round-to-nearest-minute behaviour is restored.Mixes — rating filter and Lucky Mix queue fill
By @cucadmuh, PR #714
Multi-server — queue playback stays on the source server when browsing another library
By @cucadmuh, PR #717
UI — selectstart blocker no longer throws on Text node targets
By @cucadmuh, PR #718
UI — consistent Orbit / Server / Live header dropdown styling
By @Psychotoxical + @cucadmuh, PR #725
.nav-library-dropdown-panelcontainer — same background, border, shadow and radius via the existing semantic tokens. Item layouts per dropdown stay case-specific.Queue — Lucky Mix coalesced into one Ctrl+Z / Cmd+Z undo step
By @cucadmuh, PR #728
Queue panel Info — artist image now follows the current track
By @Psychotoxical, PR #732
CachedImage's IndexedDB then persisted that mismatched blob, so every subsequent track stayed stuck on the previous artist's image. Source and cache key now always come from the same track.Album header — Artist Bio button hidden on Various-Artists compilations
By @Psychotoxical, PR #733
Album header — Artist Biography modal stays in viewport and scrolls internally
By @Psychotoxical, thanks to zunoz for the report on the Psysonic Discord, PR #734
position: fixedon the overlay — opening a long bio scrolled the whole page instead of staying pinned, and the modal itself stretched past the visible area. It now portals todocument.bodyand scrolls internally, with the title + close button pinned.Playback — M4A / MP4 streaming (moov-at-end) and seekbar during buffer
By @cucadmuh, PR #737
Artist info — image-mismatch fix extended; square Queue Info hero; ArtistDetail glow removed
By @Psychotoxical, PR #739
useNowPlayingFetchers/useArtistDetailDatais now safe by construction. ArtistDetail's inline bio block is now the sharedArtistCardso there is a single rendering path.object-fit: cover, so portrait photos always lost top and bottom equally — perceived as cropped even on roughly square sources. Now 1:1, symmetric crop.boxShadowring around the photo.Share Top Albums — full-resolution preview, Square preview fits the modal
By @Psychotoxical, thanks to zunoz for the report on the Psysonic Discord, PR #740
Home — Mainstage row title matches the sidebar and page label
By @Psychotoxical, thanks to zunoz for the report on the Psysonic Discord, PR #741
/new-releaseswas labelled Recently Added while the sidebar entry and the page itself read New Releases — three different names for the same destination. All three now read New Releases.UI — consistency fixes across badges, action buttons, hero and tracks header
By @Psychotoxical, thanks to zunoz for the report on the Psysonic Discord, PR #745
btn-surfacetreatment so the same affordance reads the same per page and per theme.Favorites — artist link no longer triggers playback, bulk selection no longer shifts the rows
By @Psychotoxical, thanks to zunoz for the report on the Psysonic Discord, PR #746
Equalizer — frequency-response curve no longer disappears on re-expand
By @Psychotoxical, thanks to zunoz for the report on the Psysonic Discord, PR #747
ResizeObserverdoesn't reliably fire for thedisplay: none → blocktransition the surrounding<details>triggers. Atogglelistener now redraws explicitly on open.Library — empty-state on Mainstage, Albums, New Releases and Random Albums
By @Psychotoxical, thanks to zunoz for the report on the Psysonic Discord, PR #750
Player — persisted queue capped to ±250-track window (QuotaExceededError fix)
By @artplan1, PR #756
localStorageon every persistedset, triggering aQuotaExceededErrorstorm that killed playback and stalled the main thread. Controlled test on a 10 509-track playlist: 9 quota errors before, 0 after.partializenow persists only a ±250-track window around the current position (≤ 501 tracks), remappingqueueIndexinto the slice. The authoritative full queue is recovered from the server viagetPlayQueueon startup — no queue data is lost.M4A playback — probe failures and distorted audio on moov-at-end files
By @cucadmuh, PR #757
Audio — seamless playback resume on output device switch
By @cucadmuh, PR #765
Virtualization — Artists, Composers and Tracks lists no longer drop rows on scroll
By @Psychotoxical, PR #766
useVirtualizerScrollMarginhook used by every virtual-list call-site (including the existingVirtualCardGridfix from fix(grid): apply scrollMargin so VirtualCardGrid renders below tall content #764).Album cards — per-artist click on multi-artist albums
By @Psychotoxical, PR #767
artistId. On an artist-detail page that id is the page's own artist, so the click resolved to the current URL and the router silently no-op'd — the cursor said clickable, nothing happened.OpenArtistRefInlinecomponent the album-detail header uses: each artist becomes its own ·-separated link. Behaviour on servers that don't expose the structured list is unchanged.albumArtists, but the spec (and Navidrome) returns it asartists, so the structured branch never fired and the song-level fallback was carrying the album-detail header on its own.Multi-server — Lucky Mix and Now Playing no longer revert the browsed server
By @cucadmuh, PR #768
This discussion was created from the release Psysonic v1.46.0.
All reactions