Update What's New and version modal with recent features and fixes

Adds April 17 entries for Auto-Import, Wishlist Nebula, automation group
management, bidirectional artist sync, provider-agnostic discovery, live
sidebar badges, and critical source ID embedding fix. Version modal
reorganized to lead with current features and summarize earlier v2.2 work.
pull/308/head
Broque Thomas 4 weeks ago
parent 2539617853
commit 2429d87dbe

@ -22212,117 +22212,113 @@ def get_version_info():
"subtitle": f"Version {SOULSYNC_VERSION} — Latest Changes",
"sections": [
{
"title": "Centralized Downloads Page",
"description": "Live view of every download across the entire app — tracks from Sync, Discover, Artists, Search, and Wishlist all in one place",
"title": "Auto-Import",
"description": "Background staging folder watcher that automatically identifies and imports music into your library",
"features": [
"• New Downloads page in sidebar with live-updating list and nav badge",
"• Filter pills: All, Active, Queued, Completed, Failed",
"• Track position (3 of 19), album art, batch context, and error details per row",
"• Clear Completed button removes finished items from the tracker",
"• Three identification strategies: audio file tags, folder name parsing, and AcoustID fingerprinting",
"• Confidence-gated processing: 90%+ auto-imports, 70-90% queued for review, below 70% left for manual",
"• Smart matching with weighted algorithm — title, artist, track number, and album signals",
"• Approve or reject pending imports from the Import page Auto tab",
"• Content hash-based deduplication prevents reprocessing the same folder",
],
"usage_note": "Click Downloads in the sidebar. The badge updates in real-time from any page."
"usage_note": "Enable on the Import page Auto tab. Set your staging folder in Settings."
},
{
"title": "First-Run Setup Wizard",
"description": "Full-screen guided setup that walks new users through configuration and their first download",
"title": "Wishlist Nebula",
"description": "Wishlist redesigned as an interactive artist orb visualization",
"features": [
"• 7-step wizard: Welcome, Metadata Source, Download Source, Paths, Media Server, Add Artists, First Download",
"• All 6 download sources with inline config and test buttons",
"• Locked path defaults for Docker users (/app/downloads, /app/Transfer)",
"• Add artists to watchlist with live search and remove in place",
"• First download goes through the full matched download pipeline with metadata",
"• Auto-shows on fresh installs, skippable, all settings save to DB",
"• Done page with tips grid covering Sync, Wishlist, Automations, Notifications, Help, and Settings",
"• Each artist is a glowing orb with their photo — album fans and single moons orbit around them",
"• Click orbs to expand and see albums/singles, download directly from the nebula",
"• Processing state shows live progress with spinning ring animation",
"• Stats strip at top shows total artists, albums, singles, and tracks",
],
"usage_note": "Auto-shows for new users. Re-open anytime with ?setup=1 in the URL."
"usage_note": "Click Wishlist in the sidebar to see the Nebula view."
},
{
"title": "Graceful Shutdown & Stability",
"description": "Application now shuts down cleanly within 1 second instead of 60+",
"title": "Automation Group Management",
"description": "Organize and manage your automation groups with full control",
"features": [
"• All background workers use interruptible sleep — respond to shutdown signals immediately",
"• Docker containers no longer force-kill, preventing SQLite WAL corruption",
"• Parallel component shutdown for scan managers, repair workers, executors",
"• Download monitor thread safety with proper locking",
"• Logging initialized early so import-time diagnostic messages are captured",
"• Database initialization fixed for fresh installs — all migrations run in a single cycle",
"• Rename, delete, and bulk-toggle automation groups from group headers",
"• Drag-and-drop automations between groups to reorganize",
"• Delete confirmation dialog with group name and automation count",
],
"usage_note": "Docker users: containers now stop gracefully within the default 10-second timeout."
"usage_note": "Right-click or use the action buttons on group headers in the Automations page."
},
{
"title": "Unknown Artist Prevention",
"description": "Multi-layer defense against tracks downloading as 'Unknown Artist'",
"title": "Bidirectional Artist Sync & Server Playlists",
"description": "Artist sync now goes both ways, and server playlists show full coverage",
"features": [
"Metadata cache now rejects tracks with junk artist names — prevents caching incomplete data",
"Post-processing 3-tier fallback: check track_info, search result, then re-fetch from metadata API",
"Files never land in 'Unknown Artist' folders — guard runs before folder creation and tag embedding",
"Artist Sync pulls new content from your media server AND removes stale library entries",
"Deep scan mode fetches full metadata for newly discovered tracks",
"Server playlist view shows all playlists with clear synced vs unsynced visual separation",
],
},
{
"title": "Deezer Multi-Artist Tagging",
"description": "Feature tracks now tag all credited artists using Deezer's contributors field",
"title": "Provider-Agnostic Discovery",
"description": "Discovery features work with any configured metadata source instead of requiring Spotify",
"features": [
"• ARTIST tag includes all contributors (e.g. 'Kraftklub, Domiziana') instead of just the primary",
"• Album artist tag unchanged — folder organization unaffected",
"• Falls back gracefully when contributors field is absent (search results)",
"• Similar artist matching, discovery pool, and incremental updates use source priority",
"• Falls back through Spotify, iTunes, and Deezer in configured order",
"• MusicMap URL encoding fixed for artists with special characters",
"• Freshness check simplified to age-based — backfill handles missing IDs separately",
],
},
{
"title": "Music Videos — Search & Download from YouTube",
"description": "Music Videos tab in enhanced and global search",
"title": "Dashboard & Navigation",
"description": "Dashboard improvements and sidebar navigation enhancements",
"features": [
"• Video cards with thumbnails, duration, channel name, view count",
"• Click to download with progress ring — metadata matched before saving",
"• Saves to configurable Music Videos directory (Plex format)",
"• Library Status card on Dashboard — shows server state, track counts, scan buttons",
"• Tools page in sidebar — all maintenance tools moved from Dashboard modal",
"• Watchlist and Wishlist promoted to full sidebar pages with live count badges",
"• AcoustID scanner scans full library with actionable fix options (retag, redownload, delete)",
],
"usage_note": "Set your Music Videos directory in Settings > Downloads, then use the Music Videos tab in search."
},
{
"title": "Lidarr Download Source (Development)",
"description": "7th download source for Usenet and torrent content via Lidarr",
"title": "MusicBrainz & Metadata Fixes",
"description": "Critical tag embedding fix and Picard-style album consistency",
"features": [
"• SoulSync handles discovery and matching, Lidarr handles downloading",
"• Configure with URL + API key in Settings > Downloads",
"• Available as standalone source or in Hybrid mode priority order",
"• Fix: source ID tags (Spotify, MusicBrainz, Deezer, AudioDB) were silently skipped on every download — now embed correctly",
"• Picard-style release preference scoring prevents Navidrome album splits",
"• Source tags wiped when metadata enhancement is skipped or fails",
"• Spotify API no longer called when Deezer/iTunes is the configured primary source",
],
"usage_note": "Requires a running Lidarr instance. Set Download Source to 'Lidarr Only (Development)' or add to Hybrid order."
},
{
"title": "Matching & Quality Improvements",
"description": "Better album matching, per-track artist support, and placeholder detection",
"title": "Recent Fixes",
"description": "Bug fixes from recent releases and community reports",
"features": [
"• Album matching uses full similarity instead of word subset — 'Paradise' no longer matches 'Club Paradise'",
"• Artist gate prevents wrong-artist downloads (Soulseek < 0.25, YouTube < 0.15 threshold)",
"• Word boundary matching for artists — 'muse' no longer matches 'museum'",
"• Watchlist scanner skips albums with placeholder tracks ('Track 1', 'Track 2') from unreleased tracklists",
"• Per-track artist column for compilations and DJ mixes — tag writer uses track artist, not album artist",
"• Centralized metadata source selection — all features respect your configured source",
"• Fix watchlist scan false failures — empty discography no longer reported as error",
"• Fix deezer_artist_id column error on enhanced library sync",
"• Fix wishlist button intermittently not navigating to page",
"• Fix worker orb tooltips rendering behind dashboard content",
"• Fix OAuth callback port hardcoding — custom ports now respected",
"• Fix allow duplicates setting not saving",
"• Fix wishlist dropping cross-album tracks when duplicates enabled",
"• Fix replace lower quality setting not persisting",
"• Fix Spotify enrichment worker infinite loop on pre-matched artists",
"• Reject Qobuz 30-second sample/preview downloads",
],
},
{
"title": "Fixes & Improvements",
"description": "60+ commits of bug fixes, UX improvements, and infrastructure",
"title": "Earlier in v2.2",
"description": "Major features from earlier in this release cycle",
"features": [
"• Plex playlists crash on Tag objects fixed — safe attribute access for non-playlist items",
"• Music library paths now auto-save when added/removed on settings page",
"• M3U files no longer created for single track downloads — only playlists",
"• M3U [object Object] artist bug fixed — handles all artist format variations",
"• Album year update 'database not defined' error fixed in post-processing",
"• Sync tab content scrolling fixed — long lists no longer clipped",
"• Hybrid download status shows green when any serverless source is in the order",
"• Serverless sources (YouTube, HiFi, Qobuz) always show green in service status",
"• Repeated slskd 401 errors suppressed after first warning",
"• Download clients reload paths when settings change (no restart needed)",
"• watchlist_artists table migrations include all provider ID columns in rebuilds",
"• Emojis removed from all Python log and print statements",
"• Interactive help coverage expanded with 30+ new entries",
"• Docker compose includes optional slskd service block",
"• Multi-stage Docker build reduces image size",
"• MusicBrainz recording ID backfilled from Navidrome during scan",
"• AcoustID test connection no longer reports failure for valid API keys when library is empty",
"• Centralized Downloads page with live-updating list and filter pills",
"• First-Run Setup Wizard — 7-step guided configuration",
"• Music Videos — search and download from YouTube",
"• Inbound Music Request API for external tools (Discord bots, Home Assistant)",
"• Lidarr download source (development) — 7th source for Usenet/torrent via Lidarr",
"• Graceful shutdown — all workers respond to shutdown signals immediately",
"• Unknown Artist prevention with 3-tier metadata fallback",
"• Deezer multi-artist tagging using contributors field",
"• Artist Map — Watchlist Constellation, Genre Map, and Artist Explorer canvas modes",
"• Discogs integration — enrichment worker, fallback source, enhanced search tab",
"• Wing It mode, Global Search Bar, Redesigned Notifications",
"• Server Playlist Manager, Sync History Dashboard, Playlist Explorer",
"• Enhanced Library Manager with inline tag editing and write-to-file",
"• Automation Signals, Multi-Source Search Tabs, Rich Artist Profiles",
],
},
# v2.2 and earlier features moved to archive
]
}
return jsonify(version_data)

