From 46f82027cb93e167ae707f8c587cdcf036fbbda2 Mon Sep 17 00:00:00 2001 From: Broque Thomas <26755000+Nezreka@users.noreply.github.com> Date: Thu, 19 Mar 2026 22:17:59 -0700 Subject: [PATCH] Allow re-sync from download_complete state and add Rediscover button All 6 playlist sync endpoints now accept download_complete phase so users can re-sync after downloading. Added Rediscover button to discovered and download_complete states (YouTube + Beatport). Added full button set (Sync, Download Missing, Rediscover) for download_complete which previously showed no buttons at all. --- web_server.py | 16 +++++----- webui/static/script.js | 66 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 65 insertions(+), 17 deletions(-) diff --git a/web_server.py b/web_server.py index 7f6ab042..70689bbb 100644 --- a/web_server.py +++ b/web_server.py @@ -27036,8 +27036,8 @@ def start_tidal_sync(playlist_id): state = tidal_discovery_states[playlist_id] state['last_accessed'] = time.time() # Update access time - - if state['phase'] not in ['discovered', 'sync_complete']: + + if state['phase'] not in ['discovered', 'sync_complete', 'download_complete']: return jsonify({"error": "Tidal playlist not ready for sync"}), 400 # Convert discovery results to Spotify tracks format @@ -27865,7 +27865,7 @@ def start_deezer_sync(playlist_id): state = deezer_discovery_states[playlist_id] state['last_accessed'] = time.time() - if state['phase'] not in ['discovered', 'sync_complete']: + if state['phase'] not in ['discovered', 'sync_complete', 'download_complete']: return jsonify({"error": "Deezer playlist not ready for sync"}), 400 # Convert discovery results to Spotify tracks format @@ -28692,7 +28692,7 @@ def start_spotify_public_sync(url_hash): state = spotify_public_discovery_states[url_hash] state['last_accessed'] = time.time() - if state['phase'] not in ['discovered', 'sync_complete']: + if state['phase'] not in ['discovered', 'sync_complete', 'download_complete']: return jsonify({"error": "Spotify Public playlist not ready for sync"}), 400 # Convert discovery results to Spotify tracks format @@ -29728,8 +29728,8 @@ def start_youtube_sync(url_hash): state = youtube_playlist_states[url_hash] state['last_accessed'] = time.time() # Update access time - - if state['phase'] not in ['discovered', 'sync_complete']: + + if state['phase'] not in ['discovered', 'sync_complete', 'download_complete']: return jsonify({"error": "YouTube playlist not ready for sync"}), 400 # Convert discovery results to Spotify tracks format @@ -35448,7 +35448,7 @@ def start_listenbrainz_sync(playlist_mbid): state = listenbrainz_playlist_states[state_key] state['last_accessed'] = time.time() # Update access time - if state['phase'] not in ['discovered', 'sync_complete']: + if state['phase'] not in ['discovered', 'sync_complete', 'download_complete']: return jsonify({"error": "ListenBrainz playlist not ready for sync"}), 400 # Convert discovery results to Spotify tracks format @@ -37886,7 +37886,7 @@ def start_beatport_sync(url_hash): print(f"đ§ Beatport chart state: phase={state.get('phase')}, has_discovery_results={len(state.get('discovery_results', []))}") - if state['phase'] not in ['discovered', 'sync_complete']: + if state['phase'] not in ['discovered', 'sync_complete', 'download_complete']: print(f"â Beatport chart not ready for sync: {state['phase']}") return jsonify({"error": "Beatport chart not ready for sync"}), 400 diff --git a/webui/static/script.js b/webui/static/script.js index 1e6b9a2e..c523ce85 100644 --- a/webui/static/script.js +++ b/webui/static/script.js @@ -29257,6 +29257,13 @@ function getModalActionButtons(urlHash, phase, state = null) { } } + // Rediscover button â reset and re-run discovery (only for sources with reset endpoints) + if (isBeatport) { + buttons += ``; + } else if (!isListenBrainz && !isTidal && !isDeezer && !isSpotifyPublic) { + buttons += ``; + } + if (!buttons) { buttons = `