github Nezreka/SoulSync 3.3.1
Version 3.3.1

3 hours ago

soulsync 3.3.1: devmain

discover learned to make playlists like it actually knows you, a pile of reported bugs got root-caused instead of patched, downloads grew a clients hub and a real recycle bin, and the video side got a basic search that talks to EXT.to.

discover: daily mixes, stations, and everything plays

daily mixes are real now. they build from your listening history: your most played artists get clustered by who actually sounds like who (similarity edges plus shared genres), each mix weaves your owned tracks with a few discovery picks, and the lineup reshuffles daily instead of being frozen. verified against a real 10GB install, the clusters come out coherent, synthwave stays with synthwave and the rap mix does not get invaded by kids music.

recommended stations is the row spotify shows you: your top artists as one-click radio cards, with "With X, Y" companions pulled from the similarity data. and every mix modal now leads with a play button that plays the owned tracks instantly, plus a library radio card. the play seam existed the whole time, nothing used it.

release radar and discovery weekly stop silently shrinking. they used to store bare track ids and re-resolve them against a discovery pool that rotates, so tracks quietly fell out of your playlists over the week. full snapshots are stored at curation time now. hidden gems is also ranked by your actual genre taste, which it claimed to be doing and was not, because it read a key the row never carried.

last.fm track radio works again

the whole feature had rotted. the search dropdown was invisible because a css containment optimization was clipping it, the rows were unstyled native buttons, a search error was indistinguishable from no results, one row with blank listener data killed the entire search, cards claimed "50 tracks" no matter what, generating a radio looked like nothing happening for ten seconds, and the nasty one: opening a radio whose tracks were not cached would delete the playlist, because a cache miss triggered a delete-and-refetch against an api that cannot refetch these. all fixed, with a spinner, real counts, real errors, and a guard on the destructive read.

seasonal playlists build from your taste

"summer vibes" used to be assembled by searching for albums literally named beach. every card, an album called beach. the vibe seasons (summer, spring, autumn, valentines) now blend your most played tracks from those months across every year of listening history, tracks from your vibe-tagged albums, and discovery pool picks from seasonal sounding artists, with an optional last.fm tag chain for fresh faces. christmas and halloween keep the keyword search because titles genuinely signal there. curation also backfills thin tiers so a 50 slot playlist stops shipping 30 tracks.

downloads got a clients hub and a recycle bin

the new clients tab puts your external download clients (soulseek, torrent, usenet) in one pane: per-client sub-tabs that admit failure instead of spinning forever, expandable transfer cards, search and filters, bulk actions, add-torrent, and slskd uploads. the soulseek view also no longer 500s.

the deleted quarantine became a real recycle bin. anything soulsync removes (duplicates, quarantined files, replaced tracks) lands in a hidden .deleted folder with a manifest, browsable from a Deleted tab where you can restore files to where they lived or purge for good, with an optional retention window. the folder is dot-prefixed now so navidrome and friends stop indexing your deleted files back into the library.

the duplicate detector stopped missing the obvious ones

reported with a screenshot: the same track as flac and ogg, same folder, and the detector found nothing. the filename matching pass keyed on filename plus extension, so a cross-format pair was structurally invisible no matter what you set the similarity sliders to. it keys on the stem now, with a guard so a lossless file next to its intentional lossy copy (the lossy-copy feature) is never flagged. the findings search also reads the whole duplicate group now, before this it only matched the one track the finding was titled after, so searching for the other copy came back empty.

acoustid and musicbrainz identity hardening

builds on #1185 from @nick2000713: a track name written in another script is not evidence of a wrong download. the follow-up run closes the rest of the ways an identity could be guessed or lost: aliases resolve from the artist mbid instead of a name search, a fetch that never answered is not treated as "no aliases", the owned catalogue can match an artist the name cannot, and an ambiguous acoustid finding lets you pick which recording it really is instead of guessing. the scan and the download verification are one pipeline now, and a scan that cannot confirm no longer takes verification away from a track that had it.

quarantine and verification review

the unverified and quarantine tabs got real review queues with clear actions, live file-writing repair jobs refuse to run when the library is not visible (the failure mode that once swept good tracks into quarantine), and reorganize no longer quarantines a library file over its own fingerprint.

beatport browsing works behind cloudflare

browse by sound and the beatport genre pages route through flaresolverr when a block is detected, falling back to the plain scraper when you do not run one. the genre deep-dive also gets the time a cold build needs instead of dying at a 10 second default timeout, and the genre page is actually visible.

smaller reported fixes

  • downloads narrate "track 3 of 12" for the batch you queued instead of leaking wishlist internals (#1183)
  • the what's new modal is readable now (#1184)
  • vorbis track numbers write as a bare number plus a separate total, so players stop displaying "1/1" (reported on discord)
  • chat uploads are tagged with their channel instead of leaking into general (also discord)
  • five flow bugs from a playlist power-user report, including sync counters that disagreed with the list below them
  • atomic album downloads stop stranding in staging on media-server installs
  • staging tags stop being re-read for every download task, from #1181 by @nstrelow
  • path organization unified across tools, from #1182 by @nick2000713
  • one canonical absolute form for every configured root folder, and reorganize never moves a file while the catalogue update fails silently

video: basic search and fresh releases

a basic search tab that queries your configured providers in-app, now including EXT.to (scraped through flaresolverr, magnet flow and all), with source-appropriate result cards and grab-anything. fresh releases is its own tab with scheduled refresh and cards matched against your library. grabs store as proper torrent downloads. plus a pass on the get modal (a visible acquisition plan), episode scanning for quality upgrades, recycle and seeding workflow polish, and a music video shelf on artist detail.

under the hood

web_server.py continues shedding weight, another eight endpoint clusters moved into api/ modules (login, automations, quarantine, verification, clients, stats, watchlist, repair, beatport). same routes, byte-identical route map, verified per lift.

Don't miss a new SoulSync release

NewReleases is sending notifications on new releases.