@ -3600,16 +3600,28 @@ function closeHelperSearch() {
const WHATS_NEW = {
'2.2': [
// --- April 17, 2026 ---
{ date: 'April 17, 2026' },
{ title: 'Auto-Import', desc: 'Background staging folder watcher that automatically identifies and imports music. Three strategies: audio tags, folder name parsing, and AcoustID fingerprinting. Confidence-gated: 90%+ auto-imports, 70-90% queued for review, below 70% left for manual. Enable on the Import page Auto tab', page: 'import' },
{ title: 'Wishlist Nebula', desc: 'Wishlist redesigned as an interactive artist orb visualization. Each artist is a glowing orb with their photo — album fans and single moons orbit around them. Click orbs to expand, download albums/singles directly. Processing state shows live progress', page: 'wishlist' },
{ title: 'Automation Group Management', desc: 'Rename, delete, and bulk-toggle automation groups. Drag-and-drop automations between groups. Right-click group headers for context menu', page: 'automations' },
{ title: 'Bidirectional Artist Sync', desc: 'Artist Sync button now pulls new content from your media server AND removes stale library entries no longer on the server. Deep scan mode fetches full metadata for new tracks', page: 'library' },
{ title: 'Server Playlists — Synced vs Unsynced', desc: 'Server playlist view now shows all playlists from your media server with clear visual separation between synced and unsynced playlists', page: 'sync' },
{ title: 'Provider-Agnostic Discovery', desc: 'Similar artist matching, discovery pool, and incremental updates now work with any configured metadata source (Spotify, iTunes, Deezer) instead of requiring Spotify. Falls back through sources in priority order', page: 'watchlist' },
{ title: 'Live Sidebar Badges', desc: 'Watchlist and Wishlist sidebar nav items show live count badges that update from WebSocket pushes' },
{ title: 'Fix Source ID Embedding', desc: 'Critical fix — all source ID tags (Spotify, MusicBrainz, Deezer, AudioDB) were silently skipped on every download due to a missing function parameter. Tags now embed correctly again' },
{ title: 'Fix Watchlist Scan False Failures', desc: 'Artists with no new releases in the lookback window were incorrectly reported as scan failures. Empty discography now correctly treated as success' },
{ title: 'Fix Wishlist Album Remove', desc: 'Removing albums from the Wishlist Nebula now works — API accepts album_name as fallback when album_id is unavailable' },
// --- April 15, 2026 ---
{ date: 'April 15, 2026' },
{ title: 'Dashboard Library Status Card', desc: 'Smart card on the Dashboard showing your library state — server connection, track counts, last refresh time. Guides new users through setup, shows empty-library prompts, and lets you trigger a scan directly from the dashboard', page: 'dashboard' },
{ title: 'AcoustID Scanner Upgrade', desc: 'Now scans your full library (not just Transfer) to detect wrong downloads. Actionable fixes: retag with correct metadata, re-download the right track, or delete the wrong file. Enabled by default, runs daily' },
{ title: 'Tools Page', desc: 'All tool cards (Database Updater, Quality Scanner, Duplicate Cleaner, Retag, Backups, Cache, etc.) and Library Maintenance moved from the Dashboard to a dedicated Tools page in the sidebar. Dashboard shows a quick-link card', page: 'tools' },
{ title: 'Watchlist & Wishlist Sidebar Pages', desc: 'Watchlist and Wishlist promoted from modals to full sidebar pages. All features preserved — artist grid, scan controls, batch operations, live activity, countdown timers, category cards with mosaic backgrounds. Header buttons now navigate to the pages', page: 'watchlist' },
{ title: 'Watchlist & Wishlist Sidebar Pages', desc: 'Watchlist and Wishlist promoted from modals to full sidebar pages. All features preserved — artist grid, scan controls, batch operations, live activity, countdown timers. Header buttons now navigate to the pages', page: 'watchlist' },
{ title: 'Picard-Style MusicBrainz Album Consistency', desc: 'Recording MBIDs now pulled from the matched release tracklist instead of independent searches. Batch-level artist name used for stable cache keys. Post-batch consistency pass rewrites album-level tags on all files to guarantee identical MusicBrainz IDs — prevents Navidrome album splits' },
{ title: 'Fix Spotify API Leaking When Deezer/iTunes is Primary', desc: 'Spotify was being called for watchlist album scanning, similar artist discovery, repair jobs, and the Artists page search even when another source was set as primary. All data-fetching now respects the configured primary source. Spotify playlist sync is unaffected' },
{ title: 'Fix OAuth Callback Port Hardcoding', desc: 'Custom callback ports (SOULSYNC_SPOTIFY_CALLBACK_PORT / SOULSYNC_TIDAL_CALLBACK_PORT) are now respected in auth instruction pages and log messages instead of always showing 8888. Added startup diagnostics logging for callback port binding' },
{ title: 'Fix Wishlist Button on Non-Dashboard Pages', desc: 'Wishlist button click handler moved to global init so it works from any page, not just the dashboard' },
{ title: 'Fix Allow Duplicates Setting Not Saving', desc: 'The "Allow duplicate tracks across albums" toggle was never persisted — it silently reset to ON on every page reload. Now saves correctly' },
{ title: 'Fix Wishlist Dropping Cross-Album Tracks', desc: 'Wishlist cleanup was removing same-titled tracks from different albums even when Allow Duplicates was enabled. Cleanup now respects the setting — same song from different albums can coexist in the wishlist' },
{ title: 'Fix "Replace Lower Quality" Setting Not Persisting', desc: 'The import section appeared twice in the settings save payload — the second instance (with only staging_path) overwrote the first (with replace_lower_quality). Merged into a single block' },

Loading…
Cancel
Save