From 59848acaf3866fce38ee495a1331dea8603a542b Mon Sep 17 00:00:00 2001 From: Broque Thomas Date: Sun, 25 Jan 2026 00:29:33 -0800 Subject: [PATCH] feat: dynamic source labels and enhanced connection testing - Display "Apple Music" instead of "Spotify" in UI when iTunes is active source - Enhanced connection test messages to indicate Spotify config/auth status - Fixed similar artists requiring Spotify re-scan when Spotify becomes available - Fixed hero slider buttons failing for iTunes-only artists - Updated activity feed items to show correct source name dynamically --- web_server.py | 28 +++++++++++++++++++++++----- webui/index.html | 4 ++-- webui/static/script.js | 24 ++++++++++++++++++++++-- 3 files changed, 47 insertions(+), 9 deletions(-) diff --git a/web_server.py b/web_server.py index 6448b616..2ec13b97 100644 --- a/web_server.py +++ b/web_server.py @@ -1506,10 +1506,23 @@ def run_service_test(service, test_config): # 3. Run the test with the temporary config if service == "spotify": temp_client = SpotifyClient() + + # Check if Spotify credentials are configured + spotify_config = config_manager.get('spotify', {}) + spotify_configured = bool(spotify_config.get('client_id') and spotify_config.get('client_secret')) + if temp_client.is_authenticated(): - return True, "Spotify connection successful!" + # Determine which source is active + if temp_client.is_spotify_authenticated(): + return True, "Spotify connection successful!" + else: + # Using iTunes fallback + if spotify_configured: + return True, "Apple Music connection successful! (Spotify configured but not authenticated)" + else: + return True, "Apple Music connection successful! (Spotify not configured)" else: - return False, "Spotify authentication failed. Check credentials and complete OAuth flow in browser if prompted." + return False, "Music service authentication failed. Check credentials and complete OAuth flow in browser if prompted." elif service == "tidal": temp_client = TidalClient() if temp_client.is_authenticated(): @@ -1926,9 +1939,14 @@ def get_status(): # Actually validate authentication (makes API call, but cached for 2 min) spotify_status = spotify_client.is_authenticated() spotify_response_time = (time.time() - spotify_start) * 1000 + + # Determine active music source (spotify or itunes) + music_source = 'spotify' if spotify_client.is_spotify_authenticated() else 'itunes' + _status_cache['spotify'] = { 'connected': spotify_status, - 'response_time': round(spotify_response_time, 1) + 'response_time': round(spotify_response_time, 1), + 'source': music_source } _status_cache_timestamps['spotify'] = current_time # else: use cached value @@ -2365,7 +2383,7 @@ def test_connection_endpoint(): # Add activity for connection test if success: - add_activity_item("✅", "Connection Test", f"{service.title()} connection successful", "Now") + add_activity_item("✅", "Connection Test", message, "Now") else: add_activity_item("❌", "Connection Test", f"{service.title()} connection failed", "Now") @@ -2411,7 +2429,7 @@ def test_dashboard_connection_endpoint(): # Add activity for dashboard connection test (different from settings test) if success: - add_activity_item("🎛️", "Dashboard Test", f"{service.title()} service verified", "Now") + add_activity_item("🎛️", "Dashboard Test", message, "Now") else: add_activity_item("⚠️", "Dashboard Test", f"{service.title()} service check failed", "Now") diff --git a/webui/index.html b/webui/index.html index 0f2a0ea2..34db2301 100644 --- a/webui/index.html +++ b/webui/index.html @@ -139,7 +139,7 @@

Service Status

- Spotify + Spotify
@@ -175,7 +175,7 @@
- Spotify + Spotify
diff --git a/webui/static/script.js b/webui/static/script.js index 039baa60..137dcb1a 100644 --- a/webui/static/script.js +++ b/webui/static/script.js @@ -2164,7 +2164,8 @@ async function testConnection(service) { const result = await response.json(); if (result.success) { - showToast(`${service} connection successful`, 'success'); + // Use backend's message which contains dynamic source name (Spotify or Apple Music) + showToast(result.message || `${service} connection successful`, 'success'); // Load music libraries after successful connection if (service === 'plex') { @@ -2197,7 +2198,8 @@ async function testDashboardConnection(service) { const result = await response.json(); if (result.success) { - showToast(`${service} service verified`, 'success'); + // Use backend's message which contains dynamic source name (Spotify or Apple Music) + showToast(result.message || `${service} service verified`, 'success'); } else { showToast(`${service} service check failed: ${result.error}`, 'error'); } @@ -23214,6 +23216,15 @@ function updateServiceStatus(service, statusData) { statusText.className = 'service-card-status-text disconnected'; } } + + // Update music source title (Spotify or Apple Music) based on active source + if (service === 'spotify' && statusData.source) { + const musicSourceTitleElement = document.getElementById('music-source-title'); + if (musicSourceTitleElement) { + const sourceName = statusData.source === 'itunes' ? 'Apple Music' : 'Spotify'; + musicSourceTitleElement.textContent = sourceName; + } + } } function updateSidebarServiceStatus(service, statusData) { @@ -23238,6 +23249,15 @@ function updateSidebarServiceStatus(service, statusData) { mediaServerNameElement.textContent = serverName; } } + + // Update music source name (Spotify or Apple Music) based on active source + if (service === 'spotify' && statusData.source) { + const musicSourceNameElement = document.getElementById('music-source-name'); + if (musicSourceNameElement) { + const sourceName = statusData.source === 'itunes' ? 'Apple Music' : 'Spotify'; + musicSourceNameElement.textContent = sourceName; + } + } } }