github Nezreka/SoulSync 3.3.0
Version 3.3.0

7 hours ago

soulsync 3.3.0: devmain

discover got rebuilt, the watchlist grew up, and last.fm listening history now feeds the stats page. plus a run of reported bugs, most of them the kind that fail quietly.

discover is a discovery surface now, not a wall

the page got reworked around a hero, a priority queue, and grouped recommendation zones rather than one long scroll of everything at once. the discovery data and the actions behind it are unchanged, this is about what you see first and what you can act on.

the empty hero state actually says something now, mobile got real density work instead of the desktop layout squeezed, and the genre explorer and build-playlist flows read as parts of the same page rather than three ideas sharing a route.

last.fm listening history feeds stats

there is a last.fm importer now. it uses the last.fm settings you already have, runs through automation like everything else, reports progress through notifications, and does not need a separate username when auth can work it out for itself.

the interesting part is making it safe for a big backfill. backfill checkpoint state is kept separate from the incremental cursor, an interrupted page resumes instead of restarting, and a duplicate page no longer gets mistaken for "we reached the end", which is how a partial import quietly marks itself complete.

stats got drilldowns to go with it. clicking into When You Listen or Listening Activity opens the actual tracks behind that bar: play actions, artist links, artwork, timestamps and where the play came from. it is backed by real listening-event queries rather than re-deriving from the chart.

the watchlist got a proper pass

the music watchlist experience is upgraded across the board, and the artist dock got a mobile pass so it is usable on a phone rather than a desktop control at phone width.

musicbrainz stopped timing out on slow connections (#1177)

every musicbrainz call had its own hardcoded 10 second read timeout, which is fine on a fast link and not fine on shared egress. they all go through one helper with a 30 second timeout now, and it retries read timeouts, connection errors and 429/503/504 rather than giving up on the first one.

the retry preserves the process-wide one-request-per-second musicbrainz pacing, which is the bit that is easy to get wrong: a naive retry loop would politely wait between calls and then hammer on the retries.

timeouts and retry count are settings now, so a slow deployment can tune it without a code change.

musicmap was being sent junk artist names (#1178)

lookup names go through a clean-up before the url is built, so a tag polluted with commas, semicolons or a "feat" clause sends ONE artist instead of an encoded joined string that matches nothing.

placeholders are skipped before the request happens at all, returning a plain "not suitable" instead of upstream 404s and timeouts in your log. the legacy watchlist scanner path got the same guard, so background similar-artist lookups and the live one now agree about what is worth asking.

cleanup could still make a navidrome path look deleted (#1127)

the last of the delete surfaces that could report success on a file it never actually touched. the expired download cleaner resolves paths with the same transfer-folder context as the other repair jobs now, and keeps the origin and history rows when a navidrome virtual path cannot be mapped to a real file.

manual download origins got the same guard, album delete returns real file-error samples instead of just a count, and repair actions say out loud when only the database row went and the file could not be found. fuzzy matching stays out of destructive paths on purpose: guessing which file you meant is not a thing a delete should do.

large deezer playlists survive a proxy

a big deezer playlist used to depend on one long request staying open while track numbers resolved, which is exactly the request a reverse proxy kills. link and ARL loads start as backend jobs now and hand back a job id immediately, and the sync page polls until the payload is ready. the socket progress frames still narrate the slow track-number phase, so the overlay says what it is doing.

the shared sync JSON reader also turns a proxy or app HTML response into a real error instead of the "Unexpected token" toast, which told you nothing.

artwork loads without the service worker (#1179)

cover art archive and archive.org images go through the same-origin image proxy when the page is not controlled by the service worker, and keep the direct path when it is. applied to artist detail, the discover album shelves and album import art.

also

  • the soulseek gate no longer blocks a hybrid fallback from running
  • sidebar and chat responsiveness polish
  • music sync activity tracking, and sync notifications that no longer go stale

Don't miss a new SoulSync release

NewReleases is sending notifications on new releases.