From 6f451a34e170cdfb060ce1e786e983373171a2df Mon Sep 17 00:00:00 2001 From: BoulderBadgeDad Date: Mon, 29 Jun 2026 08:18:40 -0700 Subject: [PATCH] =?UTF-8?q?playlist=20export:=20hide=20Spotify=20until=20o?= =?UTF-8?q?n-demand=20write-auth;=20release=20notes=20=E2=86=92=20Deezer-n?= =?UTF-8?q?ow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-up to the auth hotfix (633aa82b). The Spotify playlist-write scope was reverted out of the global OAuth scope (it was force-invalidating every user's token on upgrade), so "Sync to Spotify" can't get write access yet — clicking it would dead-end on a misleading "reconnect Spotify". So: - removed the "Sync to Spotify" button from the export modal (Deezer stays); the backend write client + endpoint are left in place, dormant, for when on-demand write-auth lands - modal copy is now Deezer-only ("Match missing tracks (Deezer)", "stored Deezer ID") - release notes (pr_description, helper.js WHATS_NEW + version modal, RELEASE_2.8.1_discord.md) reworded from "Spotify & Deezer" to "Deezer", with a "Spotify export coming in a follow-up" note 64 script-integrity tests green; discord file back under the 2000-char limit (1952); no stale Sync-to-Spotify mentions remain. Deezer export (live-verified) is unaffected. --- RELEASE_2.8.1_discord.md | 12 ++++++------ pr_description.md | 10 +++++----- webui/static/helper.js | 12 ++++++------ webui/static/stats-automations.js | 8 ++------ 4 files changed, 19 insertions(+), 23 deletions(-) diff --git a/RELEASE_2.8.1_discord.md b/RELEASE_2.8.1_discord.md index 76feb510..b0e60f46 100644 --- a/RELEASE_2.8.1_discord.md +++ b/RELEASE_2.8.1_discord.md @@ -1,15 +1,15 @@ **SoulSync 2.8.1** is out 🎉 a feature + reliability release. -🎧 **Export playlists to Spotify & Deezer** — the mirrored-playlist export now has **Sync to Spotify** and **Sync to Deezer** right next to the ListenBrainz / JSPF options. it builds a playlist in your account from the track IDs soulsync already has — the discovery cache first, then your library — so an already-discovered playlist exports **instantly with zero API calls**. re-exporting updates the same playlist instead of duplicating it, and an optional *"match missing tracks"* toggle confidently searches for the stragglers (a wrong-artist or karaoke version is left out, never guessed in). spotify needs a one-time reconnect for write access. (#945) +🎧 **Export playlists to Deezer** — the mirrored-playlist export now has **Sync to Deezer** next to the ListenBrainz / JSPF options. it builds a Deezer playlist in your account from the IDs soulsync already has (the discovery cache first, then your library), so an already-discovered playlist exports **instantly with zero API calls**. re-exporting updates the same playlist instead of duplicating it, and an optional *"match missing tracks"* toggle confidently searches for the stragglers — a wrong-artist or karaoke version is left out, never guessed. (Spotify export is coming in a follow-up.) (#945) -🏷️ **Library Reorganize — Rename only** — a lighter reorganize action that just **renames your files** to your current naming scheme: no re-tagging, no quality/AcoustID re-check, no copy-to-staging. much faster on a NAS, and only touches files whose path actually changes (which also fixes the "2 of 14 previewed but everything got modified" album-splitting). pick it from the new Action dropdown. (#875 — thanks @tsoulard / @Tacobell444) +🏷️ **Library Reorganize — Rename only** — a lighter action that just **renames your files** to your naming scheme: no re-tag, no quality/AcoustID re-check, no copy-to-staging. much faster on a NAS, and only touches files whose path actually changes. pick it from the new Action dropdown. (#875 — thanks @tsoulard / @Tacobell444) -💿 **Broader lossless handling** — lossy-copy now works for **all lossless formats**, not just FLAC (#941); and **DSD** (`.dsf`/`.dff`) is recognized as lossless instead of being false-flagged as "truncated" (#939). +💿 **Broader lossless handling** — lossy-copy now covers **all lossless formats**, not just FLAC (#941); and **DSD** (`.dsf`/`.dff`) is recognized as lossless instead of false-flagged "truncated" (#939). -🐛 **Download + search fixes** — an unbalanced bracket in a filename no longer false-fails as "file not found"; a file we couldn't quarantine is left for retry instead of deleted; "file not found" errors are actionable now; pasted Qobuz/Tidal links inject the exact track into manual search (#932); and the Wing It pool "Fix Match" search works again. +🐛 **Download + search fixes** — an unbalanced bracket no longer false-fails as "file not found"; a file we couldn't quarantine is left for retry instead of deleted; "file not found" errors are actionable now; pasted Qobuz/Tidal links inject the exact track into manual search (#932); the Wing It pool "Fix Match" works again. -⚡ **Reduce visual effects, refined** — it no longer freezes functional motion (spinners, progress) and only kills the expensive GPU stuff (blur, shadows, glow). worker orbs default OFF on Firefox for new users and run at ~30fps under reduce-effects. plus jellyfin scans page the bulk fetch so the watchdog can't false-stall a big library. +⚡ **Reduce visual effects, refined** — it no longer freezes functional motion (spinners, progress), only the expensive GPU stuff (blur, shadows, glow). worker orbs default OFF on Firefox and run at ~30fps under reduce-effects. plus a jellyfin scan watchdog fix for big libraries. -🔧 **Under the hood** — settings page cleanup (#943, thanks @nick2000713), spotify oauth hardening (#942, thanks HellRa1SeR), and npm audit security fixes for vite / undici / @babel (#944, thanks HellRa1SeR). +🔧 **Under the hood** — settings cleanup (#943, @nick2000713), spotify oauth hardening (#942) + npm security fixes (#944, HellRa1SeR). enjoy! 🎶 diff --git a/pr_description.md b/pr_description.md index ed1bdd35..517d8fc5 100644 --- a/pr_description.md +++ b/pr_description.md @@ -1,19 +1,19 @@ # soulsync 2.8.1 — `dev` → `main` -a feature + reliability release. the headline is **export a mirrored playlist back to Spotify or Deezer** — same one-click flow as the listenbrainz export, now pointed at the streaming services. plus a **rename-only mode** for Library Reorganize, broader lossless handling, a pile of download fixes, and the reduce-visual-effects pass refined so it stops freezing functional motion. +a feature + reliability release. the headline is **export a mirrored playlist back to Deezer** — same one-click flow as the listenbrainz export, now pointed at your Deezer account (Spotify export is coming in a follow-up). plus a **rename-only mode** for Library Reorganize, broader lossless handling, a pile of download fixes, and the reduce-visual-effects pass refined so it stops freezing functional motion. --- ## what's new -### 🎧 Export playlists to Spotify & Deezer (#945) -the mirrored-playlist export modal now has **Sync to Spotify** and **Sync to Deezer** next to the listenbrainz / jspf options. it builds a playlist in your account from the tracks soulsync already has the service IDs for: +### 🎧 Export playlists to Deezer (#945) +the mirrored-playlist export modal now has **Sync to Deezer** next to the listenbrainz / jspf options. it builds a Deezer playlist in your account from the tracks soulsync already has the Deezer IDs for: - resolves each track from what's already on hand first — the **discovery cache**, then your library's stored IDs — so for an already-discovered playlist it's instant and uses **zero API calls** - re-exporting **updates the same playlist in place** instead of spawning duplicates - an optional **"match missing tracks"** toggle does a confident live search for the stragglers — and only adds a match it's sure about (a wrong-artist or karaoke version is left out, never guessed) -- service buttons grey out + point you to Settings when that service isn't connected -- spotify needs a one-time reconnect to grant playlist-write access +- the Deezer button greys out + points you to Settings when Deezer isn't connected +- _Spotify export is wired up but waiting on an on-demand write-permission flow, so it's hidden for now_ ### 🏷️ Library Reorganize — Rename only (#875) a lighter reorganize action: it just **renames your files** to your current naming scheme — no re-tagging, no quality/AcoustID re-check, no copy-to-staging. much faster on a NAS, won't fail on post-processing reasons, and only touches files whose path actually changes (which also fixes the "2 of 14 previewed but everything got modified" album-splitting). pick it from the new **Action** dropdown in the reorganize modal. diff --git a/webui/static/helper.js b/webui/static/helper.js index 810b4639..0ec50e2b 100644 --- a/webui/static/helper.js +++ b/webui/static/helper.js @@ -3406,7 +3406,7 @@ const WHATS_NEW = { // "Earlier versions" summary entry. Don't accumulate old per-version blocks. '2.8.1': [ { date: 'June 2026 — 2.8.1 release' }, - { title: 'Export playlists to Spotify & Deezer (#945)', desc: 'the mirrored-playlist export modal now has Sync to Spotify and Sync to Deezer next to the ListenBrainz/JSPF options. it builds a playlist in your account from the IDs soulsync already has — the discovery cache first, then your library — so an already-discovered playlist exports instantly with zero API calls. re-exporting updates the same playlist instead of duplicating it, and an optional "match missing tracks" toggle confidently searches for the stragglers (a wrong-artist or karaoke version is left out, never guessed). spotify needs a one-time reconnect for write access.', page: 'playlists' }, + { title: 'Export playlists to Deezer (#945)', desc: 'the mirrored-playlist export modal now has Sync to Deezer next to the ListenBrainz/JSPF options. it builds a Deezer playlist in your account from the IDs soulsync already has — the discovery cache first, then your library — so an already-discovered playlist exports instantly with zero API calls. re-exporting updates the same playlist instead of duplicating it, and an optional "match missing tracks" toggle confidently searches Deezer for the stragglers (a wrong-artist or karaoke version is left out, never guessed). (Spotify export is coming in a follow-up.)', page: 'playlists' }, { title: 'Library Reorganize — Rename only (#875)', desc: 'a lighter reorganize action that just renames your files to your current naming scheme — no re-tagging, no quality/AcoustID re-check, no copy-to-staging. much faster on a NAS, won\'t fail on post-processing, and only touches files whose path actually changes (which also fixes the "2 of 14 previewed but everything got modified" album-splitting). pick it from the new Action dropdown. (thanks @tsoulard / @Tacobell444.)', page: 'library' }, { title: 'Broader lossless handling (#941, #939)', desc: 'lossy-copy now works for all lossless formats, not just FLAC; and DSD (.dsf/.dff) is recognized as lossless instead of being false-flagged as "truncated".', page: 'downloads' }, { title: 'Download + search fixes', desc: 'an unbalanced bracket in a filename no longer false-fails as "file not found"; a file we couldn\'t quarantine is left for retry instead of deleted; the Identify search defaults to "artist - title"; "file not found" errors are actionable now; pasted Qobuz/Tidal links inject the exact track into manual search (#932); and the Wing It pool "Fix Match" search works again.', page: 'downloads' }, @@ -3443,14 +3443,14 @@ const WHATS_NEW = { // usage_note?: 'optional hint shown at the bottom' } const VERSION_MODAL_SECTIONS = [ { - title: "Export playlists to Spotify & Deezer", - description: "send a mirrored playlist back to your streaming account — the same one-click export, now pointed at Spotify and Deezer.", + title: "Export playlists to Deezer", + description: "send a mirrored playlist back to your Deezer account — the same one-click export, now pointed at Deezer.", features: [ - "#945 — Sync to Spotify / Sync to Deezer sit next to the ListenBrainz/JSPF options in the export modal; each builds a playlist in your account", + "#945 — Sync to Deezer sits next to the ListenBrainz/JSPF options in the export modal; it builds a Deezer playlist in your account", "resolves IDs from what's already on hand first — the discovery cache, then your library — so an already-discovered playlist exports instantly with zero API calls", "re-exporting updates the same playlist in place instead of spawning duplicates", - "an optional \"match missing tracks\" toggle confidently searches for the stragglers — a wrong-artist or karaoke version is left out, never guessed in", - "service buttons grey out + point to Settings when disconnected; Spotify needs a one-time reconnect for write access", + "an optional \"match missing tracks\" toggle confidently searches Deezer for the stragglers — a wrong-artist or karaoke version is left out, never guessed in", + "Spotify export is wired up but waiting on an on-demand write-permission flow, so it's hidden for now", ], }, { diff --git a/webui/static/stats-automations.js b/webui/static/stats-automations.js index 500606e3..f251d918 100644 --- a/webui/static/stats-automations.js +++ b/webui/static/stats-automations.js @@ -667,18 +667,14 @@ function exportMirroredPlaylist(playlistId, name) {
Download .jspf file
Save a JSPF playlist you can upload to ListenBrainz manually.
- -
Tracks are matched by ID (MusicBrainz for ListenBrainz/JSPF; the stored Spotify/Deezer ID for those). Tracks without a match can't be included — you'll see how many made it. Renaming/re-syncing can reset play counts on the destination.
+
Tracks are matched by ID (MusicBrainz for ListenBrainz/JSPF; the stored Deezer ID for that). Tracks without a match can't be included — you'll see how many made it. Renaming/re-syncing can reset play counts on the destination.
`;