diff --git a/.spotify_cache b/.spotify_cache index adb68578..4ca4ae48 100644 --- a/.spotify_cache +++ b/.spotify_cache @@ -1 +1 @@ -{"access_token": "BQDOhKfFATvb-8-rw278Xzc-T-QgPJ5_7mWFHT4yw83y2c5yvmDDQ8qdkKuiFc-Hfc8V7L6o_8w9d5Vl9TPuek9pxE-PNeNPwxsRn9CVScttd2_XEuxnR-ag53yqrMP4rSaUZnXT5pd1tqizay2aOpmdfV89BTg7-Vj3SARGgofrhBbJqO4hNZY5EqVGpWpDyzJCUeG4W7jvLC62eO8qFVpnbrqNdRKGMeZ6FfCdiVZfjrxlPv9a-LaUYeazk3aR", "token_type": "Bearer", "expires_in": 3600, "scope": "user-library-read user-read-private playlist-read-private playlist-read-collaborative user-read-email", "expires_at": 1753742887, "refresh_token": "AQDmfQkPCGObfJeTUIbW1hAAwhSqkuHRA3Qh2dqVYMRh0eCkFMQgPNJDDzF8y-BiaVbj80zePkK_XSfYH1aJutMtNbnsqRKWuxP31BTrMc7pdUdbE7Fma4oH8wpDUKdG3MM"} \ No newline at end of file +{"access_token": "BQCAxqYls1GZziWWT_RK2oephXS0gdOA6aCR_ylemRRdjvZ3ZAvgzQDiZcOvP6DdENbfoZK2d5m-a61GUp1syw9sMS6U3qjvjhGGgACvl4jytuArO-ht2crjJmeVdl_88YIrBMrlZsBnOAmOyPH8xA7X1i9hy5H5_nO32iiM1t96sm9rT9zIAe6gCQpDt36SbLafT2GZz_7dH3k6QVZRkuESnyr9xXznIsshhemd2UFnRnTGzg8ptWp7eCVAiL5d", "token_type": "Bearer", "expires_in": 3600, "scope": "user-library-read user-read-private playlist-read-private playlist-read-collaborative user-read-email", "expires_at": 1753746945, "refresh_token": "AQDmfQkPCGObfJeTUIbW1hAAwhSqkuHRA3Qh2dqVYMRh0eCkFMQgPNJDDzF8y-BiaVbj80zePkK_XSfYH1aJutMtNbnsqRKWuxP31BTrMc7pdUdbE7Fma4oH8wpDUKdG3MM"} \ No newline at end of file diff --git a/core/__pycache__/plex_client.cpython-312.pyc b/core/__pycache__/plex_client.cpython-312.pyc index ae8b0587..9f94c2e6 100644 Binary files a/core/__pycache__/plex_client.cpython-312.pyc and b/core/__pycache__/plex_client.cpython-312.pyc differ diff --git a/core/plex_client.py b/core/plex_client.py index 318924b4..56400cd2 100644 --- a/core/plex_client.py +++ b/core/plex_client.py @@ -414,6 +414,59 @@ class PlexClient: logger.error(f"Error getting library stats: {e}") return {} + def get_all_artists(self) -> List[PlexArtist]: + """Get all artists from the music library""" + if not self.ensure_connection() or not self.music_library: + logger.error("Not connected to Plex server or no music library") + return [] + + try: + artists = self.music_library.searchArtists() + logger.info(f"Found {len(artists)} artists in Plex library") + return artists + except Exception as e: + logger.error(f"Error getting all artists: {e}") + return [] + + def update_artist_genres(self, artist: PlexArtist, genres: List[str]): + """Update artist genres""" + try: + # Clear existing genres first + for genre in artist.genres: + artist.removeGenre(genre) + + # Add new genres + for genre in genres: + artist.addGenre(genre) + + logger.info(f"Updated genres for {artist.title}: {genres}") + return True + except Exception as e: + logger.error(f"Error updating genres for {artist.title}: {e}") + return False + + def update_artist_poster(self, artist: PlexArtist, image_data: bytes): + """Update artist poster image""" + try: + # Upload poster using Plex API + upload_url = f"{self.server._baseurl}/library/metadata/{artist.ratingKey}/posters" + headers = { + 'X-Plex-Token': self.server._token, + 'Content-Type': 'image/jpeg' + } + + response = requests.post(upload_url, data=image_data, headers=headers) + response.raise_for_status() + + # Refresh artist to see changes + artist.refresh() + logger.info(f"Updated poster for {artist.title}") + return True + + except Exception as e: + logger.error(f"Error updating poster for {artist.title}: {e}") + return False + def update_track_metadata(self, track_id: str, metadata: Dict[str, Any]) -> bool: if not self.ensure_connection(): return False diff --git a/logs/app.log b/logs/app.log index 928afd31..f5c28f41 100644 --- a/logs/app.log +++ b/logs/app.log @@ -213641,3 +213641,419 @@ 2025-07-28 15:30:37 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"endedAt":"2025-07-27T21:28:19.7264233Z","fileCount":13,"id":"41b335b7-58a3-4201-8506-22e0954564eb","isComplete":true,"lockedFileCount":0,"responseCount":12,"responses":[],"searchText":"Tommy Cash Baba Yaga","startedAt":"2025-07-27T21:28:02.1709869Z","state":"Completed, TimedOut","token":80},{"endedAt":"2025-07-27T21:28:20.4645342Z","fileCount":5,"id":"7e66f9a9-00ac-451b-a199-5f6a7f18930c","isComplete":true,"lockedFileCount":0,"responseCount":5,"responses":[],"searchText":"Tommy Cash SugaSuga"... 2025-07-28 15:30:37 - newmusic.soulseek_client - INFO - get_all_searches:957 - Retrieved 106 searches from slskd 2025-07-28 15:30:37 - newmusic.soulseek_client - DEBUG - maintain_search_history:1058 - Search count (106) within limit (200), no maintenance needed +2025-07-28 15:32:36 - newmusic.soulseek_client - DEBUG - get_all_searches:952 - Getting all searches with endpoint: searches +2025-07-28 15:32:36 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches +2025-07-28 15:32:36 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-28 15:32:37 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-28 15:32:37 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"endedAt":"2025-07-27T21:28:19.7264233Z","fileCount":13,"id":"41b335b7-58a3-4201-8506-22e0954564eb","isComplete":true,"lockedFileCount":0,"responseCount":12,"responses":[],"searchText":"Tommy Cash Baba Yaga","startedAt":"2025-07-27T21:28:02.1709869Z","state":"Completed, TimedOut","token":80},{"endedAt":"2025-07-27T21:28:20.4645342Z","fileCount":5,"id":"7e66f9a9-00ac-451b-a199-5f6a7f18930c","isComplete":true,"lockedFileCount":0,"responseCount":5,"responses":[],"searchText":"Tommy Cash SugaSuga"... +2025-07-28 15:32:37 - newmusic.soulseek_client - INFO - get_all_searches:957 - Retrieved 106 searches from slskd +2025-07-28 15:32:37 - newmusic.soulseek_client - DEBUG - maintain_search_history:1058 - Search count (106) within limit (200), no maintenance needed +2025-07-28 15:33:00 - newmusic.main - INFO - change_page:278 - Changed to page: downloads +2025-07-28 15:33:02 - newmusic.soulseek_client - DEBUG - clear_all_completed_downloads:925 - Clearing all completed downloads with endpoint: transfers/downloads/all/completed +2025-07-28 15:33:02 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making DELETE request to: http://localhost:5030/api/v0/transfers/downloads/all/completed +2025-07-28 15:33:02 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-28 15:33:03 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 204 +2025-07-28 15:33:03 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: ... +2025-07-28 15:33:03 - newmusic.soulseek_client - INFO - clear_all_completed_downloads:930 - Successfully cleared all completed downloads from slskd +2025-07-28 15:33:04 - newmusic.main - INFO - change_page:278 - Changed to page: dashboard +2025-07-28 15:34:36 - newmusic.soulseek_client - DEBUG - get_all_searches:952 - Getting all searches with endpoint: searches +2025-07-28 15:34:36 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches +2025-07-28 15:34:36 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-28 15:34:37 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-28 15:34:37 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"endedAt":"2025-07-27T21:28:19.7264233Z","fileCount":13,"id":"41b335b7-58a3-4201-8506-22e0954564eb","isComplete":true,"lockedFileCount":0,"responseCount":12,"responses":[],"searchText":"Tommy Cash Baba Yaga","startedAt":"2025-07-27T21:28:02.1709869Z","state":"Completed, TimedOut","token":80},{"endedAt":"2025-07-27T21:28:20.4645342Z","fileCount":5,"id":"7e66f9a9-00ac-451b-a199-5f6a7f18930c","isComplete":true,"lockedFileCount":0,"responseCount":5,"responses":[],"searchText":"Tommy Cash SugaSuga"... +2025-07-28 15:34:37 - newmusic.soulseek_client - INFO - get_all_searches:957 - Retrieved 106 searches from slskd +2025-07-28 15:34:37 - newmusic.soulseek_client - DEBUG - maintain_search_history:1058 - Search count (106) within limit (200), no maintenance needed +2025-07-28 15:36:36 - newmusic.soulseek_client - DEBUG - get_all_searches:952 - Getting all searches with endpoint: searches +2025-07-28 15:36:36 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches +2025-07-28 15:36:36 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-28 15:36:37 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-28 15:36:37 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"endedAt":"2025-07-27T21:28:19.7264233Z","fileCount":13,"id":"41b335b7-58a3-4201-8506-22e0954564eb","isComplete":true,"lockedFileCount":0,"responseCount":12,"responses":[],"searchText":"Tommy Cash Baba Yaga","startedAt":"2025-07-27T21:28:02.1709869Z","state":"Completed, TimedOut","token":80},{"endedAt":"2025-07-27T21:28:20.4645342Z","fileCount":5,"id":"7e66f9a9-00ac-451b-a199-5f6a7f18930c","isComplete":true,"lockedFileCount":0,"responseCount":5,"responses":[],"searchText":"Tommy Cash SugaSuga"... +2025-07-28 15:36:37 - newmusic.soulseek_client - INFO - get_all_searches:957 - Retrieved 106 searches from slskd +2025-07-28 15:36:37 - newmusic.soulseek_client - DEBUG - maintain_search_history:1058 - Search count (106) within limit (200), no maintenance needed +2025-07-28 15:38:36 - newmusic.soulseek_client - DEBUG - get_all_searches:952 - Getting all searches with endpoint: searches +2025-07-28 15:38:36 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches +2025-07-28 15:38:36 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-28 15:38:37 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-28 15:38:37 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"endedAt":"2025-07-27T21:28:19.7264233Z","fileCount":13,"id":"41b335b7-58a3-4201-8506-22e0954564eb","isComplete":true,"lockedFileCount":0,"responseCount":12,"responses":[],"searchText":"Tommy Cash Baba Yaga","startedAt":"2025-07-27T21:28:02.1709869Z","state":"Completed, TimedOut","token":80},{"endedAt":"2025-07-27T21:28:20.4645342Z","fileCount":5,"id":"7e66f9a9-00ac-451b-a199-5f6a7f18930c","isComplete":true,"lockedFileCount":0,"responseCount":5,"responses":[],"searchText":"Tommy Cash SugaSuga"... +2025-07-28 15:38:37 - newmusic.soulseek_client - INFO - get_all_searches:957 - Retrieved 106 searches from slskd +2025-07-28 15:38:37 - newmusic.soulseek_client - DEBUG - maintain_search_history:1058 - Search count (106) within limit (200), no maintenance needed +2025-07-28 15:40:36 - newmusic.soulseek_client - DEBUG - get_all_searches:952 - Getting all searches with endpoint: searches +2025-07-28 15:40:36 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches +2025-07-28 15:40:36 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-28 15:40:37 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-28 15:40:37 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"endedAt":"2025-07-27T21:28:19.7264233Z","fileCount":13,"id":"41b335b7-58a3-4201-8506-22e0954564eb","isComplete":true,"lockedFileCount":0,"responseCount":12,"responses":[],"searchText":"Tommy Cash Baba Yaga","startedAt":"2025-07-27T21:28:02.1709869Z","state":"Completed, TimedOut","token":80},{"endedAt":"2025-07-27T21:28:20.4645342Z","fileCount":5,"id":"7e66f9a9-00ac-451b-a199-5f6a7f18930c","isComplete":true,"lockedFileCount":0,"responseCount":5,"responses":[],"searchText":"Tommy Cash SugaSuga"... +2025-07-28 15:40:37 - newmusic.soulseek_client - INFO - get_all_searches:957 - Retrieved 106 searches from slskd +2025-07-28 15:40:37 - newmusic.soulseek_client - DEBUG - maintain_search_history:1058 - Search count (106) within limit (200), no maintenance needed +2025-07-28 15:42:36 - newmusic.soulseek_client - DEBUG - get_all_searches:952 - Getting all searches with endpoint: searches +2025-07-28 15:42:36 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches +2025-07-28 15:42:36 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-28 15:42:37 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-28 15:42:37 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"endedAt":"2025-07-27T21:28:19.7264233Z","fileCount":13,"id":"41b335b7-58a3-4201-8506-22e0954564eb","isComplete":true,"lockedFileCount":0,"responseCount":12,"responses":[],"searchText":"Tommy Cash Baba Yaga","startedAt":"2025-07-27T21:28:02.1709869Z","state":"Completed, TimedOut","token":80},{"endedAt":"2025-07-27T21:28:20.4645342Z","fileCount":5,"id":"7e66f9a9-00ac-451b-a199-5f6a7f18930c","isComplete":true,"lockedFileCount":0,"responseCount":5,"responses":[],"searchText":"Tommy Cash SugaSuga"... +2025-07-28 15:42:37 - newmusic.soulseek_client - INFO - get_all_searches:957 - Retrieved 106 searches from slskd +2025-07-28 15:42:37 - newmusic.soulseek_client - DEBUG - maintain_search_history:1058 - Search count (106) within limit (200), no maintenance needed +2025-07-28 15:44:36 - newmusic.soulseek_client - DEBUG - get_all_searches:952 - Getting all searches with endpoint: searches +2025-07-28 15:44:36 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches +2025-07-28 15:44:36 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-28 15:44:37 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-28 15:44:37 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"endedAt":"2025-07-27T21:28:19.7264233Z","fileCount":13,"id":"41b335b7-58a3-4201-8506-22e0954564eb","isComplete":true,"lockedFileCount":0,"responseCount":12,"responses":[],"searchText":"Tommy Cash Baba Yaga","startedAt":"2025-07-27T21:28:02.1709869Z","state":"Completed, TimedOut","token":80},{"endedAt":"2025-07-27T21:28:20.4645342Z","fileCount":5,"id":"7e66f9a9-00ac-451b-a199-5f6a7f18930c","isComplete":true,"lockedFileCount":0,"responseCount":5,"responses":[],"searchText":"Tommy Cash SugaSuga"... +2025-07-28 15:44:37 - newmusic.soulseek_client - INFO - get_all_searches:957 - Retrieved 106 searches from slskd +2025-07-28 15:44:37 - newmusic.soulseek_client - DEBUG - maintain_search_history:1058 - Search count (106) within limit (200), no maintenance needed +2025-07-28 15:46:36 - newmusic.soulseek_client - DEBUG - get_all_searches:952 - Getting all searches with endpoint: searches +2025-07-28 15:46:36 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches +2025-07-28 15:46:36 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-28 15:46:37 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-28 15:46:37 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"endedAt":"2025-07-27T21:28:19.7264233Z","fileCount":13,"id":"41b335b7-58a3-4201-8506-22e0954564eb","isComplete":true,"lockedFileCount":0,"responseCount":12,"responses":[],"searchText":"Tommy Cash Baba Yaga","startedAt":"2025-07-27T21:28:02.1709869Z","state":"Completed, TimedOut","token":80},{"endedAt":"2025-07-27T21:28:20.4645342Z","fileCount":5,"id":"7e66f9a9-00ac-451b-a199-5f6a7f18930c","isComplete":true,"lockedFileCount":0,"responseCount":5,"responses":[],"searchText":"Tommy Cash SugaSuga"... +2025-07-28 15:46:37 - newmusic.soulseek_client - INFO - get_all_searches:957 - Retrieved 106 searches from slskd +2025-07-28 15:46:37 - newmusic.soulseek_client - DEBUG - maintain_search_history:1058 - Search count (106) within limit (200), no maintenance needed +2025-07-28 15:48:36 - newmusic.soulseek_client - DEBUG - get_all_searches:952 - Getting all searches with endpoint: searches +2025-07-28 15:48:36 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches +2025-07-28 15:48:36 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-28 15:48:37 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-28 15:48:37 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"endedAt":"2025-07-27T21:28:19.7264233Z","fileCount":13,"id":"41b335b7-58a3-4201-8506-22e0954564eb","isComplete":true,"lockedFileCount":0,"responseCount":12,"responses":[],"searchText":"Tommy Cash Baba Yaga","startedAt":"2025-07-27T21:28:02.1709869Z","state":"Completed, TimedOut","token":80},{"endedAt":"2025-07-27T21:28:20.4645342Z","fileCount":5,"id":"7e66f9a9-00ac-451b-a199-5f6a7f18930c","isComplete":true,"lockedFileCount":0,"responseCount":5,"responses":[],"searchText":"Tommy Cash SugaSuga"... +2025-07-28 15:48:37 - newmusic.soulseek_client - INFO - get_all_searches:957 - Retrieved 106 searches from slskd +2025-07-28 15:48:37 - newmusic.soulseek_client - DEBUG - maintain_search_history:1058 - Search count (106) within limit (200), no maintenance needed +2025-07-28 15:50:36 - newmusic.soulseek_client - DEBUG - get_all_searches:952 - Getting all searches with endpoint: searches +2025-07-28 15:50:36 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches +2025-07-28 15:50:36 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-28 15:50:37 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-28 15:50:37 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"endedAt":"2025-07-27T21:28:19.7264233Z","fileCount":13,"id":"41b335b7-58a3-4201-8506-22e0954564eb","isComplete":true,"lockedFileCount":0,"responseCount":12,"responses":[],"searchText":"Tommy Cash Baba Yaga","startedAt":"2025-07-27T21:28:02.1709869Z","state":"Completed, TimedOut","token":80},{"endedAt":"2025-07-27T21:28:20.4645342Z","fileCount":5,"id":"7e66f9a9-00ac-451b-a199-5f6a7f18930c","isComplete":true,"lockedFileCount":0,"responseCount":5,"responses":[],"searchText":"Tommy Cash SugaSuga"... +2025-07-28 15:50:37 - newmusic.soulseek_client - INFO - get_all_searches:957 - Retrieved 106 searches from slskd +2025-07-28 15:50:37 - newmusic.soulseek_client - DEBUG - maintain_search_history:1058 - Search count (106) within limit (200), no maintenance needed +2025-07-28 15:52:36 - newmusic.soulseek_client - DEBUG - get_all_searches:952 - Getting all searches with endpoint: searches +2025-07-28 15:52:36 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches +2025-07-28 15:52:36 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-28 15:52:37 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-28 15:52:37 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"endedAt":"2025-07-27T21:28:19.7264233Z","fileCount":13,"id":"41b335b7-58a3-4201-8506-22e0954564eb","isComplete":true,"lockedFileCount":0,"responseCount":12,"responses":[],"searchText":"Tommy Cash Baba Yaga","startedAt":"2025-07-27T21:28:02.1709869Z","state":"Completed, TimedOut","token":80},{"endedAt":"2025-07-27T21:28:20.4645342Z","fileCount":5,"id":"7e66f9a9-00ac-451b-a199-5f6a7f18930c","isComplete":true,"lockedFileCount":0,"responseCount":5,"responses":[],"searchText":"Tommy Cash SugaSuga"... +2025-07-28 15:52:37 - newmusic.soulseek_client - INFO - get_all_searches:957 - Retrieved 106 searches from slskd +2025-07-28 15:52:37 - newmusic.soulseek_client - DEBUG - maintain_search_history:1058 - Search count (106) within limit (200), no maintenance needed +2025-07-28 15:53:23 - newmusic.main - INFO - closeEvent:295 - Closing application... +2025-07-28 15:53:23 - newmusic.main - INFO - closeEvent:300 - Cleaning up Downloads page threads... +2025-07-28 15:53:23 - newmusic.main - INFO - closeEvent:305 - Stopping status monitoring thread... +2025-07-28 15:53:25 - newmusic.main - INFO - closeEvent:310 - Stopping search maintenance timer... +2025-07-28 15:53:25 - newmusic.main - INFO - closeEvent:315 - Closing Soulseek client... +2025-07-28 15:53:25 - newmusic.main - ERROR - closeEvent:319 - Error closing Soulseek client: Event loop is closed +2025-07-28 15:53:25 - newmusic.main - INFO - closeEvent:321 - Application closed successfully +2025-07-28 15:53:30 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-28 15:53:30 - newmusic.main - INFO - main:335 - Starting NewMusic application +2025-07-28 15:53:30 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-28 15:53:30 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-28 15:53:30 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-28 15:53:31 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-28 15:53:31 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-28 15:53:31 - newmusic.main - INFO - change_page:278 - Changed to page: dashboard +2025-07-28 15:53:31 - newmusic.main - INFO - setup_media_player_connections:230 - Media player connections established between sidebar and downloads page +2025-07-28 15:53:31 - newmusic.main - INFO - setup_settings_connections:235 - Settings change connections established +2025-07-28 15:53:31 - newmusic.main - INFO - setup_search_maintenance:91 - Search maintenance timer started (every 2 minutes, keeps 200 most recent searches) +2025-07-28 15:53:31 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-28 15:53:31 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-28 15:55:05 - newmusic.main - INFO - closeEvent:295 - Closing application... +2025-07-28 15:55:05 - newmusic.main - INFO - closeEvent:300 - Cleaning up Downloads page threads... +2025-07-28 15:55:05 - newmusic.main - INFO - closeEvent:305 - Stopping status monitoring thread... +2025-07-28 15:55:07 - newmusic.main - INFO - closeEvent:310 - Stopping search maintenance timer... +2025-07-28 15:55:07 - newmusic.main - INFO - closeEvent:315 - Closing Soulseek client... +2025-07-28 15:55:07 - newmusic.main - INFO - closeEvent:321 - Application closed successfully +2025-07-28 15:55:37 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-28 15:55:37 - newmusic.main - INFO - main:335 - Starting NewMusic application +2025-07-28 15:55:37 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-28 15:55:37 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-28 15:55:38 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-28 15:55:38 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-28 15:55:38 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-28 15:55:38 - newmusic.main - INFO - change_page:278 - Changed to page: dashboard +2025-07-28 15:55:38 - newmusic.main - INFO - setup_media_player_connections:230 - Media player connections established between sidebar and downloads page +2025-07-28 15:55:38 - newmusic.main - INFO - setup_settings_connections:235 - Settings change connections established +2025-07-28 15:55:38 - newmusic.main - INFO - setup_search_maintenance:91 - Search maintenance timer started (every 2 minutes, keeps 200 most recent searches) +2025-07-28 15:55:38 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-28 15:55:38 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-28 15:55:43 - newmusic.plex_client - INFO - get_all_artists:425 - Found 3795 artists in Plex library +2025-07-28 15:55:46 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for _tillus: ['lo-fi house', 'Rap/Hip Hop'] +2025-07-28 15:55:47 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for !Nxght: ['Electro', 'brazilian phonk'] +2025-07-28 15:55:49 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for $ebu: ['Electro', 'phonk', 'Dance', 'drift phonk', 'Rap/Hip Hop'] +2025-07-28 15:55:50 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for $uicideboy$: ['emo rap', 'horrorcore', 'Rap', 'trap metal', 'underground hip hop', 'cloud rap', 'Rap/Hip Hop'] +2025-07-28 15:55:51 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for $uicideboy$: ['emo rap', 'horrorcore', 'trap metal', 'underground hip hop', 'cloud rap'] +2025-07-28 15:55:52 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for $YANIC: ['Electro', 'phonk', 'brazilian phonk', 'Dance', 'Soul & Funk', 'Rap/Hip Hop'] +2025-07-28 15:55:54 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Ødyssee: ['Electro', 'lo-fi beats', 'lo-fi hip hop', 'lo-fi', 'jazz beats', 'Chill Out/Trip hop/Lounge', 'Rap/Hip Hop'] +2025-07-28 15:55:55 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Ødyzon: ['Electro', 'Alternative', 'Pop', 'Dance', 'ambient', 'dark ambient'] +2025-07-28 15:55:56 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Øneheart: ['Electro', 'Pop', 'ambient', 'Rap/Hip Hop', 'Indie Pop', 'Alternative', 'Dance', 'dark ambient'] +2025-07-28 15:55:58 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Øutgrown: ['lo-fi', 'Electro', 'Alternative', 'dark ambient'] +2025-07-28 15:56:00 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for The 2 Bears: ['Electro', 'Dance', 'Pop/Rock', 'Electronic', 'Techno/House'] +2025-07-28 15:56:02 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 2.brkn: ['Indie Pop', 'Alternative', 'Rap/Hip Hop'] +2025-07-28 15:56:06 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 2Pac: ['hip hop', 'gangster rap', 'Rap', 'Pop/Rock', 'east coast hip hop', 'old school hip hop'] +2025-07-28 15:56:07 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 2Rare: ['jersey club', 'philly club', 'Rap/Hip Hop'] +2025-07-28 15:56:10 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 3d Blast: ['vaporwave'] +2025-07-28 15:56:11 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 3LAU: ['edm', 'Electronic', 'progressive house', 'dubstep'] +2025-07-28 15:56:12 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 3TEETH: ['noise rock', 'industrial', 'witch house'] +2025-07-28 15:56:13 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 3x3cute: ['techno'] +2025-07-28 15:56:15 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 4batz: ['alternative r&b'] +2025-07-28 15:56:17 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 4Scythe: ['Alternative', 'horrorcore', 'Indie Rock', 'trap metal', 'Rap/Hip Hop'] +2025-07-28 15:56:20 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 5AM: ['Electro', 'glitch', 'bass music'] +2025-07-28 15:56:22 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 5MIINUST: ['Rap/Hip Hop'] +2025-07-28 15:56:23 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 6YNTHMANE: ['Electro', 'phonk', 'brazilian phonk'] +2025-07-28 15:56:24 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 7-Pm: ['lo-fi', 'lo-fi beats', 'Rap/Hip Hop'] +2025-07-28 15:56:29 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 7vvch: ['drift phonk', 'phonk', 'Dance'] +2025-07-28 15:56:31 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 9Lives: ['Rap/Hip Hop', 'nightcore', 'hyperpop'] +2025-07-28 15:56:34 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 18FEARS: ['Electro', 'ambient', 'Alternative', 'dark ambient'] +2025-07-28 15:56:40 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 50 Cent: ['hip hop', 'Rap', 'Pop/Rock', 'Rap/Hip Hop', 'rap'] +2025-07-28 15:56:43 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 81an: ['Electro', 'phonk', 'Dance'] +2025-07-28 15:56:44 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 88rising: ['Rap', 'Pop/Rock', 'Stage & Screen', 'R&B'] +2025-07-28 15:56:52 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 1788-L: ['Electronic', 'dubstep', 'Dance'] +2025-07-28 15:56:55 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 121569: ['Electro', 'Chill Out/Trip hop/Lounge'] +2025-07-28 15:56:58 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for a-ha: ['Pop/Rock', 'new wave', 'synthpop'] +2025-07-28 15:56:59 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for A-Trak: ['Electronic', 'downtempo', 'french house', 'french indie pop'] +2025-07-28 15:57:00 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for A. G. Cook: ['Pop/Rock', 'Electronic', 'hyperpop'] +2025-07-28 15:57:01 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for A.e.r.o.: ['space music', 'Electro', 'Chill Out/Trip hop/Lounge', 'ambient'] +2025-07-28 15:57:04 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for A.L.I.S.O.N: ['Electro', 'synthwave', 'vaporwave', 'Dance', 'chillwave'] +2025-07-28 15:57:07 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for A$AP Ferg: ['Rap', 'Rap/Hip Hop', 'rap'] +2025-07-28 15:57:08 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for A$AP Rocky: ['Rap', 'rap'] +2025-07-28 15:57:22 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Abakus: ['Electro', 'Dance', 'Electronic', 'downtempo', 'Chill Out/Trip hop/Lounge', 'Rap/Hip Hop'] +2025-07-28 15:57:24 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Abe M Beats: ['Rap/Hip Hop'] +2025-07-28 15:57:25 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Abigail Washburn: ['newgrass', 'Country', 'bluegrass', 'Folk', 'americana', 'folk'] +2025-07-28 15:57:27 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Above & Beyond: ['progressive trance', 'trance', 'progressive house'] +2025-07-28 15:57:28 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Abra Cadabra: ['drill', 'grime', 'Rap', 'R&B', 'uk drill', 'Rap/Hip Hop', 'afroswing', 'uk grime'] +2025-07-28 15:57:30 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Absolute Valentine: ['synthwave', 'vaporwave'] +2025-07-28 15:57:31 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for AC/DC: ['Stage & Screen', 'Pop/Rock', 'rock', 'classic rock'] +2025-07-28 15:57:33 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Accomplice: ['dubstep', 'Rap/Hip Hop'] +2025-07-28 15:57:36 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Acedox: ['merengue', 'Rap/Hip Hop'] +2025-07-28 15:57:38 - newmusic.soulseek_client - DEBUG - get_all_searches:952 - Getting all searches with endpoint: searches +2025-07-28 15:57:38 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches +2025-07-28 15:57:38 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-28 15:57:38 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Acey: ['Electro', 'Alternative', 'Pop', 'R&B', 'African Music', 'Indie Pop', 'Rap/Hip Hop'] +2025-07-28 15:57:38 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-28 15:57:38 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"endedAt":"2025-07-27T21:28:19.7264233Z","fileCount":13,"id":"41b335b7-58a3-4201-8506-22e0954564eb","isComplete":true,"lockedFileCount":0,"responseCount":12,"responses":[],"searchText":"Tommy Cash Baba Yaga","startedAt":"2025-07-27T21:28:02.1709869Z","state":"Completed, TimedOut","token":80},{"endedAt":"2025-07-27T21:28:20.4645342Z","fileCount":5,"id":"7e66f9a9-00ac-451b-a199-5f6a7f18930c","isComplete":true,"lockedFileCount":0,"responseCount":5,"responses":[],"searchText":"Tommy Cash SugaSuga"... +2025-07-28 15:57:38 - newmusic.soulseek_client - INFO - get_all_searches:957 - Retrieved 106 searches from slskd +2025-07-28 15:57:38 - newmusic.soulseek_client - DEBUG - maintain_search_history:1058 - Search count (106) within limit (200), no maintenance needed +2025-07-28 15:57:39 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for achorda: ['Electro', 'ambient', 'Alternative', 'dark ambient'] +2025-07-28 15:57:41 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for acidcrvsh: ['Electro', 'breakcore', 'jungle', 'Dance'] +2025-07-28 15:57:45 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Adam Beyer: ['Electro', 'Dance'] +2025-07-28 15:57:49 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Adam Ford: ['Electro', 'synthwave', 'vaporwave', 'Alternative', 'chillwave', 'Indie Rock'] +2025-07-28 15:57:54 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Adeki: ['afro r&b', 'afro soul', 'Electro', 'Pop', 'afrobeats', 'afrobeat', 'afropop', 'afropiano', 'Humor', 'alté'] +2025-07-28 15:57:55 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Adekunle Gold: ['afropop', 'R&B', 'African Music', 'afrobeats', 'afrobeat', 'afropiano'] +2025-07-28 15:57:57 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Adele: ['soft pop', 'Pop/Rock'] +2025-07-28 15:58:01 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Adieu Aru: ['Electro', 'synthwave', 'vaporwave', 'Dance', 'chillwave'] +2025-07-28 15:58:02 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for ADIV CULTURE: ['brazilian trap', 'Rap/Hip Hop'] +2025-07-28 15:58:03 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Admo: ['Electro', 'synthwave', 'vaporwave', 'Dance', 'chillwave', 'Techno/House'] +2025-07-28 15:58:04 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Admo: ['Electro', 'synthwave', 'vaporwave', 'chillwave', 'Alternativo', 'Techno/House'] +2025-07-28 15:58:06 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Adrian Quesada: ['Latin', 'R&B', 'retro soul'] +2025-07-28 15:58:08 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Adrian Underhill: ['Indie Pop', 'Alternative', 'Pop', 'R&B'] +2025-07-28 15:58:14 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for aespa: ['International', 'Pop/Rock', 'k-pop'] +2025-07-28 15:58:21 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Aexion: ['Electro', 'vaporwave', 'Dance'] +2025-07-28 15:58:23 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Affectwave: ['witch house'] +2025-07-28 15:58:26 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Afrojack: ['edm', 'Electronic', 'Dance'] +2025-07-28 15:58:27 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for after noon: ['lo-fi', 'lo-fi beats', 'Rap/Hip Hop'] +2025-07-28 15:58:38 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Air: ['downtempo', 'trip hop'] +2025-07-28 15:58:39 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Air: ['Comedy/Spoken', 'Pop/Rock', 'Electronic', 'downtempo', 'trip hop'] +2025-07-28 15:58:42 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Aisha Badru: ['Electro', 'Alternative', 'Folk', 'Pop/Rock', 'Singer & Songwriter'] +2025-07-28 15:58:44 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for AiYo: ['Pop', 'R&B', 'Rap/Hip Hop'] +2025-07-28 15:58:45 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for AJ Suede: ['underground hip hop'] +2025-07-28 15:58:47 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for AK420: ['lo-fi beats', 'jazz rap', 'Rap/Hip Hop', 'jazz beats', 'boom bap'] +2025-07-28 15:58:49 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for AkaHendy: ['Dubstep', 'Electro', 'chillstep', 'Dance', 'Chill Out/Trip hop/Lounge'] +2025-07-28 15:58:50 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Akal Dub: ['Electro', 'Chill Out/Trip-Hop/Lounge', 'Techno/House'] +2025-07-28 15:58:51 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Akhmedov: ['Electro', 'phonk', 'brazilian phonk', 'Dance'] +2025-07-28 15:58:58 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Akira The Don: ['Rock', 'spoken word', 'Electro', 'Pop', 'Rap/Hip Hop'] +2025-07-28 15:58:59 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for akitakita: ['Electro', 'breakcore', 'jungle', 'Alternative', 'Dance', 'Indie Pop'] +2025-07-28 15:59:04 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Al'Tarba: ['Electro', 'Chill Out/Trip-Hop/Lounge', 'Dance', 'Rap/Hip Hop'] +2025-07-28 15:59:06 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Alan: ['Electro', 'Dance'] +2025-07-28 15:59:07 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Alan Walker: ['edm', 'Electronic'] +2025-07-28 15:59:09 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Alanis Morissette: ['Pop/Rock', 'Stage & Screen', 'Pop', 'New Age'] +2025-07-28 15:59:13 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Albee Al: ['Rap/Hip Hop'] +2025-07-28 15:59:14 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Albert Collins: ['blues rock', 'classic blues', 'blues'] +2025-07-28 15:59:15 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Alberta Cross: ['Indie Pop', 'Alternative'] +2025-07-28 15:59:16 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Alberto Droguett: ['lo-fi beats', 'lo-fi hip hop', 'lo-fi', 'jazz beats', 'Rap/Hip Hop'] +2025-07-28 15:59:19 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for alcinous: ['Electro', 'lo-fi beats', 'Alternative', 'Pop', 'lo-fi', 'Rap/Hip Hop', 'dark ambient'] +2025-07-28 15:59:24 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Alecs Delarge: ['lo-fi beats', 'jazz beats', 'Rap/Hip Hop'] +2025-07-28 15:59:25 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Alejandro Sanz: ['Pop internacional', 'italo dance', 'Pop'] +2025-07-28 15:59:29 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Alesso: ['Pop/Rock', 'Electronic'] +2025-07-28 15:59:31 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Aletta Vilkier: ['Electro', 'vaporwave', 'Alternative', 'Pop', 'Dance', 'Latin Music'] +2025-07-28 15:59:35 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Alex Boychuk: ['chillwave', 'synthwave', 'vaporwave'] +2025-07-28 15:59:38 - newmusic.soulseek_client - DEBUG - get_all_searches:952 - Getting all searches with endpoint: searches +2025-07-28 15:59:38 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches +2025-07-28 15:59:38 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-28 15:59:38 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-28 15:59:38 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"endedAt":"2025-07-27T21:28:19.7264233Z","fileCount":13,"id":"41b335b7-58a3-4201-8506-22e0954564eb","isComplete":true,"lockedFileCount":0,"responseCount":12,"responses":[],"searchText":"Tommy Cash Baba Yaga","startedAt":"2025-07-27T21:28:02.1709869Z","state":"Completed, TimedOut","token":80},{"endedAt":"2025-07-27T21:28:20.4645342Z","fileCount":5,"id":"7e66f9a9-00ac-451b-a199-5f6a7f18930c","isComplete":true,"lockedFileCount":0,"responseCount":5,"responses":[],"searchText":"Tommy Cash SugaSuga"... +2025-07-28 15:59:38 - newmusic.soulseek_client - INFO - get_all_searches:957 - Retrieved 106 searches from slskd +2025-07-28 15:59:38 - newmusic.soulseek_client - DEBUG - maintain_search_history:1058 - Search count (106) within limit (200), no maintenance needed +2025-07-28 15:59:47 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Alex Sensation: ['Rap', 'reggaeton'] +2025-07-28 15:59:48 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Alex Somers: ['Electro', 'Electronic', 'ambient', 'Pop/Rock', 'Alternativo', 'post-rock'] +2025-07-28 15:59:49 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Alex The Flipper: ['Electro', 'Pop', 'Rap/Hip Hop'] +2025-07-28 15:59:56 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Alfie-Jay Winters: ['Alternative'] +2025-07-28 16:00:01 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Algiers: ['Pop/Rock', 'Alternativo', 'post-punk'] +2025-07-28 16:00:02 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Ali Gatie: ['Pop/Rock', 'Pop', 'R&B', 'Rap/Hip Hop'] +2025-07-28 16:00:03 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Ali Whales: ['german hip hop', 'Rap/Hip Hop'] +2025-07-28 16:00:06 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Alien Cake Music: ['Pop', 'grunge', 'lo-fi', 'Film Scores', 'Alternative', 'pop punk', 'Films/Games', 'Rap/Hip Hop'] +2025-07-28 16:00:08 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Alina Baraz: ['Electro', 'Electronic', 'Dance'] +2025-07-28 16:00:13 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for alixe.: ['Electro', 'ambient', 'Alternative', 'dark ambient'] +2025-07-28 16:00:15 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for All But 6: ['cloud rap', 'emo rap', 'horrorcore', 'underground hip hop', 'trap metal', 'Rap/Hip Hop'] +2025-07-28 16:00:20 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for The All-American Rejects: ['Pop/Rock', 'emo', 'pop punk'] +2025-07-28 16:00:21 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Allan Rayman: ['Rock', 'Alternative', 'R&B', 'Rap', 'Pop/Rock', 'Indie Rock'] +2025-07-28 16:00:25 - newmusic.main - INFO - closeEvent:295 - Closing application... +2025-07-28 16:00:25 - newmusic.main - INFO - closeEvent:300 - Cleaning up Downloads page threads... +2025-07-28 16:00:25 - newmusic.main - INFO - closeEvent:305 - Stopping status monitoring thread... +2025-07-28 16:00:27 - newmusic.main - INFO - closeEvent:310 - Stopping search maintenance timer... +2025-07-28 16:00:27 - newmusic.main - INFO - closeEvent:315 - Closing Soulseek client... +2025-07-28 16:00:27 - newmusic.main - INFO - closeEvent:321 - Application closed successfully +2025-07-28 16:00:31 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-28 16:00:31 - newmusic.main - INFO - main:335 - Starting NewMusic application +2025-07-28 16:00:31 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-28 16:00:31 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-28 16:00:36 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-28 16:00:36 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-28 16:00:36 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-28 16:00:36 - newmusic.main - INFO - change_page:278 - Changed to page: dashboard +2025-07-28 16:00:36 - newmusic.main - INFO - setup_media_player_connections:230 - Media player connections established between sidebar and downloads page +2025-07-28 16:00:36 - newmusic.main - INFO - setup_settings_connections:235 - Settings change connections established +2025-07-28 16:00:36 - newmusic.main - INFO - setup_search_maintenance:91 - Search maintenance timer started (every 2 minutes, keeps 200 most recent searches) +2025-07-28 16:00:36 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-28 16:00:36 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-28 16:01:42 - newmusic.plex_client - INFO - get_all_artists:425 - Found 3795 artists in Plex library +2025-07-28 16:01:44 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for _tillus: ['lo-fi house', 'Rap/Hip Hop'] +2025-07-28 16:01:45 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for !Nxght: ['Electro', 'brazilian phonk'] +2025-07-28 16:01:47 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for $ebu: ['Electro', 'drift phonk', 'phonk', 'Dance', 'Rap/Hip Hop'] +2025-07-28 16:01:48 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for $uicideboy$: ['cloud rap', 'emo rap', 'trap metal', 'horrorcore', 'Rap', 'underground hip hop', 'Rap/Hip Hop'] +2025-07-28 16:01:49 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for $uicideboy$: ['cloud rap', 'emo rap', 'trap metal', 'horrorcore', 'underground hip hop'] +2025-07-28 16:01:50 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for $YANIC: ['Electro', 'phonk', 'brazilian phonk', 'Dance', 'Rap/Hip Hop', 'Soul & Funk'] +2025-07-28 16:01:52 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Ødyssee: ['Electro', 'lo-fi', 'lo-fi hip hop', 'Chill Out/Trip hop/Lounge', 'lo-fi beats', 'Rap/Hip Hop', 'jazz beats'] +2025-07-28 16:01:53 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Ødyzon: ['Electro', 'dark ambient', 'Alternative', 'ambient', 'Dance', 'Pop'] +2025-07-28 16:01:55 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Øneheart: ['Electro', 'Indie Pop', 'dark ambient', 'Alternative', 'ambient', 'Dance', 'Pop', 'Rap/Hip Hop'] +2025-07-28 16:01:56 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Øutgrown: ['Electro', 'lo-fi', 'Alternative', 'dark ambient'] +2025-07-28 16:01:58 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for The 2 Bears: ['Electro', 'Electronic', 'Dance', 'Techno/House', 'Pop/Rock'] +2025-07-28 16:02:00 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 2.brkn: ['Rap/Hip Hop', 'Indie Pop', 'Alternative'] +2025-07-28 16:02:04 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 2Pac: ['old school hip hop', 'gangster rap', 'Rap', 'hip hop', 'Pop/Rock', 'east coast hip hop'] +2025-07-28 16:02:05 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 2Rare: ['Rap/Hip Hop', 'jersey club', 'philly club'] +2025-07-28 16:02:07 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 3d Blast: ['vaporwave'] +2025-07-28 16:02:09 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 3LAU: ['edm', 'Electronic', 'dubstep', 'progressive house'] +2025-07-28 16:02:10 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 3TEETH: ['industrial', 'noise rock', 'witch house'] +2025-07-28 16:02:11 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 3x3cute: ['techno'] +2025-07-28 16:02:13 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 4batz: ['alternative r&b'] +2025-07-28 16:02:15 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 4Scythe: ['Alternative', 'Indie Rock', 'trap metal', 'horrorcore', 'Rap/Hip Hop'] +2025-07-28 16:02:17 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 5AM: ['Electro', 'glitch', 'bass music'] +2025-07-28 16:02:19 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 5MIINUST: ['Rap/Hip Hop'] +2025-07-28 16:02:20 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 6YNTHMANE: ['Electro', 'phonk', 'brazilian phonk'] +2025-07-28 16:02:21 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 7-Pm: ['Rap/Hip Hop', 'lo-fi', 'lo-fi beats'] +2025-07-28 16:02:25 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 7vvch: ['phonk', 'Dance', 'drift phonk'] +2025-07-28 16:02:28 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 9Lives: ['Rap/Hip Hop', 'hyperpop', 'nightcore'] +2025-07-28 16:02:31 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 18FEARS: ['Electro', 'dark ambient', 'ambient', 'Alternative'] +2025-07-28 16:02:36 - newmusic.soulseek_client - DEBUG - get_all_searches:952 - Getting all searches with endpoint: searches +2025-07-28 16:02:36 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches +2025-07-28 16:02:36 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-28 16:02:36 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 50 Cent: ['rap', 'Rap', 'hip hop', 'Pop/Rock', 'Rap/Hip Hop'] +2025-07-28 16:02:36 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-28 16:02:36 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"endedAt":"2025-07-27T21:28:19.7264233Z","fileCount":13,"id":"41b335b7-58a3-4201-8506-22e0954564eb","isComplete":true,"lockedFileCount":0,"responseCount":12,"responses":[],"searchText":"Tommy Cash Baba Yaga","startedAt":"2025-07-27T21:28:02.1709869Z","state":"Completed, TimedOut","token":80},{"endedAt":"2025-07-27T21:28:20.4645342Z","fileCount":5,"id":"7e66f9a9-00ac-451b-a199-5f6a7f18930c","isComplete":true,"lockedFileCount":0,"responseCount":5,"responses":[],"searchText":"Tommy Cash SugaSuga"... +2025-07-28 16:02:36 - newmusic.soulseek_client - INFO - get_all_searches:957 - Retrieved 106 searches from slskd +2025-07-28 16:02:36 - newmusic.soulseek_client - DEBUG - maintain_search_history:1058 - Search count (106) within limit (200), no maintenance needed +2025-07-28 16:02:39 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 81an: ['Electro', 'phonk', 'Dance'] +2025-07-28 16:02:40 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 88rising: ['Pop/Rock', 'R&B', 'Rap', 'Stage & Screen'] +2025-07-28 16:02:47 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 1788-L: ['Electronic', 'dubstep', 'Dance'] +2025-07-28 16:02:53 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for a-ha: ['Pop/Rock', 'new wave', 'synthpop'] +2025-07-28 16:02:54 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for A-Trak: ['downtempo', 'Electronic', 'french house', 'french indie pop'] +2025-07-28 16:02:55 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for A. G. Cook: ['Pop/Rock', 'hyperpop', 'Electronic'] +2025-07-28 16:02:56 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for A.e.r.o.: ['Electro', 'Chill Out/Trip hop/Lounge', 'ambient', 'space music'] +2025-07-28 16:02:59 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for A.L.I.S.O.N: ['Electro', 'chillwave', 'Dance', 'synthwave', 'vaporwave'] +2025-07-28 16:03:01 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for A$AP Ferg: ['Rap/Hip Hop', 'rap', 'Rap'] +2025-07-28 16:03:02 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for A$AP Rocky: ['rap', 'Rap'] +2025-07-28 16:03:15 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Abakus: ['Electro', 'Electronic', 'Chill Out/Trip hop/Lounge', 'Dance', 'downtempo', 'Rap/Hip Hop'] +2025-07-28 16:03:17 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Abe M Beats: ['Rap/Hip Hop'] +2025-07-28 16:03:18 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Abigail Washburn: ['Folk', 'newgrass', 'folk', 'americana', 'bluegrass', 'Country'] +2025-07-28 16:03:20 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Above & Beyond: ['trance', 'progressive house', 'progressive trance'] +2025-07-28 16:03:22 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Abra Cadabra: ['drill', 'R&B', 'afroswing', 'grime', 'uk grime', 'Rap', 'Rap/Hip Hop', 'uk drill'] +2025-07-28 16:03:23 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Absolute Valentine: ['synthwave', 'vaporwave'] +2025-07-28 16:03:25 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for AC/DC: ['Pop/Rock', 'classic rock', 'Stage & Screen', 'rock'] +2025-07-28 16:03:26 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Accomplice: ['Rap/Hip Hop', 'dubstep'] +2025-07-28 16:03:29 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Acedox: ['Rap/Hip Hop', 'merengue'] +2025-07-28 16:03:31 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Acey: ['Electro', 'Indie Pop', 'R&B', 'Alternative', 'Pop', 'African Music', 'Rap/Hip Hop'] +2025-07-28 16:03:32 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for achorda: ['Electro', 'dark ambient', 'ambient', 'Alternative'] +2025-07-28 16:03:33 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for acidcrvsh: ['Electro', 'breakcore', 'Dance', 'jungle'] +2025-07-28 16:03:37 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Adam Beyer: ['Electro', 'Dance'] +2025-07-28 16:03:41 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Adam Ford: ['Electro', 'Alternative', 'chillwave', 'Indie Rock', 'synthwave', 'vaporwave'] +2025-07-28 16:03:46 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Adeki: ['alté', 'afrobeats', 'afro soul', 'Electro', 'afropiano', 'afroswing', 'afropop', 'Películas/Juegos', 'Pop', 'afrobeat'] +2025-07-28 16:03:47 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Adekunle Gold: ['afrobeats', 'R&B', 'afropiano', 'afropop', 'afrobeat', 'African Music'] +2025-07-28 16:03:49 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Adele: ['Pop/Rock', 'soft pop'] +2025-07-28 16:03:52 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Adieu Aru: ['Electro', 'chillwave', 'Dance', 'synthwave', 'vaporwave'] +2025-07-28 16:03:53 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for ADIV CULTURE: ['Rap/Hip Hop', 'brazilian trap'] +2025-07-28 16:03:55 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Admo: ['Electro', 'chillwave', 'Dance', 'synthwave', 'Techno/House', 'vaporwave'] +2025-07-28 16:03:56 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Admo: ['Electro', 'chillwave', 'Alternativo', 'synthwave', 'Techno/House', 'vaporwave'] +2025-07-28 16:03:57 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Adrian Quesada: ['retro soul', 'Latin', 'R&B'] +2025-07-28 16:03:59 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Adrian Underhill: ['Indie Pop', 'R&B', 'Alternative', 'Pop'] +2025-07-28 16:04:05 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for aespa: ['Pop/Rock', 'k-pop', 'International'] +2025-07-28 16:04:11 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Aexion: ['Electro', 'Dance', 'vaporwave'] +2025-07-28 16:04:13 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Affectwave: ['witch house'] +2025-07-28 16:04:17 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Afrojack: ['edm', 'Electronic', 'Dance'] +2025-07-28 16:04:18 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for after noon: ['Rap/Hip Hop', 'lo-fi', 'lo-fi beats'] +2025-07-28 16:04:28 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Air: ['trip hop', 'downtempo'] +2025-07-28 16:04:29 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Air: ['trip hop', 'Electronic', 'Comedy/Spoken', 'downtempo', 'Pop/Rock'] +2025-07-28 16:04:32 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Aisha Badru: ['Electro', 'Folk', 'Singer & Songwriter', 'Alternative', 'Pop/Rock'] +2025-07-28 16:04:34 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for AiYo: ['Rap/Hip Hop', 'R&B', 'Pop'] +2025-07-28 16:04:35 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for AJ Suede: ['underground hip hop'] +2025-07-28 16:04:36 - newmusic.soulseek_client - DEBUG - get_all_searches:952 - Getting all searches with endpoint: searches +2025-07-28 16:04:36 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches +2025-07-28 16:04:36 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-28 16:04:36 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-28 16:04:36 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"endedAt":"2025-07-27T21:28:19.7264233Z","fileCount":13,"id":"41b335b7-58a3-4201-8506-22e0954564eb","isComplete":true,"lockedFileCount":0,"responseCount":12,"responses":[],"searchText":"Tommy Cash Baba Yaga","startedAt":"2025-07-27T21:28:02.1709869Z","state":"Completed, TimedOut","token":80},{"endedAt":"2025-07-27T21:28:20.4645342Z","fileCount":5,"id":"7e66f9a9-00ac-451b-a199-5f6a7f18930c","isComplete":true,"lockedFileCount":0,"responseCount":5,"responses":[],"searchText":"Tommy Cash SugaSuga"... +2025-07-28 16:04:36 - newmusic.soulseek_client - INFO - get_all_searches:957 - Retrieved 106 searches from slskd +2025-07-28 16:04:36 - newmusic.soulseek_client - DEBUG - maintain_search_history:1058 - Search count (106) within limit (200), no maintenance needed +2025-07-28 16:04:37 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for AK420: ['jazz rap', 'boom bap', 'lo-fi beats', 'Rap/Hip Hop', 'jazz beats'] +2025-07-28 16:04:39 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for AkaHendy: ['Electro', 'Chill Out/Trip hop/Lounge', 'Dance', 'chillstep', 'Dubstep'] +2025-07-28 16:04:40 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Akal Dub: ['Electro', 'Chill Out/Trip-Hop/Lounge', 'Techno/House'] +2025-07-28 16:04:41 - newmusic.main - INFO - closeEvent:295 - Closing application... +2025-07-28 16:04:41 - newmusic.main - INFO - closeEvent:300 - Cleaning up Downloads page threads... +2025-07-28 16:04:41 - newmusic.main - INFO - closeEvent:305 - Stopping status monitoring thread... +2025-07-28 16:04:43 - newmusic.main - INFO - closeEvent:310 - Stopping search maintenance timer... +2025-07-28 16:04:43 - newmusic.main - INFO - closeEvent:315 - Closing Soulseek client... +2025-07-28 16:04:43 - newmusic.main - INFO - closeEvent:321 - Application closed successfully +2025-07-28 16:04:51 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-28 16:04:51 - newmusic.main - INFO - main:335 - Starting NewMusic application +2025-07-28 16:04:51 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-28 16:04:51 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-28 16:04:51 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-28 16:04:51 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-28 16:04:51 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-28 16:04:51 - newmusic.main - INFO - change_page:278 - Changed to page: dashboard +2025-07-28 16:04:51 - newmusic.main - INFO - setup_media_player_connections:230 - Media player connections established between sidebar and downloads page +2025-07-28 16:04:51 - newmusic.main - INFO - setup_settings_connections:235 - Settings change connections established +2025-07-28 16:04:51 - newmusic.main - INFO - setup_search_maintenance:91 - Search maintenance timer started (every 2 minutes, keeps 200 most recent searches) +2025-07-28 16:04:51 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-28 16:04:51 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-28 16:04:57 - newmusic.plex_client - INFO - get_all_artists:425 - Found 3795 artists in Plex library +2025-07-28 16:04:59 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for _tillus: ['Rap/Hip Hop', 'lo-fi house'] +2025-07-28 16:05:00 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for !Nxght: ['brazilian phonk', 'Electro'] +2025-07-28 16:05:02 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for $ebu: ['phonk', 'drift phonk', 'Electro', 'Dance', 'Rap/Hip Hop'] +2025-07-28 16:05:03 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for $uicideboy$: ['horrorcore', 'emo rap', 'Rap', 'cloud rap', 'Rap/Hip Hop', 'underground hip hop', 'trap metal'] +2025-07-28 16:05:04 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for $uicideboy$: ['horrorcore', 'emo rap', 'cloud rap', 'underground hip hop', 'trap metal'] +2025-07-28 16:05:05 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for $YANIC: ['phonk', 'Electro', 'Rap/Hip Hop', 'Dance', 'brazilian phonk', 'Soul & Funk'] +2025-07-28 16:05:07 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Ødyssee: ['lo-fi', 'Chill Out/Trip hop/Lounge', 'jazz beats', 'lo-fi beats', 'Electro', 'lo-fi hip hop', 'Rap/Hip Hop'] +2025-07-28 16:05:08 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Ødyzon: ['Electro', 'ambient', 'Alternative', 'Dance', 'Pop', 'dark ambient'] +2025-07-28 16:05:09 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Øneheart: ['Indie Pop', 'Electro', 'ambient', 'Alternative', 'Dance', 'Pop', 'Rap/Hip Hop', 'dark ambient'] +2025-07-28 16:05:10 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for Øutgrown: ['lo-fi', 'Alternative', 'dark ambient', 'Electro'] +2025-07-28 16:05:13 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for The 2 Bears: ['Electronic', 'Electro', 'Dance', 'Pop/Rock', 'Techno/House'] +2025-07-28 16:05:15 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 2.brkn: ['Rap/Hip Hop', 'Alternative', 'Indie Pop'] +2025-07-28 16:05:18 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 2Pac: ['hip hop', 'gangster rap', 'Rap', 'east coast hip hop', 'Pop/Rock', 'old school hip hop'] +2025-07-28 16:05:20 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 2Rare: ['philly club', 'Rap/Hip Hop', 'jersey club'] +2025-07-28 16:05:22 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 3d Blast: ['vaporwave'] +2025-07-28 16:05:23 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 3LAU: ['dubstep', 'Electronic', 'progressive house', 'edm'] +2025-07-28 16:05:24 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 3TEETH: ['witch house', 'industrial', 'noise rock'] +2025-07-28 16:05:25 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 3x3cute: ['techno'] +2025-07-28 16:05:27 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 4batz: ['alternative r&b'] +2025-07-28 16:05:29 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 4Scythe: ['horrorcore', 'Indie Rock', 'Alternative', 'Rap/Hip Hop', 'trap metal'] +2025-07-28 16:05:31 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 5AM: ['glitch', 'bass music', 'Electro'] +2025-07-28 16:05:33 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 5MIINUST: ['Rap/Hip Hop'] +2025-07-28 16:05:34 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 6YNTHMANE: ['brazilian phonk', 'phonk', 'Electro'] +2025-07-28 16:05:35 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 7-Pm: ['lo-fi beats', 'lo-fi', 'Rap/Hip Hop'] +2025-07-28 16:05:40 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 7vvch: ['phonk', 'Dance', 'drift phonk'] +2025-07-28 16:05:42 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 9Lives: ['nightcore', 'Rap/Hip Hop', 'hyperpop'] +2025-07-28 16:05:46 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 18FEARS: ['Alternative', 'dark ambient', 'Electro', 'ambient'] +2025-07-28 16:05:52 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 50 Cent: ['rap', 'hip hop', 'Rap', 'Rap/Hip Hop', 'Pop/Rock'] +2025-07-28 16:05:55 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 81an: ['phonk', 'Dance', 'Electro'] +2025-07-28 16:05:56 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 88rising: ['R&B', 'Pop/Rock', 'Stage & Screen', 'Rap'] +2025-07-28 16:06:03 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for 1788-L: ['dubstep', 'Electronic', 'Dance'] +2025-07-28 16:06:09 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for a-ha: ['new wave', 'Pop/Rock', 'synthpop'] +2025-07-28 16:06:10 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for A-Trak: ['french house', 'Electronic', 'downtempo', 'french indie pop'] +2025-07-28 16:06:11 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for A. G. Cook: ['Pop/Rock', 'Electronic', 'hyperpop'] +2025-07-28 16:06:12 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for A.e.r.o.: ['space music', 'Chill Out/Trip hop/Lounge', 'Electro', 'ambient'] +2025-07-28 16:06:15 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for A.L.I.S.O.N: ['Electro', 'synthwave', 'Dance', 'chillwave', 'vaporwave'] +2025-07-28 16:06:17 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for A$AP Ferg: ['Rap/Hip Hop', 'rap', 'Rap'] +2025-07-28 16:06:19 - newmusic.plex_client - INFO - update_artist_genres:442 - Updated genres for A$AP Rocky: ['rap', 'Rap'] +2025-07-28 16:06:48 - newmusic.main - INFO - closeEvent:295 - Closing application... +2025-07-28 16:06:48 - newmusic.main - INFO - closeEvent:300 - Cleaning up Downloads page threads... +2025-07-28 16:06:48 - newmusic.main - INFO - closeEvent:305 - Stopping status monitoring thread... +2025-07-28 16:06:49 - newmusic.main - INFO - closeEvent:310 - Stopping search maintenance timer... +2025-07-28 16:06:49 - newmusic.main - INFO - closeEvent:315 - Closing Soulseek client... +2025-07-28 16:06:49 - newmusic.main - INFO - closeEvent:321 - Application closed successfully diff --git a/ui/pages/__pycache__/dashboard.cpython-312.pyc b/ui/pages/__pycache__/dashboard.cpython-312.pyc index a15033cf..2f87c411 100644 Binary files a/ui/pages/__pycache__/dashboard.cpython-312.pyc and b/ui/pages/__pycache__/dashboard.cpython-312.pyc differ diff --git a/ui/pages/dashboard.py b/ui/pages/dashboard.py index b673cf0a..4af881aa 100644 --- a/ui/pages/dashboard.py +++ b/ui/pages/dashboard.py @@ -15,6 +15,276 @@ import os from typing import Optional, Dict, Any from datetime import datetime from dataclasses import dataclass +import requests +from PIL import Image +import io + +class MetadataUpdateWorker(QThread): + """Worker thread for updating Plex artist metadata using Spotify data""" + progress_updated = pyqtSignal(str, int, int, float) # current_artist, processed, total, percentage + artist_updated = pyqtSignal(str, bool, str) # artist_name, success, details + finished = pyqtSignal(int, int, int) # total_processed, successful, failed + error = pyqtSignal(str) # error_message + artists_loaded = pyqtSignal(int, int) # total_artists, artists_to_process + + def __init__(self, artists, plex_client, spotify_client): + super().__init__() + self.artists = artists + self.plex_client = plex_client + self.spotify_client = spotify_client + self.should_stop = False + self.processed_count = 0 + self.successful_count = 0 + self.failed_count = 0 + + def stop(self): + self.should_stop = True + + def run(self): + """Process all artists one by one""" + try: + # Load artists in background if not provided + if self.artists is None: + all_artists = self.plex_client.get_all_artists() + if not all_artists: + self.error.emit("No artists found in Plex library") + return + + # Filter artists that need processing + artists_to_process = [artist for artist in all_artists if self.artist_needs_processing(artist)] + self.artists = artists_to_process + + # Emit loaded signal + self.artists_loaded.emit(len(all_artists), len(artists_to_process)) + + if not artists_to_process: + self.finished.emit(0, 0, 0) + return + + total_artists = len(self.artists) + + for i, artist in enumerate(self.artists): + if self.should_stop: + break + + artist_name = getattr(artist, 'title', 'Unknown Artist') + self.progress_updated.emit(artist_name, i, total_artists, (i / total_artists) * 100) + + try: + success, details = self.update_artist_metadata(artist) + self.processed_count += 1 + + if success: + self.successful_count += 1 + else: + self.failed_count += 1 + + self.artist_updated.emit(artist_name, success, details) + + except Exception as e: + self.failed_count += 1 + self.artist_updated.emit(artist_name, False, f"Error: {str(e)}") + + # Small delay to prevent overwhelming the APIs + self.msleep(500) + + self.finished.emit(self.processed_count, self.successful_count, self.failed_count) + + except Exception as e: + self.error.emit(f"Metadata update failed: {str(e)}") + + def artist_needs_processing(self, artist): + """Check if an artist needs metadata processing using smart detection""" + try: + # Check if artist has a valid photo + has_valid_photo = self.artist_has_valid_photo(artist) + + # Check if artist has genres (more than just basic ones) + existing_genres = set(genre.tag if hasattr(genre, 'tag') else str(genre) + for genre in (artist.genres or [])) + has_good_genres = len(existing_genres) >= 2 # At least 2 genres indicates Spotify processing + + # Process if missing photo OR insufficient genres + return not has_valid_photo or not has_good_genres + + except Exception as e: + print(f"Error checking artist {getattr(artist, 'title', 'Unknown')}: {e}") + return True # Process if we can't determine status + + def update_artist_metadata(self, artist): + """Update a single artist's metadata""" + try: + artist_name = getattr(artist, 'title', 'Unknown Artist') + + # Search for artist on Spotify + spotify_artists = self.spotify_client.search_artists(artist_name, limit=1) + if not spotify_artists: + return False, "Not found on Spotify" + + spotify_artist = spotify_artists[0] + changes_made = [] + + # Update photo if needed + photo_updated = self.update_artist_photo(artist, spotify_artist) + if photo_updated: + changes_made.append("photo") + + # Update genres + genres_updated = self.update_artist_genres(artist, spotify_artist) + if genres_updated: + changes_made.append("genres") + + if changes_made: + return True, f"Updated {', '.join(changes_made)}" + else: + return True, "Already up to date" + + except Exception as e: + return False, str(e) + + def update_artist_photo(self, artist, spotify_artist): + """Update artist photo from Spotify""" + try: + # Check if artist already has a good photo + if self.artist_has_valid_photo(artist): + return False + + # Get the largest image from Spotify + if not spotify_artist.get('images'): + return False + + largest_image = max(spotify_artist['images'], key=lambda x: x['width'] * x['height']) + image_url = largest_image['url'] + + # Download and validate image + response = requests.get(image_url, timeout=10) + response.raise_for_status() + + # Validate and convert image + image_data = self.validate_and_convert_image(response.content) + if not image_data: + return False + + # Upload to Plex + return self.upload_artist_poster(artist, image_data) + + except Exception as e: + print(f"Error updating photo for {getattr(artist, 'title', 'Unknown')}: {e}") + return False + + def update_artist_genres(self, artist, spotify_artist): + """Update artist genres from Spotify and albums""" + try: + # Get existing genres + existing_genres = set(genre.tag if hasattr(genre, 'tag') else str(genre) + for genre in (artist.genres or [])) + + # Get Spotify artist genres + spotify_genres = set(spotify_artist.get('genres', [])) + + # Get genres from all albums + album_genres = set() + try: + for album in artist.albums(): + if hasattr(album, 'genres') and album.genres: + album_genres.update(genre.tag if hasattr(genre, 'tag') else str(genre) + for genre in album.genres) + except Exception: + pass # Albums might not be accessible + + # Combine all genres (prioritize Spotify genres) + all_genres = spotify_genres.union(album_genres) + + # Filter out empty/invalid genres + all_genres = {g for g in all_genres if g and g.strip() and len(g.strip()) > 1} + + print(f"[DEBUG] Artist '{artist.title}': Existing={existing_genres}, Spotify={spotify_genres}, Albums={album_genres}, Combined={all_genres}") + + # Only update if we have new genres and they're different + if all_genres and (not existing_genres or all_genres != existing_genres): + # Convert to list and limit to 10 genres + genre_list = list(all_genres)[:10] + + print(f"[DEBUG] Updating genres for '{artist.title}' to: {genre_list}") + + # Use Plex API to update genres + success = self.plex_client.update_artist_genres(artist, genre_list) + if success: + print(f"[DEBUG] Successfully updated genres for '{artist.title}'") + return True + else: + print(f"[DEBUG] Failed to update genres for '{artist.title}'") + return False + else: + print(f"[DEBUG] No genre update needed for '{artist.title}' - already has good genres") + return False + + except Exception as e: + print(f"Error updating genres for {getattr(artist, 'title', 'Unknown')}: {e}") + return False + + def artist_has_valid_photo(self, artist): + """Check if artist has a valid photo""" + try: + if not hasattr(artist, 'thumb') or not artist.thumb: + return False + + thumb_url = str(artist.thumb) + if 'default' in thumb_url.lower() or len(thumb_url) < 50: + return False + + return True + + except Exception: + return False + + def validate_and_convert_image(self, image_data): + """Validate and convert image for Plex compatibility""" + try: + # Open and validate image + image = Image.open(io.BytesIO(image_data)) + + # Check minimum dimensions + width, height = image.size + if width < 200 or height < 200: + return None + + # Convert to JPEG for consistency + if image.format != 'JPEG': + buffer = io.BytesIO() + image.convert('RGB').save(buffer, format='JPEG', quality=95) + return buffer.getvalue() + + return image_data + + except Exception: + return None + + def upload_artist_poster(self, artist, image_data): + """Upload poster to Plex""" + try: + # Use Plex client's update method if available + if hasattr(self.plex_client, 'update_artist_poster'): + return self.plex_client.update_artist_poster(artist, image_data) + + # Fallback: direct Plex API call + server = self.plex_client.server + upload_url = f"{server._baseurl}/library/metadata/{artist.ratingKey}/posters" + headers = { + 'X-Plex-Token': server._token, + 'Content-Type': 'image/jpeg' + } + + response = requests.post(upload_url, data=image_data, headers=headers) + response.raise_for_status() + + # Refresh artist to see changes + artist.refresh() + return True + + except Exception as e: + print(f"Error uploading poster: {e}") + return False @dataclass class ServiceStatus: @@ -884,17 +1154,121 @@ class DashboardPage(QWidget): def toggle_metadata_update(self): """Toggle metadata update process""" - # This will be implemented with actual functionality later - # For now, just show placeholder behavior current_text = self.metadata_widget.start_button.text() if "Begin" in current_text: - # Start metadata update (placeholder) - self.metadata_widget.update_progress(True, "Sample Artist", 0, 100, 0.0) - self.add_activity_item("🎵", "Metadata Update", "Started Plex metadata update process", "Now") + # Start metadata update + self.start_metadata_update() else: - # Stop metadata update (placeholder) - self.metadata_widget.update_progress(False, "", 0, 0, 0.0) - self.add_activity_item("â¹ï¸", "Metadata Update", "Stopped metadata update process", "Now") + # Stop metadata update + self.stop_metadata_update() + + def start_metadata_update(self): + """Start the Plex metadata update process""" + if not hasattr(self, 'data_provider') or not self.data_provider.service_clients.get('plex'): + self.add_activity_item("âŒ", "Metadata Update", "Plex client not available", "Now") + return + + if not self.data_provider.service_clients.get('spotify'): + self.add_activity_item("âŒ", "Metadata Update", "Spotify client not available", "Now") + return + + try: + # Start the metadata update worker (it will handle artist retrieval in background) + self.metadata_worker = MetadataUpdateWorker( + None, # Artists will be loaded in the worker thread + self.data_provider.service_clients['plex'], + self.data_provider.service_clients['spotify'] + ) + + # Connect signals + self.metadata_worker.progress_updated.connect(self.on_metadata_progress) + self.metadata_worker.artist_updated.connect(self.on_artist_updated) + self.metadata_worker.finished.connect(self.on_metadata_finished) + self.metadata_worker.error.connect(self.on_metadata_error) + self.metadata_worker.artists_loaded.connect(self.on_artists_loaded) + + # Update UI and start + self.metadata_widget.update_progress(True, "Loading artists...", 0, 0, 0.0) + self.add_activity_item("🎵", "Metadata Update", "Loading artists from Plex library...", "Now") + + self.metadata_worker.start() + + except Exception as e: + self.add_activity_item("âŒ", "Metadata Update", f"Failed to start: {str(e)}", "Now") + + def on_artists_loaded(self, total_artists, artists_to_process): + """Handle when artists are loaded and filtered""" + if artists_to_process == 0: + self.add_activity_item("✅", "Metadata Update", "All artists already have good metadata", "Now") + else: + self.add_activity_item("🎵", "Metadata Update", f"Processing {artists_to_process} of {total_artists} artists", "Now") + + def stop_metadata_update(self): + """Stop the metadata update process""" + if hasattr(self, 'metadata_worker') and self.metadata_worker.isRunning(): + self.metadata_worker.stop() + self.metadata_worker.wait(3000) # Wait up to 3 seconds + if self.metadata_worker.isRunning(): + self.metadata_worker.terminate() + + self.metadata_widget.update_progress(False, "", 0, 0, 0.0) + self.add_activity_item("â¹ï¸", "Metadata Update", "Stopped metadata update process", "Now") + + def artist_needs_processing(self, artist): + """Check if an artist needs metadata processing using smart detection""" + try: + # Check if artist has a valid photo + has_valid_photo = self.artist_has_valid_photo(artist) + + # Check if artist has genres (more than just basic ones) + existing_genres = set(genre.tag if hasattr(genre, 'tag') else str(genre) + for genre in (artist.genres or [])) + has_good_genres = len(existing_genres) >= 2 # At least 2 genres indicates Spotify processing + + # Process if missing photo OR insufficient genres + return not has_valid_photo or not has_good_genres + + except Exception as e: + print(f"Error checking artist {getattr(artist, 'title', 'Unknown')}: {e}") + return True # Process if we can't determine status + + def artist_has_valid_photo(self, artist): + """Check if artist has a valid photo""" + try: + if not hasattr(artist, 'thumb') or not artist.thumb: + return False + + # Quick check for suspicious URLs (default Plex placeholders often contain 'default' or are very short) + thumb_url = str(artist.thumb) + if 'default' in thumb_url.lower() or len(thumb_url) < 50: + return False + + return True + + except Exception: + return False + + def on_metadata_progress(self, current_artist, processed, total, percentage): + """Handle metadata update progress""" + self.metadata_widget.update_progress(True, current_artist, processed, total, percentage) + + def on_artist_updated(self, artist_name, success, details): + """Handle individual artist update completion""" + if success: + self.add_activity_item("✅", "Artist Updated", f"'{artist_name}' - {details}", "Now") + else: + self.add_activity_item("âŒ", "Artist Failed", f"'{artist_name}' - {details}", "Now") + + def on_metadata_finished(self, total_processed, successful, failed): + """Handle metadata update completion""" + self.metadata_widget.update_progress(False, "", 0, 0, 0.0) + summary = f"Processed {total_processed} artists: {successful} updated, {failed} failed" + self.add_activity_item("🎵", "Metadata Complete", summary, "Now") + + def on_metadata_error(self, error_message): + """Handle metadata update error""" + self.metadata_widget.update_progress(False, "", 0, 0, 0.0) + self.add_activity_item("âŒ", "Metadata Error", error_message, "Now") def on_service_status_updated(self, service: str, connected: bool, response_time: float, error: str): """Handle service status updates from data provider"""