From d0659e6eb84f352b358c882b06830cd4c3b07519 Mon Sep 17 00:00:00 2001 From: Broque Thomas Date: Tue, 29 Jul 2025 22:26:20 -0700 Subject: [PATCH] bug fixed --- ui/pages/__pycache__/artists.cpython-312.pyc | Bin 200261 -> 202682 bytes ui/pages/__pycache__/sync.cpython-312.pyc | Bin 229385 -> 232416 bytes ui/pages/artists.py | 39 +++++++++++++++++++ ui/pages/sync.py | 39 +++++++++++++++++++ 4 files changed, 78 insertions(+) diff --git a/ui/pages/__pycache__/artists.cpython-312.pyc b/ui/pages/__pycache__/artists.cpython-312.pyc index 31ff59e85c334304237bbc572ccd104f4e1a9a2e..a9b924f2d123bd303e0f2ad9ac86d56963bf5379 100644 GIT binary patch delta 4264 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 delta 2643 zcmZ8jX>e2571lZTNtUd|GPZ$N-UG~AxL}j z_#UsW*!KX?+OtFbpxT zv~dgcCr36UNMViFpp3qlNhh{|jk<4O3jMSW2gQt#TJ}(G>dTn|ksvm3FCM zLU#hK9)~sdiVj&I58LVLG)Pr02aW7El@d+jb%~R@y_8c}_9dh| zWI|7aC*cTBh1|(4b?6=Sa>ySH1?6u=vVLyaZT|nnyESxa5|$2@lf@1)2}P#*8q zMg44oO*>`20-0nCflcuqj&+ie3e8NSm35eFtZ-Z8qwx-*YjtRcbEKb!mHn=8U62#Q zNr_W(nf%i*$B`ql`IPIIXin=*$Mxxl_36j;*@yMnkwH%%(U++InucAN9p#^QWQ>Vd zWn%s822XRqTi-OZZEn!p*xVNIjZjy4F^F)D^fU2w-ePaf#4H#`AI`*oLY1InfO2q2 zaV&ExNMfmqb(te3Py|?v1bU$k3@i*``qO5xE2fh+nqfx0xMUi7^&V!?@^n51PA|35 zj$F>^&aHOkj|bw4oxgy%qPH)u*t8|CSUm-Vaj+D69*c?xK`s!3^R_#_1Z^$&mBl^ z6TS8_9-=Q^!QwQnTrJFZ3wTd>dsGu=6OMzsj|3Mmso_#4EhDrcl=b7$W)jtyG-O zOgcT8kFp0ruqeO#AVu-cwbMsGKtIa*4D@;tEDu*p86g})?}X6B669*?4PlzDPsG|o zm9=Qo-4~8s6lg-{Aa7&6zp25uT0}fEM$lQkIbzM<_UyKjh^6?5e)tKstqmoB>(nt1 zbKyO8!#wmF!AP(aZ-Yg>yOf8nJ0*9X0)u~;$j(?%{twsj0mu?Yy!9*{v z;S{D*-x|L9wOacwuGB$3UF_ywa>>?%dGML~^B!D*kVAjnhP^fP)cQ=U?J40t)F0)0iLCMU|6e@;&GXeVH#9Y?lJE2C+dV_xD#L^-9FB9 zA5VEFQ0+HW1o`7}P(fEuU@=sxIVbU%L{Eh3b0XMz;@4q=kRA_!mqpM4I%;4p@X>t(b3%pcNM!8{ z&e9q)8w`uo&&})@l!nB~&xMJ70^0cU2?nom!yRcq9+9(}8tUbTQ}T8CCW(Cu?eqsL zD}xpEgOw@V;qqiQ3Rclq$*gJdc@fzK0pAI@EI`a%Id&;;2F%V>NIpymD@@Q;M6=c%%}mm|qS;oh zCz@l|J{2u|sH=f!woRKJ_2{&tqE>ZD3cCmVkHI1v`vyAIDm$A3$$_UJ`|Z3wjd;tW Hd7l3RP_O}+ diff --git a/ui/pages/__pycache__/sync.cpython-312.pyc b/ui/pages/__pycache__/sync.cpython-312.pyc index 67f3a472829a635d6ebbc6110bff64f089430988..b961424d838e7e5008bee3c29ca0ec4c80930b6d 100644 GIT binary patch delta 33434 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%0DNP(~zuh%^R8{RLMD!*99y>;^6R_ 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 diff --git a/ui/pages/artists.py b/ui/pages/artists.py index 3ea8e8dc..e20706b9 100644 --- a/ui/pages/artists.py +++ b/ui/pages/artists.py @@ -2779,16 +2779,24 @@ class ArtistsPage(QWidget): if not query: self.search_status.setText("Please enter an artist name") self.search_status.setStyleSheet("color: #ff6b6b; padding: 10px;") + if hasattr(self, 'toast_manager') and self.toast_manager: + self.toast_manager.warning("Please enter an artist name to search") return if not self.spotify_client or not self.spotify_client.is_authenticated(): self.search_status.setText("Spotify not connected") self.search_status.setStyleSheet("color: #ff6b6b; padding: 10px;") + if hasattr(self, 'toast_manager') and self.toast_manager: + self.toast_manager.error("Spotify authentication required") return self.search_status.setText("🔍 Searching for artists...") self.search_status.setStyleSheet("color: #1db954; padding: 10px;") + # Show toast for search start + if hasattr(self, 'toast_manager') and self.toast_manager: + self.toast_manager.info(f"Searching for artists: '{query}'") + # Clear previous results self.clear_artist_results() @@ -2815,11 +2823,18 @@ class ArtistsPage(QWidget): if not artist_matches: self.search_status.setText("No artists found") self.search_status.setStyleSheet("color: #ff6b6b; padding: 10px;") + if hasattr(self, 'toast_manager') and self.toast_manager: + query = self.search_input.text().strip() + self.toast_manager.warning(f"No artists found for '{query}'") return self.search_status.setText(f"Found {len(artist_matches)} artists") self.search_status.setStyleSheet("color: #1db954; padding: 10px;") + # Show success toast + if hasattr(self, 'toast_manager') and self.toast_manager: + self.toast_manager.success(f"Found {len(artist_matches)} artists matching your search") + # Display artist results for artist_match in artist_matches[:10]: # Show top 10 results card = ArtistResultCard(artist_match) @@ -2833,6 +2848,10 @@ class ArtistsPage(QWidget): """Handle artist search failure""" self.search_status.setText(f"Search failed: {error}") self.search_status.setStyleSheet("color: #ff6b6b; padding: 10px;") + + # Show error toast + if hasattr(self, 'toast_manager') and self.toast_manager: + self.toast_manager.error(f"Artist search failed: {error}") def on_artist_selected(self, artist): """Handle artist selection""" @@ -2853,6 +2872,10 @@ class ArtistsPage(QWidget): """Fetch albums for selected artist""" self.albums_status.setText("Loading albums...") + # Show toast for album loading + if hasattr(self, 'toast_manager') and self.toast_manager: + self.toast_manager.info(f"Loading albums for {artist.name}") + # Clear previous albums self.clear_albums() @@ -2910,6 +2933,10 @@ class ArtistsPage(QWidget): def start_plex_library_check(self, albums): """Start Plex library check in background""" + # Show toast for Plex check start + if hasattr(self, 'toast_manager') and self.toast_manager: + self.toast_manager.info("Checking your Plex library for owned albums...") + # Stop any existing Plex worker if self.plex_library_worker: self.plex_library_worker.stop() @@ -2938,6 +2965,13 @@ class ArtistsPage(QWidget): self.albums_status.setText(f"Found {total_count} albums • {owned_count} owned • {missing_count} available for download") + # Show toast with Plex check results + if hasattr(self, 'toast_manager') and self.toast_manager: + if owned_count == 0: + self.toast_manager.info(f"No albums found in your Plex library ({total_count} available for download)") + else: + self.toast_manager.success(f"Found {owned_count} of {total_count} albums in your Plex library") + print(f"✅ Plex check complete: {owned_count}/{total_count} albums owned") def on_album_matched(self, album_name): @@ -2966,6 +3000,11 @@ class ArtistsPage(QWidget): def on_plex_library_check_failed(self, error): """Handle Plex library check failure""" print(f"Plex library check failed: {error}") + + # Show error toast + if hasattr(self, 'toast_manager') and self.toast_manager: + self.toast_manager.error("Plex connection failed - cannot check owned albums") + if self.current_albums: self.albums_status.setText(f"Found {len(self.current_albums)} albums • Plex check failed") # Display albums without ownership info diff --git a/ui/pages/sync.py b/ui/pages/sync.py index a1abd0f8..2403e17a 100644 --- a/ui/pages/sync.py +++ b/ui/pages/sync.py @@ -14,6 +14,7 @@ from core.soulseek_client import TrackResult import re import asyncio from core.matching_engine import MusicMatchingEngine +from ui.components.toast_manager import ToastType # Define constants for storage STORAGE_DIR = "storage" @@ -2042,6 +2043,12 @@ class SyncPage(QWidget): # Emit activity signal for sync start self.sync_activity.emit("🔄", "Sync Started", f"Syncing playlist '{playlist.name}'", "Now") + # Show toast notification for sync start + if hasattr(self, 'toast_manager') and self.toast_manager: + track_count = len(playlist.tracks) if hasattr(playlist, 'tracks') else 0 + if track_count > 0: + self.toast_manager.show_toast(f"Starting sync for '{playlist.name}' ({track_count} tracks)", ToastType.INFO) + # Start the worker self.thread_pool.start(sync_worker) @@ -2098,6 +2105,12 @@ class SyncPage(QWidget): if hasattr(self, 'log_area'): self.log_area.append(f"🔄 Starting sequential sync for playlist: {playlist.name}") + # Show toast notification for sequential sync start + if hasattr(self, 'toast_manager') and self.toast_manager: + track_count = len(playlist.tracks) if hasattr(playlist, 'tracks') else 0 + if track_count > 0: + self.toast_manager.show_toast(f"Starting sequential sync for '{playlist.name}' ({track_count} tracks)", ToastType.INFO) + return True def toggle_playlist_selection(self, playlist_id): @@ -2235,6 +2248,15 @@ class SyncPage(QWidget): if result.failed_tracks > 0: msg += f", {result.failed_tracks} failed" self.log_area.append(msg) + + # Show toast notification for sequential sync completion + if hasattr(self, 'toast_manager') and self.toast_manager: + playlist_item = self.find_playlist_item_widget(playlist_id) + playlist_name = playlist_item.name if playlist_item else "Unknown Playlist" + if result.failed_tracks > 0: + self.toast_manager.show_toast(f"'{playlist_name}' sync completed: {result.matched_tracks}/{result.total_tracks} tracks, {result.failed_tracks} failed", ToastType.WARNING) + else: + self.toast_manager.show_toast(f"'{playlist_name}' sync completed: {result.matched_tracks} tracks added", ToastType.SUCCESS) # **THE FIX**: Defer processing the next item to allow the event loop to catch up. # This ensures UI updates (like the status label) are processed before moving on. @@ -2262,6 +2284,12 @@ class SyncPage(QWidget): # Log error if hasattr(self, 'log_area'): self.log_area.append(f"❌ Sequential sync failed: {error_msg}") + + # Show toast notification for sequential sync error + if hasattr(self, 'toast_manager') and self.toast_manager: + playlist_item = self.find_playlist_item_widget(playlist_id) + playlist_name = playlist_item.name if playlist_id else "Unknown Playlist" + self.toast_manager.show_toast(f"Sequential sync failed for '{playlist_name}': {error_msg}", ToastType.ERROR) # **THE FIX**: Defer processing the next item to allow the event loop to catch up. if self.is_sequential_syncing: @@ -2344,6 +2372,13 @@ class SyncPage(QWidget): playlist_name = playlist_item.name if playlist_item else "Unknown Playlist" success_msg = f"Completed: {result.matched_tracks}/{result.total_tracks} tracks" self.sync_activity.emit("✅", "Sync Complete", f"'{playlist_name}' - {success_msg}", "Now") + + # Show toast notification for sync completion + if hasattr(self, 'toast_manager') and self.toast_manager: + if result.failed_tracks > 0: + self.toast_manager.show_toast(f"Sync completed: {result.matched_tracks}/{result.total_tracks} tracks added, {result.failed_tracks} failed", ToastType.WARNING) + else: + self.toast_manager.show_toast(f"Sync completed: {result.matched_tracks} tracks added to queue", ToastType.SUCCESS) # Continue sequential sync if in progress if self.is_sequential_syncing: @@ -2383,6 +2418,10 @@ class SyncPage(QWidget): playlist_name = playlist_item.name if playlist_item else "Unknown Playlist" self.sync_activity.emit("❌", "Sync Failed", f"'{playlist_name}' - {error_msg}", "Now") + # Show toast notification for sync error + if hasattr(self, 'toast_manager') and self.toast_manager: + self.toast_manager.show_toast(f"Sync failed for '{playlist_name}': {error_msg}", ToastType.ERROR) + # Continue sequential sync if in progress (even on error) if self.is_sequential_syncing: self.process_next_in_sync_queue()