* Enhance CachedImage and ArtistDetail components with improved image caching and priority handling
- Refactor CachedImage to utilize a priority system for image loading based on viewport visibility, improving performance during scrolling.
- Update useCachedUrl to accept an optional getPriority function for better cache management.
- Optimize ArtistDetail and Artists components by using useMemo for cover art URLs, reducing redundant calculations and improving rendering efficiency.
- Adjust image loading logic in CachedImage to ensure smoother transitions and avoid unnecessary fetch requests.
* perf(ui): unblock IDB cover art, stabilize mainstage rails and virtual lists
Let IndexedDB reads bypass the network concurrency slot so cached thumbnails
paint without queueing behind remote fetches; debounce disk eviction during
heavy scrolling.
Fix mainstage horizontal rails: dedupe album/song ids for React keys, widen
artwork budget overscan, avoid resetting the budget on list append, and raise
Home initial artwork budgets. CachedImage treats already-decoded images as
loaded; rail cards load cover images eagerly.
Refresh dynamic color extraction and extend virtual scrolling / scroll roots on
Albums, Artists, Playlists, and related surfaces.
Remove local agent-only commit instructions from the repository tree.
* perf(virtual): viewport-based overscan for main scroll lists
Drive TanStack Virtual overscan from measured scroll height so each list
renders about one screen of extra rows above and below the viewport for
snappier scrolling on Albums, Artists (list mode), and Tracks virtual song list.
Introduce useResizeClientHeight helpers (ID + ref) for ResizeObserver-based
clientHeight tracking.
* docs(changelog): note PR #468 UI cover cache, rails, and virtual lists
Add a coarse summary under 1.46.0 Changed for cover-art pipeline,
mainstage rails, viewport-based overscan, and library/chrome polish.
Supersedes PR #203's out-of-tree upstream-src layout now that the Nix
build lives in the canonical repo. The flake treats `self` as the
source of truth — nothing in flake.nix or psysonic.nix needs a manual
version bump per release.
flake.nix
- `inputs.upstream-src` dropped; `src = self` throughout
- Dev shell retains the full WebKitGTK / GStreamer / AppIndicator
closure needed for tauri:dev on NixOS (Linux x86_64 + aarch64)
nix/psysonic.nix
- Version read from package.json (upstreamMeta.version removed)
- `srcClean` filter excludes node_modules / dist / target / .git /
result / .flatpak-builder
- `cargoDeps = rustPlatform.importCargoLock` with empty
`outputHashes` — sufficient for our local `[patch.crates-io]`
path overrides (cpal-0.15.3, symphonia-format-isomp4)
- Wraps the installed binary with LD_LIBRARY_PATH + GST_PLUGIN_PATH
+ GIO_EXTRA_MODULES + GDK_BACKEND=x11 + WebKit disable flags
nix/upstream-sources.json
- Reduced to `{ npmDepsHash }`. Placeholder for the initial commit;
the verify-nix job rewrites it on every release from the actual
`prefetch-npm-deps` output.
.github/workflows/release.yml
- New `verify-nix` job gated on `create-release` (same as the
Tauri builds). Checks out `main`, installs Nix, recomputes
`npmDepsHash`, refreshes `flake.lock`, runs
`nix build .#psysonic --no-link` as the sanity check, then
commits lock + hash updates back to `main` when they changed.
- The old standalone `upstream-release-nix.yml` is intentionally
not ported; its scheduled re-poll of the upstream release is
redundant now that the source lives here.
Tarball publishing and Cachix upload remain explicitly out of scope —
those ship in a follow-up workflow tied to the cache setup.
Add per-server toggle for AudioMuse-style discovery: Instant Mix via
getSimilarSongs, server similar artists instead of Last.fm on artist pages,
and higher similar-artist count in Now Playing when enabled.
When browsing a single music folder, filter similar/top song results by
album ids from that scope (Navidrome does not apply musicFolderId to those
endpoints). Request larger similar batches under a narrow scope.
Keep radio-from-track as two blocks (shuffled top songs, then shuffled
similar-by-artist) so it differs from Instant Mix. Show Alpha badge beside
the setting. Add research/ to .gitignore.