mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-21 14:55:43 +00:00
* fix(playlist): batch playlist writes past the GET URL limit (#1227) Adding tracks failed past ~341 songs because the write path re-sent the entire song list as createPlaylist.view?songId=<all> query params on a GET, blowing past the server's ~8 KiB URL limit. Writes now append incrementally via updatePlaylist.view?songIdToAdd=<batch> (and songIndexToRemove for clears/removals) in 150-id batches, so there is no practical size cap. A per-server in-memory membership cache removes the full getPlaylist refetch on every dedup, fixing the "slow add on big playlists" report. Layering detangle (keeps the new cache from adding dep-cruiser cycles): - lib/api/subsonicPlaylists.ts is pure of the store again; cache invalidation on write failure moved to the feature callers' catch blocks. - membership cache extracted to the core layer (src/store/playlistMembershipStore.ts) so offline/orbit/contextMenu/playlist read it directly instead of routing through the @/features/playlist barrel. - severed the offline -> playlist-barrel edge (pinnedOfflineSync name fallback through the live playlist list was dead: nameless callers are all gated by isSourcePinnedOffline, where offline meta already carries the name). - confirmAddAllDuplicates moved into the playlist feature; contextMenu submenus import the add/merge helpers via the playlist barrel, not deep paths. dep-cruiser baseline regenerated: 742 -> 714 (net -28, all no-circular). The churn in the baseline is path-shift of the frozen playerStore SCC (cover/ playback/orbit), not new coupling; the new playlist modules have zero violations. * docs(changelog): record #1235 playlist URL-limit fix (changelog + credits) * fix(playlist): seed membership cache from full list, not library-scoped view (#1235 review) F1: runPlaylistLoad seeded the dedup membership cache from the library-scope-filtered songs, so out-of-scope members looked "new" and addTracksToPlaylistWithDedup/collectMergeSongIds could re-add them as duplicates. Cache now holds the full unfiltered server list while the UI still shows the filtered view; add a regression test. Also documents the two accepted trade-offs flagged in review: - F2: >batch updatePlaylist clears then appends non-atomically (URL-limit workaround); a mid-step failure truncates server state, cache invalidation lets the client re-read truth. - F3: dedup read-modify-append isn't atomic across the await; rare missed dedup on concurrent adds, self-heals on next load.
This commit is contained in:
@@ -64,6 +64,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
* Desktop builds no longer get stuck showing "offline" when WebKitGTK leaves `navigator.onLine` stuck at `false` while the server is actually reachable — the app now confirms with a real server probe instead of trusting that hint, so browse and playback keep working. Web builds are unchanged.
|
||||
* Pending favorite/rating sync now flushes when the server actually becomes reachable again, rather than relying on a browser `online` event that may never fire on desktop.
|
||||
|
||||
### Playlists — add more than ~341 tracks; faster large-playlist edits
|
||||
|
||||
**By [@cucadmuh](https://github.com/cucadmuh), PR [#1235](https://github.com/Psychotoxical/psysonic/pull/1235)**
|
||||
|
||||
* Adding tracks to a playlist no longer fails past ~341 songs — writes are sent to the server in batches instead of one oversized request, so playlists of any size build correctly.
|
||||
* Adding and merging into large playlists is faster: playlist membership is cached in memory for de-duplication instead of re-fetching the whole playlist on every add.
|
||||
|
||||
|
||||
## [1.49.0] - 2026-06-29
|
||||
|
||||
|
||||
Reference in New Issue
Block a user