From f138824c030005ff867d302b808aa1097d4dcee8 Mon Sep 17 00:00:00 2001 From: Broque Thomas Date: Fri, 25 Jul 2025 18:25:20 -0700 Subject: [PATCH] gooder --- logs/app.log | 73 +++++++++++++++++++ ui/pages/__pycache__/artists.cpython-312.pyc | Bin 86391 -> 87384 bytes ui/pages/artists.py | 47 ++++++++---- 3 files changed, 106 insertions(+), 14 deletions(-) diff --git a/logs/app.log b/logs/app.log index 53aae633..d6919126 100644 --- a/logs/app.log +++ b/logs/app.log @@ -45912,3 +45912,76 @@ 2025-07-25 18:22:35 - newmusic.plex_client - DEBUG - search_albums:526 - Found 5 albums matching query: album='Fearless', artist='taylor swift' 2025-07-25 18:22:35 - newmusic.plex_client - DEBUG - search_albums:526 - Found 1 albums matching query: album='Live From Clear Channel Stripped 2008', artist='taylor swift' 2025-07-25 18:22:36 - newmusic.plex_client - DEBUG - search_albums:526 - Found 5 albums matching query: album='Taylor Swift', artist='taylor swift' +2025-07-25 18:24:22 - newmusic.main - INFO - closeEvent:176 - Closing application... +2025-07-25 18:24:22 - newmusic.main - INFO - closeEvent:181 - Cleaning up Downloads page threads... +2025-07-25 18:24:22 - newmusic.main - INFO - closeEvent:186 - Stopping status monitoring thread... +2025-07-25 18:24:23 - newmusic.main - INFO - closeEvent:191 - Closing Soulseek client... +2025-07-25 18:24:23 - newmusic.main - INFO - closeEvent:197 - Application closed successfully +2025-07-25 18:24:56 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-25 18:24:56 - newmusic.main - INFO - main:211 - Starting NewMusic application +2025-07-25 18:24:56 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 18:24:56 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-25 18:24:56 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 18:24:57 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 18:24:57 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-25 18:24:57 - newmusic.main - INFO - change_page:163 - Changed to page: dashboard +2025-07-25 18:24:57 - newmusic.main - INFO - setup_media_player_connections:150 - Media player connections established between sidebar and downloads page +2025-07-25 18:24:57 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-25 18:24:57 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-25 18:24:58 - newmusic.main - INFO - change_page:163 - Changed to page: artists +2025-07-25 18:25:02 - newmusic.spotify_client - INFO - get_artist_albums:452 - Retrieved 30 albums for artist 06HL4z0CvFAxyc27GXpf02 +2025-07-25 18:25:03 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-25 18:25:03 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-25 18:25:03 - newmusic.plex_client - DEBUG - search_albums:526 - Found 1 albums matching query: album='THE TORTURED POETS DEPARTMENT: THE ANTHOLOGY', artist='taylor swift' +2025-07-25 18:25:03 - newmusic.plex_client - DEBUG - search_albums:526 - Found 0 albums matching query: album='the tortured poets department the anthology', artist='taylor swift' +2025-07-25 18:25:03 - newmusic.plex_client - DEBUG - search_albums:526 - Found 0 albums matching query: album='the tortured poets department the anthology', artist='' +2025-07-25 18:25:03 - newmusic.plex_client - DEBUG - search_albums:526 - Found 2 albums matching query: album='THE TORTURED POETS DEPARTMENT', artist='taylor swift' +2025-07-25 18:25:03 - newmusic.plex_client - DEBUG - search_albums:526 - Found 0 albums matching query: album='1989 (Taylor's Version) [Deluxe]', artist='taylor swift' +2025-07-25 18:25:03 - newmusic.plex_client - DEBUG - search_albums:526 - Found 0 albums matching query: album='1989 (Taylor's Version) [Deluxe]', artist='' +2025-07-25 18:25:03 - newmusic.plex_client - DEBUG - search_albums:526 - Found 5 albums matching query: album='1989', artist='taylor swift' +2025-07-25 18:25:04 - newmusic.plex_client - DEBUG - search_albums:526 - Found 2 albums matching query: album='1989 (Taylor's Version)', artist='taylor swift' +2025-07-25 18:25:04 - newmusic.plex_client - DEBUG - search_albums:526 - Found 5 albums matching query: album='1989', artist='taylor swift' +2025-07-25 18:25:04 - newmusic.plex_client - DEBUG - search_albums:526 - Found 1 albums matching query: album='Speak Now (Taylor's Version)', artist='taylor swift' +2025-07-25 18:25:04 - newmusic.plex_client - DEBUG - search_albums:526 - Found 5 albums matching query: album='speak now', artist='taylor swift' +2025-07-25 18:25:04 - newmusic.plex_client - DEBUG - search_albums:526 - Found 1 albums matching query: album='Midnights (The Til Dawn Edition)', artist='taylor swift' +2025-07-25 18:25:04 - newmusic.plex_client - DEBUG - search_albums:526 - Found 0 albums matching query: album='midnights the til dawn edition', artist='taylor swift' +2025-07-25 18:25:04 - newmusic.plex_client - DEBUG - search_albums:526 - Found 0 albums matching query: album='midnights the til dawn edition', artist='' +2025-07-25 18:25:04 - newmusic.plex_client - DEBUG - search_albums:526 - Found 1 albums matching query: album='Midnights (3am Edition)', artist='taylor swift' +2025-07-25 18:25:04 - newmusic.plex_client - DEBUG - search_albums:526 - Found 0 albums matching query: album='midnights 3am edition', artist='taylor swift' +2025-07-25 18:25:04 - newmusic.plex_client - DEBUG - search_albums:526 - Found 0 albums matching query: album='midnights 3am edition', artist='' +2025-07-25 18:25:05 - newmusic.plex_client - DEBUG - search_albums:526 - Found 3 albums matching query: album='Midnights', artist='taylor swift' +2025-07-25 18:25:05 - newmusic.plex_client - DEBUG - search_albums:526 - Found 1 albums matching query: album='Red (Taylor's Version)', artist='taylor swift' +2025-07-25 18:25:05 - newmusic.plex_client - DEBUG - search_albums:526 - Found 5 albums matching query: album='red', artist='taylor swift' +2025-07-25 18:25:05 - newmusic.plex_client - DEBUG - search_albums:526 - Found 3 albums matching query: album='Fearless (Taylor's Version)', artist='taylor swift' +2025-07-25 18:25:05 - newmusic.plex_client - DEBUG - search_albums:526 - Found 5 albums matching query: album='fearless', artist='taylor swift' +2025-07-25 18:25:05 - newmusic.plex_client - DEBUG - search_albums:526 - Found 1 albums matching query: album='evermore (deluxe version)', artist='taylor swift' +2025-07-25 18:25:06 - newmusic.plex_client - DEBUG - search_albums:526 - Found 2 albums matching query: album='evermore', artist='taylor swift' +2025-07-25 18:25:06 - newmusic.plex_client - DEBUG - search_albums:526 - Found 2 albums matching query: album='evermore', artist='taylor swift' +2025-07-25 18:25:06 - newmusic.plex_client - DEBUG - search_albums:526 - Found 0 albums matching query: album='folklore: the long pond studio sessions (from the Disney+ special) [deluxe edition]', artist='taylor swift' +2025-07-25 18:25:06 - newmusic.plex_client - DEBUG - search_albums:526 - Found 0 albums matching query: album='folklore: the long pond studio sessions (from the Disney+ special) [deluxe edition]', artist='' +2025-07-25 18:25:06 - newmusic.plex_client - DEBUG - search_albums:526 - Found 0 albums matching query: album='folklore the long pond studio sessions from the disney special deluxe edition', artist='taylor swift' +2025-07-25 18:25:06 - newmusic.plex_client - DEBUG - search_albums:526 - Found 0 albums matching query: album='folklore the long pond studio sessions from the disney special deluxe edition', artist='' +2025-07-25 18:25:06 - newmusic.plex_client - DEBUG - search_albums:526 - Found 1 albums matching query: album='folklore (deluxe version)', artist='taylor swift' +2025-07-25 18:25:06 - newmusic.plex_client - DEBUG - search_albums:526 - Found 5 albums matching query: album='folklore', artist='taylor swift' +2025-07-25 18:25:06 - newmusic.plex_client - DEBUG - search_albums:526 - Found 5 albums matching query: album='folklore', artist='taylor swift' +2025-07-25 18:25:06 - newmusic.plex_client - DEBUG - search_albums:526 - Found 2 albums matching query: album='Lover', artist='taylor swift' +2025-07-25 18:25:07 - newmusic.plex_client - DEBUG - search_albums:526 - Found 1 albums matching query: album='Taylor Swift Karaoke: reputation', artist='taylor swift' +2025-07-25 18:25:07 - newmusic.plex_client - DEBUG - search_albums:526 - Found 0 albums matching query: album='taylor swift karaoke reputation', artist='taylor swift' +2025-07-25 18:25:07 - newmusic.plex_client - DEBUG - search_albums:526 - Found 0 albums matching query: album='taylor swift karaoke reputation', artist='' +2025-07-25 18:25:07 - newmusic.plex_client - DEBUG - search_albums:526 - Found 4 albums matching query: album='reputation', artist='taylor swift' +2025-07-25 18:25:07 - newmusic.plex_client - DEBUG - search_albums:526 - Found 1 albums matching query: album='reputation Stadium Tour Surprise Song Playlist', artist='taylor swift' +2025-07-25 18:25:07 - newmusic.plex_client - DEBUG - search_albums:526 - Found 1 albums matching query: album='1989 (Deluxe Edition)', artist='taylor swift' +2025-07-25 18:25:07 - newmusic.plex_client - DEBUG - search_albums:526 - Found 5 albums matching query: album='1989', artist='taylor swift' +2025-07-25 18:25:07 - newmusic.plex_client - DEBUG - search_albums:526 - Found 5 albums matching query: album='1989', artist='taylor swift' +2025-07-25 18:25:08 - newmusic.plex_client - DEBUG - search_albums:526 - Found 1 albums matching query: album='Red (Deluxe Edition)', artist='taylor swift' +2025-07-25 18:25:08 - newmusic.plex_client - DEBUG - search_albums:526 - Found 5 albums matching query: album='red', artist='taylor swift' +2025-07-25 18:25:08 - newmusic.plex_client - DEBUG - search_albums:526 - Found 5 albums matching query: album='Red', artist='taylor swift' +2025-07-25 18:25:08 - newmusic.plex_client - DEBUG - search_albums:526 - Found 1 albums matching query: album='Speak Now World Tour Live', artist='taylor swift' +2025-07-25 18:25:08 - newmusic.plex_client - DEBUG - search_albums:526 - Found 1 albums matching query: album='Speak Now (Deluxe Edition)', artist='taylor swift' +2025-07-25 18:25:08 - newmusic.plex_client - DEBUG - search_albums:526 - Found 5 albums matching query: album='speak now', artist='taylor swift' +2025-07-25 18:25:09 - newmusic.plex_client - DEBUG - search_albums:526 - Found 5 albums matching query: album='Speak Now', artist='taylor swift' +2025-07-25 18:25:09 - newmusic.plex_client - DEBUG - search_albums:526 - Found 0 albums matching query: album='Fearless Platinum Edition', artist='taylor swift' +2025-07-25 18:25:09 - newmusic.plex_client - DEBUG - search_albums:526 - Found 0 albums matching query: album='Fearless Platinum Edition', artist='' +2025-07-25 18:25:09 - newmusic.plex_client - DEBUG - search_albums:526 - Found 5 albums matching query: album='Fearless', artist='taylor swift' +2025-07-25 18:25:09 - newmusic.plex_client - DEBUG - search_albums:526 - Found 1 albums matching query: album='Live From Clear Channel Stripped 2008', artist='taylor swift' +2025-07-25 18:25:09 - newmusic.plex_client - DEBUG - search_albums:526 - Found 5 albums matching query: album='Taylor Swift', artist='taylor swift' diff --git a/ui/pages/__pycache__/artists.cpython-312.pyc b/ui/pages/__pycache__/artists.cpython-312.pyc index aebd6b5ee10bb6b1948c0c8d0c9232f3dd96ff6d..556a4dbcf9fc74549d0f3408dd3e2cb97b537bc2 100644 GIT binary patch delta 7114 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 delta 6417 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 xMWZMgb}8nCXyLai= 0.8: owned_albums.add(spotify_album.name) print(f"✅ Match found: '{spotify_album.name}' -> '{best_match['title']}' (confidence: {confidence:.2f})") + # Emit individual match for real-time UI update + self.album_matched.emit(spotify_album.name) else: print(f"❌ No confident match for '{spotify_album.name}' (best: {confidence:.2f})") else: @@ -1007,6 +1010,7 @@ class ArtistsPage(QWidget): # State management self.selected_artist = None self.current_albums = [] + self.matched_count = 0 self.artist_search_worker = None self.album_fetch_worker = None self.plex_library_worker = None @@ -1463,6 +1467,9 @@ class ArtistsPage(QWidget): self.current_albums = albums self.albums_status.setText(f"Found {len(albums)} albums • Checking Plex library...") + # Initialize match counter for real-time updates + self.matched_count = 0 + # Display albums immediately (without ownership info) self.display_albums(albums, set()) @@ -1505,38 +1512,49 @@ class ArtistsPage(QWidget): # Start new Plex worker self.plex_library_worker = PlexLibraryWorker(albums, self.plex_client, self.matching_engine) self.plex_library_worker.library_checked.connect(self.on_plex_library_checked) + self.plex_library_worker.album_matched.connect(self.on_album_matched) self.plex_library_worker.check_failed.connect(self.on_plex_library_check_failed) self.plex_library_worker.start() def on_plex_library_checked(self, owned_albums): - """Handle Plex library check results""" - print(f"📨 Handler started: {len(owned_albums)} owned albums") + """Handle final Plex library check completion""" + print(f"📨 Plex check completed: {len(owned_albums)} total matches") if not self.current_albums: - print("📨 No current albums, skipping update") + print("📨 No current albums, skipping final update") return - # Update the status + # Update final status message owned_count = len(owned_albums) total_count = len(self.current_albums) missing_count = total_count - owned_count self.albums_status.setText(f"Found {total_count} albums • {owned_count} owned • {missing_count} available for download") - # Update existing album cards with ownership info - print(f"🔄 Updating {self.albums_grid_layout.count()} album cards") + print(f"✅ Plex check complete: {owned_count}/{total_count} albums owned") + + def on_album_matched(self, album_name): + """Handle individual album match for real-time UI update""" + print(f"🎯 Real-time match: '{album_name}'") - updated_count = 0 + # Update match counter + self.matched_count += 1 + + # Update status text in real-time + if self.current_albums: + total_count = len(self.current_albums) + remaining_count = total_count - self.matched_count + self.albums_status.setText(f"Found {total_count} albums • {self.matched_count} owned • {remaining_count} checking...") + + # Find and update the specific album card for i in range(self.albums_grid_layout.count()): item = self.albums_grid_layout.itemAt(i) if item and item.widget(): album_card = item.widget() - if hasattr(album_card, 'album') and hasattr(album_card, 'update_ownership'): - is_owned = album_card.album.name in owned_albums - album_card.update_ownership(is_owned) - updated_count += 1 - - print(f"✅ Updated {updated_count} album cards successfully") + if hasattr(album_card, 'album') and album_card.album.name == album_name: + print(f"🔄 Real-time update: '{album_name}' -> owned") + album_card.update_ownership(True) + break def on_plex_library_check_failed(self, error): """Handle Plex library check failure""" @@ -1634,6 +1652,7 @@ class ArtistsPage(QWidget): # Clear state self.selected_artist = None self.current_albums = [] + self.matched_count = 0 self.header_search_input.clear() # Clear albums display