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}")
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

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

View file

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