github Nezreka/SoulSync 3.2.1
Version 3.2.1

4 hours ago

soulsync 3.2.1: devmain

60 commits since 3.2.0. the stats page went from ten totals to a page worth visiting,
the video wishlist finally grabs what it finds, movie night became a room you can
actually watch in, and artwork got a cache that's wired to something.

the stats page

the page had good data and said nothing with it. ten totals, no comparisons, and library
ops facts sitting in the same visual language as your personal listening. five passes:

  • every tile says what it changed against. "1,247 plays" became "1,247 plays, up 31%
    vs last month". no previous data hides the delta rather than printing an arrow off a
    zero
  • the page split in two. listening facts and library ops facts get read by different
    people at different frequencies. they're tabs now, in the url so they're linkable, and
    the range picker hides on the library tab because disk usage isn't range scoped
  • when you listen. an hour by weekday heatmap, plus streaks and your biggest
    listening day. streaks count days, tolerate today having no plays yet, and refuse to
    call a run from last month a current streak
  • what you own against what you actually play. own 40% metal, play 12% of it. nobody
    else can show this: spotify has no library, plex has no acquisition history. plus a
    never-played album shelf, because an album you can act on beats a dead count
  • your year in listening. a fixed twelve month period rather than another filter,
    told as a sequence of single idea screens: your numbers, a month strip, your number
    one, a top five countdown, the albums you lived in, the track on repeat, who you
    discovered, when you listened. numbers count up, lists stagger in, albums play when
    you click them, and it ends in a share card studio with four layouts, three sizes and
    four themes

rolling twelve months rather than jan to dec, because a self hosted app gets opened in
august and a fixed year would hand a young install seven empty slots. discoveries
compare an artist's first play against all of history, not against the window, or every
returning artist would read as a discovery.

video

  • the wishlist searched 198 times and never grabbed anything. five causes at once,
    all found in a live install. it grabs now
  • season packs import as episodes. a pack used to import as one item. there's a
    file to episode mapper now, the pack is the batch rather than a sibling of its own
    episodes, and "grab season" asks for a pack first and asks every source. that button
    existed in two places and only one of them had been fixed
  • a stuck wishlist row says why it's stuck instead of sitting there
  • a stall clock a restart can't reset, and a file that already downloaded is no
    longer re-searched
  • duplicate copies covers episodes too, and says which drive each copy is on

movie night & watch together

  • movie night is a room you actually enter. press play and it plays
  • the stream goes through the media server, not through a mount we may not have
  • you get your own poster, and a failure says which failure it was rather than
    failing blank
  • the version we judged is the version that streams, not whichever part plex lists
    first
  • a film with no sound says so, there's a volume control, and the card stops colliding
    with itself

artwork

the image cache is bounded, has thumbnails, and is shared with the video side. it also
now actually gets used: the cache existed but nothing was wired to it, so the grids kept
pulling full size art. sizes and timeout are configurable.

a cover you pick by hand also survives a library sync now.

fixes

  • #1149 a lossless-only profile still enqueued mp3 torrents (Zombiehamser).
    the torrent path never consulted a quality profile at all, so "flac targets,
    fallback disabled" couldn't veto anything there. worse, format was a guess
    from the release title that fell back to mp3 for anything it couldn't read,
    and it was only a ranking input — on the album path the second sort key after
    seeders, so a well-seeded mp3 rip beat a flac rip with fewer seeders whatever
    you'd set. releases now get vetoed in two stages: on the title before
    anything is picked, then on the real file list parsed out of the .torrent we
    already fetch, before the client is handed anything. a title claiming flac
    over a folder of mp3s gets caught by the second stage. no new setting: your
    existing lossless profile just starts being enforced
  • automations kept running while paused. the master pause was checked once, before
    an automation's configured action delay. a run cleared the gate at 00:30, slept, and
    fired at 01:00 even if you paused at 00:35. both the scheduled and event paths.
    reported twice
  • settings went stale after an update because settings.py lived in the folder
    users bind-mount, so the mount masked the image's copy. it moved
  • tools settings fields were cut off and couldn't be filled in (TheHomeGuy). reported
    as a widescreen issue, but the resolution was incidental: the panel sits inside a tile
    that hides overflow, and a form control refuses to shrink below its intrinsic width no
    matter what width you set. it sat right on the boundary, so it clipped for some people
    and not others
  • #1102 search terms too broad for a consumer router (Sonoid). a soulseek search is a
    broadcast, and every matching peer opens a connection back, so a two word title could
    exhaust a home gateway's nat table. short titles no longer go out as a title only query
  • #1144 a finished maintenance job refreshes recent runs without a manual reload
    (mandos21)
  • #1142 clear findings honours the search box and severity filter instead of clearing
    everything (mandos21)
  • #1143 a stale finding no longer blocks a maintenance action (mandos21). a vanished
    file retires its finding, and findings follow a file through a reorganize
  • a finished bulk fix refused the next one. two signals for one condition, released
    in the wrong order
  • #1126 a youtube block says so rather than reading as "nothing found", and "not out
    yet" stopped counting as a failed download
  • the aug-11 tidal fix had landed in a file that no longer runs
  • refresh on an empty library never reached stale removal (5BILLION r4)
  • matching: a title stated twice reads as one title, a live recording credit isn't a
    restatement, devanagari classifies as non latin, and the latin check requires a real
    letter rather than absence from a list
  • the dashboard sync rows stated the same total twice, once as pills and once as the
    bar. the bar stays

other

  • yt-dlp updates from settings, with an update button on the advanced tab of both
    sides and an honest "restart needed" note
  • watchlist auto-download is a global default an artist can override

contributed

  • genre enrichment repair job (#1125, @mandos21). genre data as a first class repair
    job with its own tools
  • wing it stub ids survive a restart (#1146, @nstrelow), with a follow-up to
    length-prefix the key so two ids can't collide on a boundary
  • dual title romanization (#1145, @nstrelow)

tested

full backend suite green (13,314 passed, 13 skipped), frontend 7,388 across 338 files,
ruff and tsc clean, bundle builds. the stats work carries 32 backend and 93 frontend
tests of its own; the automation pause fix carries 15 against a real database rather
than a mock; the #1149 format veto carries 64, including one that pins it failing OPEN
so an unreadable profile can never become an install where nothing downloads.

Don't miss a new SoulSync release

NewReleases is sending notifications on new releases.