This commit is contained in:
Broque Thomas 2025-07-28 16:06:57 -07:00
parent 2fbbcdc954
commit 5265391ae4
6 changed files with 852 additions and 9 deletions

View file

@ -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"} {"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"}

View file

@ -414,6 +414,59 @@ class PlexClient:
logger.error(f"Error getting library stats: {e}") logger.error(f"Error getting library stats: {e}")
return {} 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: def update_track_metadata(self, track_id: str, metadata: Dict[str, Any]) -> bool:
if not self.ensure_connection(): if not self.ensure_connection():
return False return False

View file

@ -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 - 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 - 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: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

View file

@ -15,6 +15,276 @@ import os
from typing import Optional, Dict, Any from typing import Optional, Dict, Any
from datetime import datetime from datetime import datetime
from dataclasses import dataclass 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 @dataclass
class ServiceStatus: class ServiceStatus:
@ -884,17 +1154,121 @@ class DashboardPage(QWidget):
def toggle_metadata_update(self): def toggle_metadata_update(self):
"""Toggle metadata update process""" """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() current_text = self.metadata_widget.start_button.text()
if "Begin" in current_text: if "Begin" in current_text:
# Start metadata update (placeholder) # Start metadata update
self.metadata_widget.update_progress(True, "Sample Artist", 0, 100, 0.0) self.start_metadata_update()
self.add_activity_item("🎵", "Metadata Update", "Started Plex metadata update process", "Now")
else: else:
# Stop metadata update (placeholder) # Stop metadata update
self.metadata_widget.update_progress(False, "", 0, 0, 0.0) self.stop_metadata_update()
self.add_activity_item("⏹️", "Metadata Update", "Stopped metadata update process", "Now")
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): def on_service_status_updated(self, service: str, connected: bool, response_time: float, error: str):
"""Handle service status updates from data provider""" """Handle service status updates from data provider"""