Commit graph

  • 7e3738f7e3
    Merge pull request #869 from Nezreka/dev 2.7.2 BoulderBadgeDad 2026-06-13 15:25:21 -0700
  • 177a4d8d05 #868: disambiguate same-name artists by owned-catalog overlap during enrichment BoulderBadgeDad 2026-06-13 14:36:30 -0700
  • 030d9bf9ff Quality Upgrade: best-in-class matching (direct track-ID tier, dedup-skip, duration guard) BoulderBadgeDad 2026-06-13 13:34:48 -0700
  • 4cc2401332 docs: add PLAN.md for global quality system feature nick2000713 2026-06-13 22:24:17 +0200
  • 2c91af0062 feat: global AudioQuality model with post-download quarantine + retry nick2000713 2026-06-13 22:22:08 +0200
  • 777781db6a Quality Upgrade: tiered structured matching (ISRC -> album->track -> artist+title) BoulderBadgeDad 2026-06-13 13:00:16 -0700
  • 3ea5b5181f Quality Upgrade: ISRC-first exact matching using the IDs enrichment already embedded BoulderBadgeDad 2026-06-13 12:43:46 -0700
  • b393866782 Remove old auto-acting Quality Scanner tool (replaced by Quality Upgrade Finder job) BoulderBadgeDad 2026-06-13 12:14:15 -0700
  • 69dd4e1792 Quality Upgrade Finder: new findings-based repair job (replaces auto-acting Quality Scanner) BoulderBadgeDad 2026-06-13 11:51:43 -0700
  • 78f47f04d7 Merge branch 'dev' of https://github.com/Nezreka/SoulSync into dev BoulderBadgeDad 2026-06-13 11:16:06 -0700
  • ce92828290 #867 UX: open Tidal discovery modal in 'discovering' phase so the empty/loading modal isn't interactable BoulderBadgeDad 2026-06-13 11:03:40 -0700
  • ecc07c6811 #867 UX (real fix): render Tidal discovery modal BEFORE the blocking discovery-start POST BoulderBadgeDad 2026-06-13 10:58:29 -0700
  • 77829622a7 #867 UX: open Tidal discovery modal instantly instead of blocking ~10s on a track pre-fetch BoulderBadgeDad 2026-06-13 10:41:42 -0700
  • 846a9c75a0 #867: Tidal playlist discovery shows all tracks (was capped to ~21) BoulderBadgeDad 2026-06-13 10:39:30 -0700
  • c7ca657d56 Release 2.7.2: bump version + What's New / version modal + docker-publish default tag BoulderBadgeDad 2026-06-13 10:16:35 -0700
  • 119c6e3196 Spotify (no-auth): report connected + 'Spotify (no-auth)' test result instead of a Deezer fallback BoulderBadgeDad 2026-06-13 10:16:23 -0700
  • 992fe7567d
    Merge pull request #860 from nick2000713/fix/colon-title-normalization BoulderBadgeDad 2026-06-13 10:06:49 -0700
  • 41f73f0c38 HiFi: auto-push genuinely-new default instances to existing installs once (so a newly-added working instance reaches everyone, not just Restore-Defaults clickers; removed defaults stay removed) BoulderBadgeDad 2026-06-13 09:31:15 -0700
  • fd7fd32dfa HiFi: add us-west.monochrome.tf to default instances (community-confirmed working, Sokhi) BoulderBadgeDad 2026-06-13 09:19:57 -0700
  • fb260baa48 HiFi instances: 'Restore Defaults' button (re-adds removed defaults, keeps customs) + bigger tap targets for the ✔/✖ controls (Sokhi) BoulderBadgeDad 2026-06-13 09:16:39 -0700
  • 6e7fd3ff5c M3U export: resolve paths via one bulk read instead of a per-artist search loop (fixes 'Export M3U hangs forever' under active enrichment/scan DB writes) BoulderBadgeDad 2026-06-13 08:55:46 -0700
  • 608efb1d85 Server playlists: M3U export now downloads the .m3u to the browser too (was only saving server-side) — matches the other Export-as-M3U buttons BoulderBadgeDad 2026-06-13 08:35:02 -0700
  • 5a16d8ad53 Server playlists: 'Export M3U' button in the compare/editor toolbar — exports the server playlist's tracks via the shared M3U writer (Music Assistant etc.) BoulderBadgeDad 2026-06-13 08:20:18 -0700
  • 651b904e92 Watchlist: per-artist 'auto-download' toggle (follow-only) — off = discover/surface releases but skip the wishlist add; default on BoulderBadgeDad 2026-06-13 08:07:20 -0700
  • 2428df1144 #857: custom in-container completed-downloads path for Torrent/Usenet sources (settings + UI; resolver already consumed the keys) BoulderBadgeDad 2026-06-13 07:15:02 -0700
  • 15067b63ca Mirrored playlists: rename (✏️) button matches sibling buttons' hover-reveal styling BoulderBadgeDad 2026-06-13 07:01:18 -0700
  • c62074d54a #865: resolve pasted SoundCloud links (incl. unlisted/private share URLs) via direct yt-dlp resolve; manual-search forces the SoundCloud source BoulderBadgeDad 2026-06-13 00:41:47 -0700
  • ba5d62946a Mirrored playlists: custom name alias (overrides display + sync name, survives upstream refresh) — card rename button like the source-ref editor BoulderBadgeDad 2026-06-13 00:23:56 -0700
  • 6366f72b7e #863: YT Artist column falls back to the matched artist when YouTube gave none (both render paths) — no more 'Unknown Artist' on matched rows BoulderBadgeDad 2026-06-13 00:06:41 -0700
  • 0577dc92e5 #863: add diagnostic logging to YouTube artist-recovery so we can see per-track what it returns BoulderBadgeDad 2026-06-13 00:03:35 -0700
  • c72e83bc2f #863: move YouTube artist recovery out of the (synchronous) parse into the async discovery worker — parse is fast again, no 120s timeout risk BoulderBadgeDad 2026-06-12 23:46:29 -0700
  • 0093af89d2 #863: parallelize YouTube artist-recovery (5-worker pool) so the whole playlist resolves within the budget, not just the first ~dozen BoulderBadgeDad 2026-06-12 23:36:31 -0700
  • 0a6325a87b #863: recover YouTube track artist via per-video uploader/channel when flat extraction returns title-only (budget-bounded) BoulderBadgeDad 2026-06-12 21:38:34 -0700
  • 4f24c2af6d #863: derive YouTube track artist from music fields / -Topic channel / 'Artist - Title' instead of the playlist owner BoulderBadgeDad 2026-06-12 20:14:55 -0700
  • cb2d920a9e #862: Library Reorganize falls back to tag-mode when an album has no source ID (media-server libs now actually reorganize) BoulderBadgeDad 2026-06-12 20:05:50 -0700
  • f5787764d4 #859: DB-update stall watchdog + UI self-heal (no more wedged 'Starting...' / frozen bar) BoulderBadgeDad 2026-06-12 19:38:30 -0700
  • 0384de7c8d Settings: hide Playlist Path Template field (no longer drives symlink-view naming; kept in DOM for save/load) BoulderBadgeDad 2026-06-12 19:03:04 -0700
  • 08b73f0e94 Playlists: remove dead _playlist_folder_mode routing branches (retired flag, now unreachable) BoulderBadgeDad 2026-06-12 18:52:57 -0700
  • 577bba30aa Playlists: all-owned trigger makes batch dict authoritative + logs when nothing rebuilt BoulderBadgeDad 2026-06-12 17:34:06 -0700
  • 47889387ad Playlists: resolve synthetic mirrored batch refs (youtube_mirrored_<pk>/auto_mirror_<pk>) to PK BoulderBadgeDad 2026-06-12 17:27:35 -0700
  • c6e077fefe Playlists: batch toggle force-rebuilds its own folder (row flag = provenance only) + resolve diagnostics BoulderBadgeDad 2026-06-12 17:19:45 -0700
  • 4d7267e906 Playlists: reconcile rebuilds touched playlists from the LIBRARY, not task fields BoulderBadgeDad 2026-06-12 17:08:27 -0700
  • 7fb1b115f0 Playlists: also run the reconcile on the V2 batch-completion path BoulderBadgeDad 2026-06-12 16:49:52 -0700
  • 6e86bac6eb M3U: skip the auto-save no-op when export is disabled (fixes ~30s analysis jam) BoulderBadgeDad 2026-06-12 16:35:11 -0700
  • d160c486ec Playlists: mirror-update trigger prunes removed tracks (the other half) BoulderBadgeDad 2026-06-12 15:49:13 -0700
  • 997e76b6b4 Playlists: one path-independent reconcile after every batch (closes wishlist gap) BoulderBadgeDad 2026-06-12 15:30:47 -0700
  • 87621b7191 Playlists: Settings UI (path + symlink/copy + rebuild button) + rebuild endpoint BoulderBadgeDad 2026-06-12 14:04:34 -0700
  • aa5d747327 Playlists: wire materialize triggers + retire per-track routing flag BoulderBadgeDad 2026-06-12 13:37:59 -0700
  • bef73d855d Playlists: stitch a batch's owned+downloaded paths into the materializer BoulderBadgeDad 2026-06-12 13:32:53 -0700
  • 3a6cb8cda5 Playlists: config (separate root + symlink/copy) + pure materializer seam BoulderBadgeDad 2026-06-12 13:30:48 -0700
  • 37431ea82b Downloads: additively surface each track's real file path (analysis + completed) BoulderBadgeDad 2026-06-12 13:28:26 -0700
  • 550fca0fe5 webui: sync organize-by-playlist toggles + stop dashboard poller 401-spam while locked BoulderBadgeDad 2026-06-12 13:28:24 -0700
  • 94a0070fa8 Orphan detector: hard-bail on a mass-orphan flood instead of warn-only BoulderBadgeDad 2026-06-12 08:15:23 -0700
  • 749bc274b3 fix: treat colon as separator in normalize_string so T:T matches T_T nick2000713 2026-06-12 12:54:03 +0200
  • cbab4234ef Export: combine watchlist + library into one button with a scope selector BoulderBadgeDad 2026-06-11 23:10:54 -0700
  • a789fb71c0 Library export: export the whole library roster too (corruption's request) BoulderBadgeDad 2026-06-11 22:59:21 -0700
  • f8652c106b Watchlist: export the roster to JSON / CSV / text (corruption's request) BoulderBadgeDad 2026-06-11 22:48:58 -0700
  • 4d2772765c Add Aria2 to the torrent client list (Shdjfgatdif's request) BoulderBadgeDad 2026-06-11 22:29:40 -0700
  • 8118a2c6bd Add Empty Folder Cleaner library-maintenance job (corruption's request) BoulderBadgeDad 2026-06-11 22:11:26 -0700
  • 4dd09ff48a Navidrome: self-heal the connection instead of latching disconnected (jimmydotcom) BoulderBadgeDad 2026-06-11 21:34:48 -0700
  • d9cda0c31c Manage Profiles: make the login-password state visible (clarity) BoulderBadgeDad 2026-06-11 21:10:02 -0700
  • 5b52d579c5 Login mode: enforce "every profile has a password" at every write-point (no gaps) BoulderBadgeDad 2026-06-11 19:48:50 -0700
  • e046a2add4 Login mode: let the admin set a member's login password (Manage Profiles) BoulderBadgeDad 2026-06-11 19:24:31 -0700
  • 29c8f11403 #437: add ReplayGain Filler library-maintenance job BoulderBadgeDad 2026-06-11 18:41:12 -0700
  • 68acf89b83 #852: hide the whole app behind the lock screen — bypass reveals a blank page BoulderBadgeDad 2026-06-11 18:08:02 -0700
  • b5b9d6e5f4 #852 tests: cover the login-mode WS gate (the reported bypass was the login modal) BoulderBadgeDad 2026-06-11 17:38:24 -0700
  • 31ebe96f76 dev: add --lan flag to dev.py to expose the dev server on the network BoulderBadgeDad 2026-06-11 17:29:12 -0700
  • a8206012ae dev: make the dev-server bind host opt-in via SOULSYNC_WEB_BIND_HOST BoulderBadgeDad 2026-06-11 17:24:47 -0700
  • 123eb6139f Artist detail: "DB Record" inspector — everything the DB knows about an artist BoulderBadgeDad 2026-06-11 16:51:50 -0700
  • e5f92032b5
    Merge pull request #854 from Nezreka/dev 2.7.1 BoulderBadgeDad 2026-06-11 16:16:01 -0700
  • ee4d514d60 CI: silence S110 on three intentional best-effort swallows (unblocks dev build) BoulderBadgeDad 2026-06-11 16:00:07 -0700
  • 26b27eb441 What's New + version modal: 2.7.1 content BoulderBadgeDad 2026-06-11 15:50:20 -0700
  • 572a7c05f0 Release: bump version to 2.7.1 + default the docker publish tag to 2.7.1 BoulderBadgeDad 2026-06-11 15:45:39 -0700
  • 826ac0b366 #853 follow-up: don't cache a partial Deezer discography on mid-pagination error BoulderBadgeDad 2026-06-11 15:35:36 -0700
  • 814af2cdfb
    Merge pull request #853 from ramonskie/artist-discography-cache BoulderBadgeDad 2026-06-11 15:31:04 -0700
  • 53c264ab50 Torrents: fix stall handling on "downloading metadata" + stop orphaning in qbit BoulderBadgeDad 2026-06-11 14:14:49 -0700
  • 3686ae393a
    Merge d950da8573 into 46eccbb237 Francesco Durighetto 2026-06-11 23:08:13 +0200
  • 76d3e25fd4 Cache artist album lists across metadata sources ramonskie 2026-06-11 22:33:04 +0200
  • 46eccbb237 #852: gate the WebSocket handshake — close the launch-PIN/login bypass BoulderBadgeDad 2026-06-11 13:27:03 -0700
  • 87e5e1fa23 #702: make mirrored-playlist cancel/reset/delete idempotent (un-wedge LB weekly sync) BoulderBadgeDad 2026-06-11 12:55:55 -0700
  • 9bf7881f7a #704: add "Relocate" fix for AcoustID mismatches — retag + restage for re-import BoulderBadgeDad 2026-06-11 12:01:05 -0700
  • 525222b04c #840: offer '&' as an artist tag separator (MusicBrainz/Picard style) BoulderBadgeDad 2026-06-11 11:23:21 -0700
  • 174adf2dc9 #845 tests: cover the verification_status migration backfill BoulderBadgeDad 2026-06-11 11:17:09 -0700
  • a207bd943b #845 tests: lift history-path resolver to core/ + seam-test the delete-safety BoulderBadgeDad 2026-06-11 11:07:25 -0700
  • 89f843d223 #851: normalize '/' ':' '_' to spaces so slash-titles match underscore sources BoulderBadgeDad 2026-06-11 10:46:36 -0700
  • 17440329c1 #845 follow-up: admin-gate the mutating verification-review endpoints BoulderBadgeDad 2026-06-11 10:43:40 -0700
  • eb35ba86fb
    Merge pull request #845 from nick2000713/fix/import-folder-artist-override-optin BoulderBadgeDad 2026-06-11 10:39:59 -0700
  • ce6ce4d8d6 Search: auto-select Spotify when "Spotify (no auth)" is the active source BoulderBadgeDad 2026-06-11 09:39:40 -0700
  • 8bf03a7d5e Merge branch 'dev' of https://github.com/Nezreka/SoulSync into dev BoulderBadgeDad 2026-06-11 09:22:52 -0700
  • bec31db738
    Merge pull request #850 from RollingBase/fix/sw-image-cache-interception-failure BoulderBadgeDad 2026-06-11 09:22:36 -0700
  • bf5affd03c resolve merge conflict in style.css nick2000713 2026-06-11 18:21:04 +0200
  • 3284af428d Discogs (#848 follow-up): tag collection album IDs for consistency BoulderBadgeDad 2026-06-11 08:33:26 -0700
  • f557d3b203
    Merge pull request #848 from RollingBase/fix/discogs-master-release-id-collision BoulderBadgeDad 2026-06-11 08:28:47 -0700
  • 17886477cb remove docs from PR nick2000713 2026-06-11 17:08:20 +0200
  • 01ed54f4f2 SW: stop cover-art burst from hard-failing on first load rollingbase 2026-06-11 12:03:41 +0200
  • d6d5ef22c9 Merge branch 'main' into fix/discogs-master-release-id-collision rollingbase 2026-06-11 11:12:34 +0200
  • a0b6fddbc4
    Merge pull request #846 from Nezreka/dev 2.7.0 BoulderBadgeDad 2026-06-10 23:17:07 -0700
  • 8968d87cc4 What's New + version modal: 2.7.0-only, summarize the rest BoulderBadgeDad 2026-06-10 23:05:01 -0700
  • 654a5b4536 Release: bump version to 2.7.0 + default the docker publish tag to 2.7.0 BoulderBadgeDad 2026-06-10 22:57:19 -0700
  • fece771dd0 Security UI: show saved login password / recovery question state BoulderBadgeDad 2026-06-10 22:46:15 -0700