github Nezreka/SoulSync 3.3.2
Version 3.3.2

3 hours ago

soulsync 3.3.2: devmain

the release where the video side stops failing silently, youtube downloads recover instead of giving up, the downloads page gets rebuilt, and web_server.py loses fourteen thousand lines.

the video side now tells you why

the wishlist used to search hundreds of times and grab nothing, and the only thing it would say was "searching". every part of that is now on the record:

  • per-source search receipts. every wishlist run records what each source did: whether it ran, how many results came back, how many were accepted, and the reason each rejection lost. open a stuck row and the evidence unfolds underneath it.
  • waiting is not stuck. a row waiting on an episode that has not been posted yet reads differently from a row that keeps getting refused. before, both just said "searching" forever.
  • which indexer earned the result, not just which transport. "torrent found 15" is useless when you run nine indexers.
  • a source that finds everything and grabs nothing now warns instead of looking healthy. 20+ results and 0 accepted is a broken filter, not a quiet night.
  • the drive a download is BUILT on is checked, not just where it lands. 18 real youtube failures had thirteen terabytes free at the destination and 500MB on the volume the file was actually being assembled on.
  • release rejections are recorded per release. "none matched" became "this one was the wrong season, that one was 4K and your profile caps at 1080p".

the wishlist stops hammering your indexers

the drain re-searched everything eligible on every tick with no memory of having tried. on a real install that was a 1999 film searched 959 times, and 142 of 172 wished episodes past twenty attempts, each one a ~20 second blocking soulseek search, every hour. dead rows now back off. un-following a show also stops the hunting for episodes that were wished before you muted it, completed youtube rows get swept, and the video RSS sync moved to arr-speed cadence.

EXT.to also got wired in properly: it feeds the wishlist matcher and the RSS board, and the torrent lane no longer gives up the moment prowlarr says "not configured" while EXT.to sits there able to answer.

acquisition control, arr style

  • per title quality profiles, preferred sources, and release group allow/block lists. narrow one title without touching the global config.
  • manual alternative titles. tmdb's alias list is good but not complete: it carries "Big Brother US" and nothing at all for "Password (2022)", so that show could never match a release. you can now type the name in, which is exactly what radarr and sonarr do. we built the automatic version first and measured it against the real library: it helped one show and put 85 of 356 qualified titles at risk of matching the wrong thing, so it got reverted.
  • season packs are tried before episode fanout, which is both faster and better indexer manners.
  • refused sources go on cooldown instead of being hammered every cycle.
  • season monitoring and stale failure resets from the detail page, plus manual search context, per-source result counts, and a "try anyway" on a rejected grab.

the tv calendar knows what it is looking at

every calendar episode reads as one of eight states now: owned, downloading, queued, wanted, failed, ignored, unaired, missing. reality beats intent, so a file on disk is owned whatever the wishlist believes, and a live season pack covers every episode inside it. "missing" is the only state that always wants a human, and you can filter to just those and act on them in place.

youtube downloads that recover

the failure classifier went from 4 kinds to 9. the important part: a full disk, a not-yet-available video, and a throttle no longer count against a video permanently. a full C: drive used to blacklist everything queued while it was full, and it stayed blacklisted after you cleared space. a working download now clears a resolved fault, there is an alternate transport fallback, and orphaned downloads get recovered.

also parses #HttpOnly_ prefixed rows in cookies.txt, which most browser extensions export and we were dropping on the floor.

the bot-detection gate (#1126) deliberately still gives up rather than retrying: the reporter re-exported cookies twice and it changed nothing, so retrying it would just burn quota.

the downloads page, rebuilt

batch groups instead of a wall of rows, the side panel is gone, and the layout uses the width it has. plus Download Next buttons for queued downloads (#1198, @wishx) and auto-download for missing queue tracks.

an intentional lossy copy is not a downgrade

nick2000713's #1191 started this and it grew into a proper pass. converting a flac to a lossy companion on purpose used to read as a quality regression, so the upgrade finder would try to "fix" it forever. acquisition quality and retained output are now judged separately, ALAC companions inside M4A are detected, catalogued lossy companions are skipped, explicit ALAC sources are probed, retention survives a media scan, unassigned profiles resolve at apply time, and the two copies of the upgrade verdict became one so they cannot drift apart.

library safety

three ways to lose files, closed:

  • the duplicate cleaner could delete the only copy of a track (#1210)
  • a scan could delete the album it had just written (#1216, @RiceTeaPrince)
  • sparing an album did not spare the artist it hung off (#1216)

system health where you can see it

health moved out of the page banners and into the notification area, between history and notifications, as symbols. click it and the detail opens in a modal. the healthy half stays collapsed.

reported fixes

  • #1196 failed wishlist tracks were not re-queued after a source recovered (@Zombiehamser)
  • #1197 automations reported 100% complete while still running, and 1% rendered as 100% on rows (@wishx)
  • #1200 artist descriptions truncated at four lines with no way to read on (@wishx)
  • #1201 similar artists showed no images, now served first-party (@wishx)
  • #1192 import quality check claimed "library worker unavailable" (@wishx)
  • #1194 chat was unavailable more than it was available (@wishx)
  • #1207 Quality Upgrade Finder kept running after being switched off: the per-job toggle was only read on the scheduler path, and automations force-queue straight past it (@wishx)
  • #1209 "Multiple Sources Found" options were present but never drawn with animations off (@wishx)
  • #1211 four maintenance jobs at once gave four cards all reading "Library maintenance"; the card read fields that do not exist and fell through to the generic label every time (@wishx)
  • #1219 server playlists showed the same playlist four times: they were four different tidal playlists sharing a name, and the disambiguation modal claimed "found on 4 sources" (@wishx)
  • #1215 "Enhance Quality" never enhanced: a library scanned on windows while soulsync runs on linux produced a destination with the whole recorded path pasted on as the filename, so every upgrade died on the move (@compengevfan)
  • #1213 jellyfin/plex credentials disappeared before save: the form saves on change then re-reads the EFFECTIVE connection, and a half-filled override fell through to the inherited music config (@millionjt)
  • #1202 a track that imports without a match now says so out loud instead of landing quietly (@Noodlez1232)
  • #1208 delete a whole group of quarantine candidates at once (@wishx)
  • #1214 play each copy of a duplicate to compare them before choosing (@wishx)
  • #1203 the "View on Discogs" link 404'd from an internal ID tag leaking into it (reported and fixed by @RiceTeaPrince, #1204)
  • #1205 the discogs classifier mislabelled compilations and concert videos as "Album" (reported and fixed by @RiceTeaPrince, #1206)
  • a mirrored playlist could finish syncing and still show "Playlist (0 tracks)" with a bar frozen at "Starting discovery…" forever (@TheHomeGuy)

contributor prs

under the hood

web_server.py went from 36,370 lines to 22,300 and from 555 routes to 224: playlists, wishlist, artist detail, discover, import/reassign, database maintenance, radio, server activity, beatport and hydrabase p2p all moved into real modules. the js to typescript migration started, nine classic scripts ported so far and one dead file deleted. plex and jellyfin art is cached like tmdb art, and grids stopped downloading full size posters into 150px cards.

Don't miss a new SoulSync release

NewReleases is sending notifications on new releases.