From 886b9140a1cacdd37d972863586a42aff43fd822 Mon Sep 17 00:00:00 2001 From: Broque Thomas Date: Tue, 29 Jul 2025 17:25:04 -0700 Subject: [PATCH] fixed --- core/__pycache__/plex_client.cpython-312.pyc | Bin 35948 -> 37045 bytes .../soulseek_client.cpython-312.pyc | Bin 58689 -> 58689 bytes .../spotify_client.cpython-312.pyc | Bin 21890 -> 21890 bytes core/spotify_client.py | 2 +- main.py | 8 +-- .../__pycache__/dashboard.cpython-312.pyc | Bin 82585 -> 82585 bytes ui/pages/__pycache__/settings.cpython-312.pyc | Bin 65333 -> 66289 bytes ui/pages/settings.py | 47 ++++++++++++++---- 8 files changed, 42 insertions(+), 15 deletions(-) diff --git a/core/__pycache__/plex_client.cpython-312.pyc b/core/__pycache__/plex_client.cpython-312.pyc index 9a8a77e7dd63ca2889734a6020dd4e6ee833a2c8..040ba5adf87b5bbedb1d815288cfc79c184a7624 100644 GIT binary patch delta 1514 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 F=6?*zr2PN@ diff --git a/ui/pages/settings.py b/ui/pages/settings.py index a9b6b56c..e8eb911b 100644 --- a/ui/pages/settings.py +++ b/ui/pages/settings.py @@ -282,6 +282,10 @@ class ServiceTestThread(QThread): try: from core.spotify_client import SpotifyClient + # Basic validation first + if not self.test_config.get('client_id') or not self.test_config.get('client_secret'): + return False, "✗ Please enter both Client ID and Client Secret" + # Save temporarily to test original_client_id = config_manager.get('spotify.client_id') original_client_secret = config_manager.get('spotify.client_secret') @@ -289,15 +293,32 @@ class ServiceTestThread(QThread): config_manager.set('spotify.client_id', self.test_config['client_id']) config_manager.set('spotify.client_secret', self.test_config['client_secret']) - # Test connection - client = SpotifyClient() - if client.is_authenticated(): - user_info = client.get_user_info() - username = user_info.get('display_name', 'Unknown') if user_info else 'Unknown' - message = f"✓ Spotify connection successful!\nConnected as: {username}" - success = True - else: - message = "✗ Spotify connection failed.\nCheck your credentials and try again." + # Test connection with timeout protection + try: + client = SpotifyClient() + + # Check if client was created successfully (has sp object) + if client.sp is None: + message = "✗ Failed to create Spotify client.\nCheck your credentials." + success = False + else: + # Try a simple auth check with timeout + try: + # This will trigger OAuth flow - user needs to complete it + if client.is_authenticated(): + user_info = client.get_user_info() + username = user_info.get('display_name', 'Unknown') if user_info else 'Unknown' + message = f"✓ Spotify connection successful!\nConnected as: {username}" + success = True + else: + message = "✗ Spotify authentication failed.\nPlease complete the OAuth flow in your browser." + success = False + except Exception as auth_e: + message = f"✗ Spotify authentication failed:\n{str(auth_e)}" + success = False + + except Exception as client_e: + message = f"✗ Failed to create Spotify client:\n{str(client_e)}" success = False # Restore original values @@ -307,6 +328,12 @@ class ServiceTestThread(QThread): return success, message except Exception as e: + # Restore original values even on exception + try: + config_manager.set('spotify.client_id', original_client_id) + config_manager.set('spotify.client_secret', original_client_secret) + except: + pass return False, f"✗ Spotify test failed:\n{str(e)}" def _test_plex(self): @@ -1024,7 +1051,7 @@ class SettingsPage(QWidget): callback_info_label.setStyleSheet("color: #b3b3b3; font-size: 11px; margin-top: 8px;") spotify_layout.addWidget(callback_info_label) - callback_url_label = QLabel("http://localhost:8888/callback") + callback_url_label = QLabel("http://127.0.0.1:8888/callback") callback_url_label.setStyleSheet(""" color: #1db954; font-size: 11px;