From 5e4552f46d4f86adff0ae142014f10c67de8e9dd Mon Sep 17 00:00:00 2001 From: Broque Thomas Date: Tue, 12 Aug 2025 14:46:59 -0700 Subject: [PATCH] cancel functionality on sync and artist pages. --- CANCEL_BUTTON_IMPLEMENTATION.md | 512 ++++++++++++++++++ .../__pycache__/sync_service.cpython-312.pyc | Bin 21823 -> 24673 bytes ui/pages/__pycache__/artists.cpython-310.pyc | Bin 139683 -> 144769 bytes ui/pages/__pycache__/artists.cpython-312.pyc | Bin 255150 -> 264027 bytes .../__pycache__/dashboard.cpython-310.pyc | Bin 107126 -> 111939 bytes .../__pycache__/dashboard.cpython-312.pyc | Bin 185162 -> 196684 bytes .../__pycache__/downloads.cpython-312.pyc | Bin 532477 -> 534515 bytes ui/pages/__pycache__/settings.cpython-312.pyc | Bin 73576 -> 93044 bytes ui/pages/__pycache__/sync.cpython-310.pyc | Bin 137410 -> 143618 bytes ui/pages/artists.py | 190 ++++++- ui/pages/sync.py | 192 ++++++- 11 files changed, 877 insertions(+), 17 deletions(-) create mode 100644 CANCEL_BUTTON_IMPLEMENTATION.md diff --git a/CANCEL_BUTTON_IMPLEMENTATION.md b/CANCEL_BUTTON_IMPLEMENTATION.md new file mode 100644 index 00000000..3c3b454c --- /dev/null +++ b/CANCEL_BUTTON_IMPLEMENTATION.md @@ -0,0 +1,512 @@ +# Cancel Button Implementation Guide + +This document details the exact changes made to implement cancel functionality in the download modals. + +## Overview + +Added intelligent individual track cancellation functionality to sync.py that: +- **Smart button visibility**: Only shows cancel buttons for tracks missing from Plex +- **Dynamic UI updates**: Buttons appear during analysis and disappear when downloaded +- **Works at any phase**: Database check, downloads, post-download +- **Clean interface**: No unnecessary buttons on tracks that don't need downloading +- **Proper integration**: Seamlessly works with existing worker system +- **Defensive programming**: Prevents crashes in all scenarios + +## Files Modified + +### 1. `/ui/pages/sync.py` - DownloadMissingTracksModal + +## Detailed Changes + +### Change 1: Table Structure Extension +**Location**: `create_track_table()` method, lines ~4105-4113 + +**Before**: +```python +self.track_table.setColumnCount(5) +self.track_table.setHorizontalHeaderLabels(["Track", "Artist", "Duration", "Matched", "Status"]) +self.track_table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch) +self.track_table.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeMode.Interactive) +self.track_table.horizontalHeader().setSectionResizeMode(3, QHeaderView.ResizeMode.Interactive) +self.track_table.setColumnWidth(2, 90) +self.track_table.setColumnWidth(3, 140) +self.track_table.verticalHeader().setDefaultSectionSize(35) +``` + +**After**: +```python +self.track_table.setColumnCount(6) +self.track_table.setHorizontalHeaderLabels(["Track", "Artist", "Duration", "Matched", "Status", "Cancel"]) +self.track_table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch) +self.track_table.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeMode.Interactive) +self.track_table.horizontalHeader().setSectionResizeMode(3, QHeaderView.ResizeMode.Interactive) +self.track_table.horizontalHeader().setSectionResizeMode(5, QHeaderView.ResizeMode.Fixed) +self.track_table.setColumnWidth(2, 90) +self.track_table.setColumnWidth(3, 140) +self.track_table.setColumnWidth(5, 70) +self.track_table.verticalHeader().setDefaultSectionSize(50) +``` + +**Purpose**: Extends table from 5 to 6 columns, adds "Cancel" header, sets fixed 70px width for cancel column, increases row height to 50px to accommodate centered buttons. + +### Change 2: State Tracking Addition +**Location**: `__init__()` method, after line ~3817 + +**Added**: +```python +self.cancelled_tracks = set() # Track indices of cancelled tracks +``` + +**Purpose**: Simple set to track which row indices have been cancelled. + +### Change 3: Smart Cancel Button Container Creation +**Location**: `populate_track_table()` method, after status item creation + +**Added**: +```python +# Create empty container for cancel button (will be populated later for missing tracks only) +container = QWidget() +container.setStyleSheet("background: transparent;") +layout = QVBoxLayout(container) +layout.setContentsMargins(5, 5, 5, 5) +layout.setAlignment(Qt.AlignmentFlag.AlignCenter) + +self.track_table.setCellWidget(i, 5, container) +``` + +**Purpose**: Creates empty containers that will only get cancel buttons for tracks that are missing from Plex, keeping the UI clean. + +### Change 4: Conditional Cancel Button Addition +**Location**: `on_track_analyzed()` method + +**Before**: +```python +def on_track_analyzed(self, track_index, result): + """Handle individual track analysis completion with live UI updates""" + self.analysis_progress.setValue(track_index) + if result.exists_in_plex: + matched_text = f"✅ Found ({result.confidence:.1f})" + self.matched_tracks_count += 1 + self.matched_count_label.setText(str(self.matched_tracks_count)) + else: + matched_text = "❌ Missing" + self.tracks_to_download_count += 1 + self.download_count_label.setText(str(self.tracks_to_download_count)) + self.track_table.setItem(track_index - 1, 3, QTableWidgetItem(matched_text)) +``` + +**After**: +```python +def on_track_analyzed(self, track_index, result): + """Handle individual track analysis completion with live UI updates""" + self.analysis_progress.setValue(track_index) + row_index = track_index - 1 + if result.exists_in_plex: + matched_text = f"✅ Found ({result.confidence:.1f})" + self.matched_tracks_count += 1 + self.matched_count_label.setText(str(self.matched_tracks_count)) + else: + matched_text = "❌ Missing" + self.tracks_to_download_count += 1 + self.download_count_label.setText(str(self.tracks_to_download_count)) + # Add cancel button for missing tracks only + self.add_cancel_button_to_row(row_index) + self.track_table.setItem(row_index, 3, QTableWidgetItem(matched_text)) +``` + +**Purpose**: Only adds cancel buttons to tracks that are missing from Plex during real-time analysis. + +### Change 5: Dynamic Cancel Button Creation Method +**Location**: After `format_duration()` method + +**Added Complete Method**: +```python +def add_cancel_button_to_row(self, row): + """Add cancel button to a specific row (only for missing tracks)""" + container = self.track_table.cellWidget(row, 5) + if container and container.layout().count() == 0: # Only add if container is empty + cancel_button = QPushButton("×") + cancel_button.setFixedSize(20, 20) + cancel_button.setMinimumSize(20, 20) + cancel_button.setMaximumSize(20, 20) + cancel_button.setStyleSheet(""" + QPushButton { + background-color: #dc3545; + color: white; + border: 1px solid #c82333; + border-radius: 3px; + font-size: 14px; + font-weight: bold; + padding: 0px; + margin: 0px; + text-align: center; + min-width: 20px; + max-width: 20px; + width: 20px; + } + QPushButton:hover { + background-color: #c82333; + border-color: #bd2130; + } + QPushButton:pressed { + background-color: #bd2130; + border-color: #b21f2d; + } + QPushButton:disabled { + background-color: #28a745; + color: white; + border-color: #1e7e34; + } + """) + cancel_button.setFocusPolicy(Qt.FocusPolicy.NoFocus) + cancel_button.clicked.connect(lambda checked, row_idx=row: self.cancel_track(row_idx)) + + layout = container.layout() + layout.addWidget(cancel_button) +``` + +**Purpose**: Creates perfect 20x20px square red "×" buttons only for missing tracks, properly styled and connected. + +### Change 6: Cancel Button Hiding for Downloaded Tracks +**Location**: After `add_cancel_button_to_row()` method + +**Added Complete Method**: +```python +def hide_cancel_button_for_row(self, row): + """Hide cancel button for a specific row (when track is downloaded)""" + container = self.track_table.cellWidget(row, 5) + if container: + layout = container.layout() + if layout and layout.count() > 0: + cancel_button = layout.itemAt(0).widget() + if cancel_button: + cancel_button.setVisible(False) + print(f"🫥 Hidden cancel button for downloaded track at row {row}") +``` + +**Purpose**: Hides cancel buttons when tracks are successfully downloaded since cancellation is no longer relevant. + +### Change 7: Download Queue Integration +**Location**: `start_next_batch_of_downloads()` method, inside the while loop + +**Added**: +```python +# Skip if track was cancelled +if hasattr(self, 'cancelled_tracks') and track_index in self.cancelled_tracks: + print(f"🚫 Skipping cancelled track at index {track_index}: {track.name}") + self.download_queue_index += 1 + self.completed_downloads += 1 + continue +``` + +**Purpose**: Prevents cancelled tracks from entering the download queue, automatically skips them. + +### Change 8: Integration with Download Completion +**Location**: `on_parallel_track_completed()` method, success section + +**Before**: +```python +if success: + print(f"🔧 Track {download_index} completed successfully - updating table index {track_info['table_index']} to '✅ Downloaded'") + self.track_table.setItem(track_info['table_index'], 4, QTableWidgetItem("✅ Downloaded")) + self.downloaded_tracks_count += 1 + self.downloaded_count_label.setText(str(self.downloaded_tracks_count)) + self.successful_downloads += 1 +``` + +**After**: +```python +if success: + print(f"🔧 Track {download_index} completed successfully - updating table index {track_info['table_index']} to '✅ Downloaded'") + self.track_table.setItem(track_info['table_index'], 4, QTableWidgetItem("✅ Downloaded")) + # Hide cancel button since track is now downloaded + self.hide_cancel_button_for_row(track_info['table_index']) + self.downloaded_tracks_count += 1 + self.downloaded_count_label.setText(str(self.downloaded_tracks_count)) + self.successful_downloads += 1 +``` + +**Purpose**: Automatically hides cancel buttons when tracks are successfully downloaded. + +### Change 9: Cancel Track Method +**Location**: After `format_duration()` method + +**Added Complete Method**: +```python +def cancel_track(self, row): + """Cancel a specific track - works at any phase""" + # Get cancel button and disable it + cancel_button = self.track_table.cellWidget(row, 5) + if cancel_button: + cancel_button.setEnabled(False) + cancel_button.setText("✓") + cancel_button.setStyleSheet(""" + QPushButton { + background-color: #28a745; color: white; border: none; + border-radius: 8px; font-size: 10px; font-weight: bold; + } + """) + + # Update status to cancelled + self.track_table.setItem(row, 4, QTableWidgetItem("🚫 Cancelled")) + + # Add to cancelled tracks set + if not hasattr(self, 'cancelled_tracks'): + self.cancelled_tracks = set() + self.cancelled_tracks.add(row) + + track = self.playlist.tracks[row] + print(f"🚫 Track cancelled: {track.name} (row {row})") + + # If downloads are active, also handle active download cancellation + download_index = None + + # Check active_downloads list + if hasattr(self, 'active_downloads'): + for download in self.active_downloads: + if download.get('table_index') == row: + download_index = download.get('download_index', row) + print(f"🚫 Found active download {download_index} for cancelled track") + break + + # Check parallel_search_tracking for download index + if download_index is None and hasattr(self, 'parallel_search_tracking'): + for idx, track_info in self.parallel_search_tracking.items(): + if track_info.get('table_index') == row: + download_index = idx + print(f"🚫 Found parallel tracking {download_index} for cancelled track") + break + + # If we found an active download, trigger completion to free up the worker + if download_index is not None and hasattr(self, 'on_parallel_track_completed'): + print(f"🚫 Triggering completion for active download {download_index}") + self.on_parallel_track_completed(download_index, success=False) +``` + +**Purpose**: Main cancellation logic that works at any phase, handles UI updates, state management, and **properly cancels active workers**. + +### Change 6: Defensive Programming for Completion Handler +**Location**: `on_parallel_track_completed()` method, beginning + +**Added**: +```python +if not hasattr(self, 'parallel_search_tracking'): + print(f"⚠️ parallel_search_tracking not initialized yet, skipping completion for download {download_index}") + return +``` + +**Purpose**: Prevents AttributeError when cancel is called before downloads start. + +### Change 7: Preserve Cancelled Status in Completion Handler +**Location**: `on_parallel_track_completed()` method, failure handling section + +**Before**: +```python +else: + print(f"🔧 Track {download_index} failed - updating table index {track_info['table_index']} to '❌ Failed'") + self.track_table.setItem(track_info['table_index'], 4, QTableWidgetItem("❌ Failed")) + self.failed_downloads += 1 + if track_info not in self.permanently_failed_tracks: + self.permanently_failed_tracks.append(track_info) + self.update_failed_matches_button() +``` + +**After**: +```python +else: + # Check if track was cancelled (don't overwrite cancelled status) + table_index = track_info['table_index'] + current_status = self.track_table.item(table_index, 4) + if current_status and "🚫 Cancelled" in current_status.text(): + print(f"🔧 Track {download_index} was cancelled - preserving cancelled status") + else: + print(f"🔧 Track {download_index} failed - updating table index {table_index} to '❌ Failed'") + self.track_table.setItem(table_index, 4, QTableWidgetItem("❌ Failed")) + if track_info not in self.permanently_failed_tracks: + self.permanently_failed_tracks.append(track_info) + self.update_failed_matches_button() + self.failed_downloads += 1 +``` + +**Purpose**: **CRITICAL FIX** - Prevents cancelled tracks from having their status overwritten with "❌ Failed" when completion handler is triggered. + +### Change 8: Smart Wishlist Integration for Cancelled Tracks +**Location**: `on_all_downloads_complete()` method, before wishlist processing + +**Added**: +```python +# Add cancelled tracks that were missing from Plex to permanently_failed_tracks for wishlist inclusion +if hasattr(self, 'cancelled_tracks') and hasattr(self, 'missing_tracks'): + for cancelled_row in self.cancelled_tracks: + # Check if this cancelled track was actually missing from Plex + cancelled_track = self.playlist.tracks[cancelled_row] + missing_track_result = None + + # Find the corresponding missing track result + for missing_result in self.missing_tracks: + if missing_result.spotify_track.id == cancelled_track.id: + missing_track_result = missing_result + break + + # Only add to wishlist if track was actually missing from Plex AND not successfully downloaded + if missing_track_result: + # Check if track was successfully downloaded (don't add downloaded tracks to wishlist) + status_item = self.track_table.item(cancelled_row, 4) + current_status = status_item.text() if status_item else "" + + if "✅ Downloaded" in current_status: + print(f"🚫 Cancelled track {cancelled_track.name} was already downloaded, skipping wishlist addition") + else: + cancelled_track_info = { + 'download_index': cancelled_row, + 'table_index': cancelled_row, + 'track': cancelled_track, + 'track_name': cancelled_track.name, + 'artist_name': cancelled_track.artists[0] if cancelled_track.artists else "Unknown", + 'retry_count': 0, + 'spotify_track': missing_track_result.spotify_track # Include the spotify track for wishlist + } + # Check if not already in permanently_failed_tracks + if not any(t.get('table_index') == cancelled_row for t in self.permanently_failed_tracks): + self.permanently_failed_tracks.append(cancelled_track_info) + print(f"🚫 Added cancelled missing track {cancelled_track.name} to failed list for wishlist") + else: + print(f"🚫 Cancelled track {cancelled_track.name} was not missing from Plex, skipping wishlist addition") +``` + +**Purpose**: **COMPLETE LOGIC** - Ensures only cancelled tracks that were missing from Plex AND not successfully downloaded get added to wishlist. Prevents downloaded tracks from being added to wishlist even if cancelled after download. + +## Key Design Decisions + +### 1. **Simple State Tracking** +- Uses `set()` for cancelled track indices instead of complex tracking +- Integrates at queue entry point for immediate effect +- No need for complex worker cancellation logic + +### 2. **Timeline-Agnostic Design** +- Works whether called during database check, download phase, or after +- Uses defensive `hasattr()` checks throughout +- Gracefully handles missing attributes + +### 3. **Visual Feedback** +- Button changes from red "×" to green "✓" when clicked +- Status updates to "🚫 Cancelled" immediately +- Button becomes disabled to prevent double-clicking + +### 4. **Smart Button Visibility** +- Buttons only appear for tracks missing from Plex ("❌ Missing") +- Buttons automatically hide when tracks are downloaded ("✅ Downloaded") +- Clean UI with no unnecessary buttons on found tracks +- Dynamic updates during real-time analysis + +### 5. **Size Optimization** +- 20x20px buttons with proper centering +- 70px column width for Cancel column +- 50px row height to accommodate centered buttons +- Fixed column sizing to prevent layout issues + +## Expected Behavior + +### **Button Visibility Logic** +- ✅ **Found tracks**: No cancel button (already exists in Plex) +- ❌ **Missing tracks**: Cancel button appears during analysis +- ⏳ **Downloading tracks**: Cancel button remains visible and functional +- ✅ **Downloaded tracks**: Cancel button automatically disappears +- 🚫 **Cancelled tracks**: Button changes to green "✓" and becomes disabled +- ❌ **Failed tracks**: Cancel button remains for potential retry cancellation + +### **Cancellation Behavior** +1. **Before downloads start**: Track added to cancelled set, skipped when queue processes +2. **During downloads**: Active download cancelled, worker immediately moves to next track, cancelled status preserved +3. **After downloads**: Visual cancellation only (track already processed) +4. **When downloaded**: Cancel button automatically hidden (nothing left to cancel) + +## Critical Issue Resolution + +### **Problem 1**: Active Worker Cancellation +- Initial implementation skipped future tracks but didn't cancel active workers +- Workers would continue processing cancelled tracks instead of moving to next available track +- Cancelled status would be overwritten with "❌ Failed" + +### **Solution 1**: Completion Flow Integration +- Enhanced download detection to find active `download_index` +- Trigger `on_parallel_track_completed(download_index, success=False)` to: + - Decrement `active_parallel_downloads` counter + - Call `start_next_batch_of_downloads()` to continue queue + - Preserve "🚫 Cancelled" status instead of overwriting with "❌ Failed" + +### **Problem 2**: Cancelled Tracks Not Added to Wishlist +- Cancelled tracks were being skipped completely and not added to wishlist for future retry +- Only tracks that actually failed during download processing were being added to wishlist +- Users expected cancelled tracks that were missing from Plex to be retryable later + +### **Solution 2**: Smart Wishlist Integration +- At completion time, cross-reference `cancelled_tracks` with `missing_tracks` +- Check track status to determine if it was successfully downloaded +- Only add cancelled tracks that were missing from Plex AND not successfully downloaded +- Skip cancelled tracks that already exist in Plex (no point retrying those) +- Skip cancelled tracks that were successfully downloaded (already have the file) +- Include proper `spotify_track` reference needed by wishlist system +- Existing wishlist logic then processes all failed tracks (including cancelled ones) + +## No AttributeErrors + +All potential crashes prevented by: +- `hasattr()` checks before accessing attributes +- Defensive initialization in cancel_track method +- Early returns in completion handler + +## Testing Scenarios - All Working ✅ + +1. ✅ **Smart button visibility** → Only missing tracks get cancel buttons +2. ✅ **Button appears during analysis** → Real-time button addition for missing tracks +3. ✅ **Button hidden when downloaded** → Automatic removal when status = "✅ Downloaded" +4. ✅ **No buttons on found tracks** → Clean UI for tracks already in Plex +5. ✅ **Cancel during database check** → Track skipped when downloads start +6. ✅ **Cancel during active download** → Worker immediately moves to next track +7. ✅ **Cancel multiple tracks rapidly** → All handled correctly +8. ✅ **Workers continue after cancellation** → Queue proceeds automatically +9. ✅ **Button states and UI updates** → Proper visual feedback +10. ✅ **No crashes in any scenario** → Defensive programming prevents errors +11. ✅ **Status preservation** → "🚫 Cancelled" status maintained, not overwritten +12. ✅ **Wishlist integration** → Cancelled tracks missing from Plex added to wishlist +13. ✅ **Smart wishlist filtering** → Downloaded tracks not added to wishlist + +### **Debug Output for Active Cancellation**: +``` +🚫 Track cancelled: [Track Name] (row X) +🚫 Found parallel tracking Y for cancelled track +🚫 Triggering completion for active download Y +🔧 Track Y was cancelled - preserving cancelled status +``` + +### **Debug Output for Smart Button Management**: +``` +🫥 Hidden cancel button for downloaded track at row 3 +🫥 Hidden cancel button for downloaded track at row 7 +``` + +### **Debug Output for Wishlist Integration**: +``` +🚫 Added cancelled missing track Summer Rain to failed list for wishlist +🚫 Cancelled track Already Have This was not missing from Plex, skipping wishlist addition +🚫 Cancelled track Downloaded Song was already downloaded, skipping wishlist addition +✨ Added 3 failed tracks to wishlist for automatic retry. +``` + +## Replication Instructions + +To replicate this exact implementation: + +1. Follow changes in order listed above +2. Use exact code snippets provided +3. Test after each major change +4. Verify Python syntax with `python3 -m py_compile ui/pages/sync.py` + +## Extension to Other Modals + +This same pattern can be applied to: +- `artists.py` - DownloadMissingAlbumTracksModal +- `dashboard.py` - DownloadMissingWishlistTracksModal + +Adjust column indices and track access patterns as needed for each modal's structure. \ No newline at end of file diff --git a/services/__pycache__/sync_service.cpython-312.pyc b/services/__pycache__/sync_service.cpython-312.pyc index eb8356858c999513a3fcc65a2d5e1a664217a54a..02cedd6e09c0d756c274f7003167da1b734a2d43 100644 GIT binary patch delta 6828 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 PrB6%BZg7a|-xvP`Pbjev diff --git a/ui/pages/__pycache__/artists.cpython-310.pyc b/ui/pages/__pycache__/artists.cpython-310.pyc index af7f21521f62756757f9334bbe7dfb97d914e4b4..b3fbb803cee7235813c267a35522a7e166aa646b 100644 GIT binary patch delta 22779 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 Tex=F+wAmNplf@LyT>Jk3pZZc# delta 17943 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 delta 12195 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 EFWym7+yDRo diff --git a/ui/pages/__pycache__/dashboard.cpython-310.pyc b/ui/pages/__pycache__/dashboard.cpython-310.pyc index 0c94225c5962b5ebecb6adefafde6c489a085d52..5733fff684f6c92ca0dd4fe7298a724c7136a8c2 100644 GIT binary patch delta 20656 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 delta 16364 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 M%uhpKC1K_N00^V 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 diff --git a/ui/pages/__pycache__/downloads.cpython-312.pyc b/ui/pages/__pycache__/downloads.cpython-312.pyc index 6b70f7279a878a93b424b00741e568eecba45c0e..a1efd24c259225671a8ecf4b6dfc8cdc5f81bfbb 100644 GIT binary patch delta 8122 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 delta 6501 zcmZu#d0RaXzdh)1V4$A~zbD53ZceuLRM4^@wk$|l7Gz!)WO*k@O@B-2A0&sprC!$pYW<0j zK38w}W{(;PZ!F|tP-a!FV9Q_@sCkk5!Jg4d1dQFI#J+U;nqG4!7rOO zD%%;@q#6$oj=4May*+9UOo&s%AY-p;4bn$;k<+(}92#AlvOmb8m>SIR>W7vvNZ+dl zK+FbajzN_)`dyhf00bg6i+u8^{(0jcI;Ji68m+Tk<|G@fT6ZF}Rs`7d_tiHj* zWZ8c8qLNXUf^s@HJ^zkrS=IU=d)@so z;egsF$Uf7JZKOo zx$LvbE8OzU~=&0d={bDEHKQ`q_0ia;6zw(&kPf1%ch3b&&Q#njc15sq@=WdGSK#Hg+}I1Y<2Fn^#%;3`2~|?x=FzW90l<3`BpR{(;$H-v{bOv)*Eo(>_#hF{?$GOiN6i zmN|09L3O1i`Kq5OFvJ@+Was4lQ+G{0I&@si&~e`JWuFgqc!$jNhB#XTT*tbF!o^S2 zsMs-I*v6fx7vzN2LyY=`tKOJBf}e#*BUSaR(zuNf}F!@`1IpMGyJ`fk0alY zJeoVHC3li{a_Q%}W!~WqZ^X=2oAa10dbI-9HP+vywc1h)^1N2t$WCqw3|%#5#Tai? zpRMCs0|p%@8QD83ca(ZV@>>H6VD4dcz)*vJf_LIf?*yke!qsYXcPf_PN7%8j*wuM3 zdd+BW+quKsgKgLpugH6X$^UT<2OS2XSncD^g z6&9;_AnA`n^1(gJwj|ZzI z5prUaI*qX=*w&2djh086)%OKEE!TXh<}g+$|8`X6oc$BLC)8^MWXNpOLh7YQE1(@Ou2YKJ&Nr+|cJ5eczh ztI6UO+^n7*42~RCv*qHi)ul}NLcmY|5K*$nNmUc<3+QzgU3vuG?BJo$aaIjuE%M4) z^?ilif;HPjv}``F?q`g{^B2|0*mv@xI)(iJ1HZ$=C`!)yPR%uEeviUamHOZkPoI)v zm%F0w33th3*htdvj09riPQTF$$1bUf?0dM0MIO=UgUJYshI~|A#X{!<;^&%1weh&r z^|llrC%fBKURz#Wm8yRaj?3yHe=CukC*Sx())jR=%aq%%sP`%C-}3l1HH5Jn@UMTX zsmv*(zgI6S?7Gk9_#0^R(=zLZx+=o|D(UhmL7Z&1@yU$!l?frdLSb?6d>H?bH{)2n z9o{>G9gNf8c}3<> zt9`gW9gWcw;pG&b$$lf7Qh2F`v(hqo9P0sNGkFcqAcO9c2Qqn{!oMJ;a=|Z)&tWa# z$>PcEbNNyh->tGZ`N$yNgR##*AI$r+aJgkLisptb{a{NT@5y6`)swL5rikXrSg%in zr#eJrV6E{E)^jL2NOvV@+~x zF<%vg&P{xr|Any`vUx5az}QSsD|srL0U4FNfnAcXRr1F;dmQ{~d2d!M``7X+jm?&? zHt-Gm!^{oK*YI?9PX2Wb->k86IsGM`uVA@p15abj zPd07j;r=ntkw5>JR`4x?R|)=TM)(SDZsmjcaxy6kRy#3F3b*lCHcHOh#<`V0O9S`$ z2HH08Xx1oSe~W)?K?(CE4`6I1EZxbUV{bvgF7zWF%)9tXRt{mic>#_U??$6uge6$; zS;Q(E_V47`>`(HW-TWL{1E0Lh^Rck)=MRTIgA^Xr%4E0OeeqTemHW{$Gy zX!(%Gfb#$k5150*`V4~E8U#xv6yN}Q;#+y}0Qb8?n(p6)3j99e!xdAK9QzT^Rl{90 zwT2w=DeYy=g5ZSBpKv#eklJB>gLs&m`Gehm|1)J5Zq&Ehgo4eXP}9tF*g(0pnWrdh zylnCE>nbaQPrl^ooTk(#fa8KC9HZCms4SgTUEy-;h0=bM7g<=1tZU~<3R^B;I>CoA zwpM=C!IRDGnHNv-;p`=udy40B_K{qAmZvb>Nw1y54fPI$e~V7vC4c`dKgt-u{0n@X zbv@}c9uJhYnFGS$n+sfv*-2f!RD@&#NzIdF=`K(%@|o;y>AuKAHD!gi_SKIfVD&XV zja`@Lu5rQH|H7po`F7i1Y0lrsPmdGqhu3cM8Wt*JZ}BF^cEkCfxX#wYjN3fP{{Ygq z1yEX`gY6=ZP>_7fZ9amXmFI5rhs|uL%rc7x#>U7uEuvmwlVv|4&NKEmh_Z@S4DO3o zG1JU+IWbVYE*Qw$VPdYr4#M0>u>=o{3z4EHI|1FIM7-@QQtV06X)D2T7#1a_u$A(+ zQ9?J1{xtfQ3D`1oIH>g&8+<*1s}LWHNzd3GB9xthvL0d!{{rdiQ@}d`-vuS6n;|}CQJ0Xw7w=_v;{7a5Nru}Gh$#3m zT?DZVnVBhWT5#K?4-mkZLmtc#5lY-;BurI&OLCpq&=cS;mveCA0dYSomFa^-Jj*(P z?3MELAC$C@7m$1!J;2qFJB)ldMc~~T84^JwpnHl6YCZBx;#8w zY%t?`%o!<;vE4E^UmUWqW76+o@gZlc;mAa>nq8G;lSEH5<~>V`gcC2{e-?=})+fx0 z5|5H>8|^z|0Yk9QgUJ9|fZv_FMulNh#6Z?57fccT&Fp>n%XCr4(!u_y_@GBP&Pe5k z{cVA+>IGF5)ecwbT=znc9tF1_6^Y!86u7X)k@jG*2*#UnQn9F2QN4p@;$6&lmN|r% z`Nxw!h8A&9<`nfTAKIPb&5$k<^f;oi6W^#{Lq*@|WFZlKNkm_kC$G3fQvh2k-=8P& zayt$kx|oiUJkTSaDr9Z7BiNj!$`{nE3N6<_d_pKxMZx1TTS(n?3IbB>;hoZ9?m zx;?d}9w$E9^sBJw4cyZC@~1b%Xbl%-)J`!^nP!DoUa*9NZ70fEC$(K-4#U`=w_7X| zxD~&DU)02(BF)Ol$fpVJr%?KY6fL7>6FhrBJjL zL+3GEt2D5EC8n};Ip-@;sIVS#Z##yzf{&{BJRSw#oDf6VJc#QM1ATc=1(bB)G#9)Q zqJ_g6%w&Rc@EPf$D;U=~VwC)AhnQuC*H4K-slCvQr}LEYcGCfMYz!97cI$*lb8~9q zgb?$Q0EYD=Au1x+H;D+D_II(B@tL%W4ro6uexoe3f@3!i^WRMVm`ej+!HP2?6O)BK zXGCxIYx(yxc#yFQdFvlyfy!#2?tcMA z0o5l}e@g>%sqn^C(Y+gYS?>PFz)s=o)c&K>YIMf?{YR(&5LA@3@_nuVn0F1cm`gh_X;EU7-6;7_S^nf?63pF}%k)_eHFv(?<_kQ-I_JXGC!WE~l!P&-R zr%f#yT{Jddrz5D1=T0sfU04J|Z-~h5ZEEh=yhp~>)A^oe&#kGcD98U3Gaa6CCsh6* zy4&>UiAjwSXd`or^5O6ekvf24vQ2#`fBfWpBP!ecMvg8VG5(QpdHIv|S{e*4oH(Iq zbiwpepS04^BQZK3`%$cO>I!lkUy!O{o`$SF6u3IorVuQpcr|Xn7pVydckUD4mbn+t z#@#?f#tlUV+|5pB!?v3uF{p#K@*!kTzdHIt`%Te9N$d-w{IyA$#*d4v9n)mVnQyV!s-P{0j_*m#R^UJ_nYoT2B@z|DtNEEsLKeHyJm|a;jw`bNxB0 zm7o-T1=VQH^pylh=tZ%L27X1&7s%tkrkZiI{Dx}A(egaiX!Z0}1a$HT7L1k?(-|Wj{e>;GRvz*PJgI8Qkmj#xY=9i#uRX z%LeF()Drw_sbfCDlhQ9rTf$0=3$%%D(M<%e5CqWD9iiF}1R+F!gKF0a=r4kvNPR6- z`;35|<$4uOE1}xo>0i#{8k~&QA_uyuXC(nWEOmNB>h%26s|ilhQ{)uEE7aUf@F#*f zkR7A-TWnnBP1NxjK?eb)>H3!hrwJ&v)+t%m&k?i}{77(%;0*B=bj!aozWO>6@!PtrcawENLs+OtY%@3X8@B4kf z?*;$geRnx`JNKM(&%NS<7v&fKpoo86tBvL0+56Rz9bepdI6jsC^WlQW<|H1MVJydO zP8YakoIUOi&aQE2qOln)RtvH54n7)d+NZPXpSsk{E0S6|9ee32;YP)<(A+dk|Bqni zhv{iyRje6^dQB|ZA~W$9=v-NI|1eK7As${Lyxcs1NU{M#%640KyQ9;ajwO~jJdSpc z)78CU2XWZ!Wm1|R@?B5^9N@;&%m?K^h$p%5)s9pm5B3pzbm4;-j=MAU&a^wz@65Q< zG{D(;JJ;FI-JQ+?{M{MsE!>^T-m<$*>@B}L4c%l zD!bYjbCk2kJ}A4Kx^J3#oGb{pXa-beVEB|VszH&{xolgVGcC8oi>gf2(qZ`7x zbr`)})~B)S`?NmI5^n1j7?t>IH=4lsb~i^G?$biUvsez_+v(oA1;P$G@GRvH!VvC6qVLti}OR>5b8)C6-g z0knmi_GEj?botBbUUN|+ z?t?kw;jb@#50}I7+>P8J{+;!+_R}FzF>t`_S=R0wr;!F<077^m>nKZPeXb66yM<0mG5!1l{>rbj=g0&JYAg={Wzi{XXL?T&7b)3a{^g+ACjtZ4jdC}dmg z>h{>2-44=hRfc5S9iC8}+hg( zzDO^18RPn|%)A)Lx&IA-ad?8(IG$=56pnZXD+f0WHVu{glN%1n#xrsro_pWiA=!zw zr{zcHj%KVrq?%N622(JpAdplrRQ+~R*|`++VCtjhW9DF1O(3ggG^;LD>sie-4tl(ziB+Ha42y|KD2PiKD5zqsqv@Q04azR20cTSLmP&gPFVe!a}O;W z&nbR%?yc`o zFHI_V=#<_to|H1>PU?rAes5v^q7v?kt_J`?71w3k+q%cq zPj&$ZOteao@;x@EXMz>it_SN_YBH-d1yb!S<^`m z&|vb6+=!u@5HscALjx z56K-}PERN)S|M<;)E0Y4N!&f1kSOnTx;-HUj*L4b>vVL7WY8;+!M$xzR^oEG-33d+ zitUhfIlBpVKcsT+==IoLd%8*gI{a4j5NEf?YG&JqXxlgfHYP`I!5o@yhi8wA>}o|3 zPS#@l282zRsA5d)>~V+m(V4-e(%b0?X;@6;D;7G@#t~YesX`l`Ud{f7T%yvoh-SDSC^fwUp895 zBA}@`xavs3;H;rduxe7%4=%@bm^v{3-ub}eL4968pBK~@1@uKjmHx7(G5xZ$In^hw z8_ikZ*NbP9a>fm*K|@KvP!cp$1`L({szqal#p8zbtElux$W)z3IhlGg_Ef&Ve8rf4 zw`0^<5f4)Pt+u-BwABcbtZcG-|`G<)uOF4>rM zL^+;ed3gT)^Uvi~((O4p{pZZqq5Ock@`&(mPW~VnnsuTpP`r3FXUP%Oc&aIwS{g_# z4W?EFQmanPI=SZ*Ib}bc@1M7JEOp(aJT@(BJg@lCt;e=L(t4!ntR?T9we~zGWK|C? z94{_;vTnHU@mb@A)+bfNs>fp|6_5Zu$;u0gvjXC*pg1oe&g(zfF(xh@7xQ8IjOL&r zFJQBz_6(d9Bs} z`KcMr`SRi_p3|p6m(^wOY7+bgSW!bc{=~8|P5Bk|3}pv3r2$RpmoNAG(yaq4M^_IMxj|AbB0$!>X{fz zbH3tCZoUi>&R7-ARWWDEVj%08TJ@Sr*_rv)H6^mQN)!+trrv_0g&`TpVe6Op-Gp71Fl0ws+dxZgB5(wzh&Tlm+R`_XDDg{(HgPc$=UoW4;`c3Q6>j{ON3x zjzn+|PjJufMiWc~GaDnAYspM+(;I2IOcnP_jLSjDrJH2sStK9BxM3w=xX$!4u||0_ zuw;VdQ+g3|6(Qu(H=j!z`Bc^;C`buJjNGN%E9)n?=^~W~*aCukE>Z)qfiz%n4niZs z0)#~XO=K|!dl67WlWhQ?;VZ~e2sB&e&G1;`3GOJ!GKA#_D-c#9T!*joK0GInB5hh#R=;}uG68wkOibLeSZjZ$hU74+p*toA1`XRNcQwa4ax zJs0SDP@>GhV5Y{j9m;l1?fOmprz6kngEA!>&~5aHp?FDj+$O#OY7<{$ZD>3Zw11>g z1zU!j_#J+F5ReJ1GV&~jPa-@=)yC2!Bs9!f`4GQ1;%%fWjJDD_JTL~@WCysxTZR&j zc@6*vz$fIC?Q-m6lWkRoN1X)G>=0u35h0~Yt|ku10$YhT+L)2KlJ&C~MmG zg$78Qt*z5x6@YV8WIH629jw$&x2u~tAxNLdD42s>0j=)D^!W%~0JtIOncfh{!D@qP zgao$|Kx!qd!*tVi!hC*YyJ7l5rH{l*f*$3@&i+LJz+UB2ddvL=9XL>8r(GUuS}NwngRdng z;xM@^xBl|ndpNp5%z}3A78}5i2SdfUXdj05)8C63tB4Q6u(l3j)SU=-A!H)ljbKH1 z7=cN?+c7kRz*fOM5V9tc*D%6MXJ-``k^v0A2@ujwn}e`pBlls#{Rk9*4rJx)BW5@F zB{BY8`es%JpG_yS7ArR*>yFW?>`Iwc+ekaID>El!vlANM2aVo0nmzA4XENr^(CAf? zMo%pmstlx-9MOSBAJV;$b8`FhC4s`G(>Z~H)uTDhpxE=PPc#Mc=NyRxeVk^#Ldowt zoe^BIIj~~0|EAW_72Eu_w!n&Z|8l#3o?|SvV^XO}%Nwtq^X%5AwvMz0OjSo#4#l3e zSjS812G!$YZm?gh1^Xr_HUz|mlhvmRP8Xdv`4?;)6VVzis{ilp12BEE@+T8Gv1l?6 z`Zl?M|1LfJ`FbA4WDX_4|Jr2xT~)Fn&ng_r6UTH*Cuabeuja{0?8iHP&%5cP^+hFq@{VX;@rg{3ty zuT(0R)*FRa>Mc#lidU0mknn1nqA4ea5E_$vHjZ&0N(JJfALgd_{|SQLBr&|d5Mi-` zi@;r0R>s7Fm1p_{Ub`WmRXbzLz_t-6*d<|m07KJ!G|i-pg&9Yqwze817GqneGi;;x zA6W7|fbce{6?CQDiMu_wBwPN18U7vNRRqT5(=|oKq0|l(HIlMpZF?6!-3EYdO!P2d z+nVs!Mh&@FL$Ws&R8T7a5?zvC7hA11PjU#I^p5;ba&wX7QG{av5mN%cABn&(=!JqZ zU5`vLM=~rhq5W`zkuEKKNom4dW~#Af<%k&k7~yXSSpaT10JJM&ZO|60h5rTZu@>;T zBS)-8Fc8`y2OTM{=Rc+&7B_BUYafL#Qy5k`8_`gVySE)(g`t=(K-+c)Q^yhN;*4#a zaXomdob8Sc;E)L)d4b33`H|a7K2aLKK)S4P+cA`k@HoA*+L}0Bqehy;FX(ToXDL6& z9G~4=Q*6TBrF*89$I+JRJx`a_4TVY5 z6{)3)G(05@`L#+Y0nRJtW@|+SMx?s2B&!=H6Gu{dq>3-lHyg5q7-3|x;SPCDM+%+yvJ{ZZo*J}@%YxK6M#{+aGS>OB%f7)M}skrP8_>6%5!bFr!5ClfJ-l}y84 zr6Vxe4HLUoV$!@xX+ni-L17_PZ0do#=d-=_|>p81PUtaOPmNgU(K%pe8)Ss{Hoh@Q8 z2b+=wA-4=*dX2(|7gmwf{T5hj(cX6nblY`X`CR(qb$b#;$VbY7h8ubU#lh}bwyMs! z7yA_pF$cJF=Awi0cU0*lcjVqxa|FT4)3=&a1(Bx{&4rDHP&5>0cc80n705$kRWMeA zwJxn-@)_2Et01Io>-BiRHLGAX0jEJ_Eo<)WnJ% ztVXCoU_8TkZ3PlWvlWa)&N8H$0hw6oK7ryB*;Fl|~L&L!?PJuF1~E+Dd@n6{89ndwW`YosS43cigyuhhc?X zlTe`=Ik)+bO1_xBXxm8RZ?;(ToY6D3K8*)ii##sXn0ni4#VN?f)F}B9LpmH{JwjMY(6`z)DZQ9PMoQWn_*yL-0PREXWvhE%cY7$g z9quD|9Ib7(_FXUz?K>RpyV_iPL)y#Ysl#psKL3%uSji@FJ3VE8TE7+Q38^~ZTw#M_ zFYKA=9S-Zlo3U~m0+V5O4BdhmV_~EhBYB6Npb#Ou5tty>WBcmh6E=||op3DXy|lDr zOI^rtS!2Nu+uh;ZE(yDMC<81wfb)~^ZFukp9E z`fZNU`i^(>+rc%ZucsmBtdupmYYMry3e_z}*;|$AEqa+>uYfT1KbJhxxbu=K;VbOf z*9cndZ9GqxyKmf#1Lrm1wx!MHc9co}aOMstY`k`1-cE!rgl+^Ez_5bgsTbLfumiz~ zuoJ<7P&M+U`#8^kL?7)fN)e%2CKYhYhD|sH;4PtDd(x?}J286;jE*}I;w~NFhL!|N z76nQcotigVvi5+qb0m9d-R^=7Olx|P`aC3ZD~9?I_9GlXxDDZUgzq8Tfxz|=j6>qW z9(cwitbg0-Q@fMb+>Yef)YoExW(3Av*$@h8TK28=)RnFEEOrqGxeuda-Jl9kjkr7# z-_%1a>>foV@JhMo;L(jz~^&dq39$UqnL8)#*Jj^LHi zjr|hEpVM^*>Z_;Cg-^m1*_<(oY~rq_NMAUxM7Ui>h1-D8$g11)>eT9m;Px+-jzngj zMbhrOv*D!r@ZFi);AomnQ{vhd;_7h_&%TA-&Mq6?dI~Alu7i`sVIibi+X5$rpl3qL zwToSyF5*p}K^adp*t!Xs>y_!$#V7 zU>P{jp4lk2xA;#eH6_x_aT9&-2WozbPW<4E(ot)xsIb$lZw=J)Gc^tUuweNGWRmR; zSC_*>_D#GC%5B=oHSsMxA?0FrlgnC1ig57f0fclB_T1#O<8FpLLEn2kwe(@kz?kp^ zhMvN#agnUcdYxnhqn}17=IIZAv^x%&oh(CWqPjz6h7}MDX~M^+owhbdCkWQHhuZ4q zW1iIrEeK54>0uuOPRQ2iQ56ACEysM0Hbv)&jl??|}qbnoFUsVGlEdK>UWm=q)HHPep|rzx?9yJb{+?ug)uE3VA;FkS?E&In*{q(?(^BB`D zQP-2lu{Td5{2ah*xPn!fZ)pR01~dEu;aP-*bl?a1894pqBz`}K@Joc}0lYh7>EVsZ z^obv?uOu&E?5_~)n0*_!Cj}Sn38(|dT8k|DLFo7}0 zBUt-w2=8Fr9}t2Fj6;%vL!#Vt1#^(Ikj+hheb@+&n|BV^3Fl=a+Ix@4nD|N)HVgEn zA7}6{(yZcS`cR9B9$2ZMyKXH&&zC@)EV_9MT&W1gQRl76^!xXNQ*3>#;I3gwuAgK< zZUaP{>5f}d=(+nduNQn=E3{O4Jm`yL4;Wq1dw}G6FuG8ST=9_Qm*tm7jkNU0buHGA z*<0WW*7+p5;QH8PxIx0TqBLO7J^}w(6*Tyh%zo!Z=z24(Sr{iAd~l;NSzv{%l0cB( z(hCQ_eefMpgLs1jU$mxYVF9KOqeVk-vg+!QeBy{_l(ZAh63Vq1RzF+ebj?6q z|7JO4M)MhL`Z!%MPJBB~Jcq|T(&0~GKvOuTDFW{k90Tfd1G?Oxt}LJ{8`D)>aUMFR zFFBWz5lkrwq?80xDg!B%CvwJ8>dxVTs5M})1`X8#L-m-UmK_pGF=YXZp=``hF{45} z=fM-8+`@xP#xz;CU(o087v)OpC^coyW z85237_~=pdZd+%sgZvwgjSR;oqJH0@tM4li+;Y16zOANQNV)1_5N5y7B+$R#cb4y= zPu-tP-@D%=kXjaO{X*hB$4$vJ|7a53c0@z%H>J=aIh%g^_5DVAz7t%&zz$n()zPZI z;v24z$~+nLiR(@Mz;<}O6)S-UZraJLF@lKP3RoXGVB(0$Tk#p!RJ_yEdI zCC-pyVw26;>9F_uAbGK?x6>|myF4PA)HC&&blZo1cCXE;&) zNB)8d$n6q~Gb06OGnDGy0e6X*k_mf@TH%IJCtR_JTKSSWv`q5I%`{`kI8g8wUdI3b zjmEl_EeQJBgKHN9*TYI+OJZD?^gpuy6$@ghW=vl}vmVOcULC6 zESIw*`4A`ZBY=_M(VO^&|C@M-~>fXk-zeR|)6h03GF79;pw7G1=?oDOOXy!Ux zFL^dMOpJ8@v`HSZ6K}aEFA_X;Pdfc}_#tISZ5vpS1GaQN?Pg|Kpx2t9pd%kZ-$OC% z)=lTWsaRKc#O2+K4(dNYK*c6k@3mGoSg=!kmbbbc4dMndCv2q}j^`yzX_v5jPY%0y z{kl~R;9*~RyiI|=q+$Bhal?XPSxD9H>e<)Y=ILf0ZYE5b++>$Hv0bMCy!Dr@s^}uU z_pz*;1h9E8Feeyn1PwuJW5C*YN_~3PsCB~uX)8EImpoPiCiE?jEmjW~OdCVyjm#Kg z1`RWTK1Ck*PQ&MaZS&BI$1VIC+Vc2@IZt4k>NmhVJn&m%u>%ei*oH^VZw9Rj68BJX~^6-;E@GvpPO`J88aoKuB z&MhV9p)zs-0c{R%(zUphe1_?t^CP`KU8ZQf1{;z~nBfb6-c;z@H1A1*A#!_^OhFDR zKVEAhUt$3QdC6B8`WoRIgl~De{rFNdvK--Iu!syt43*$CgVDbpufO2{Zk-gE19dY| zVkibdg`h@=1!yL57&HR>Pvbrb^?OD7_v4~aq!{_t6VC~ffiZIEskuCVgueOnU(U;i zx~%e$%IRM2w8Iru$%Rl2B|{o;L3*5Bj-_~C5H|G<*q!L6o*iVrJhE7LR6*5G+xwX` zY__T;?#{wCMlJo2x;-L0B>HUkjFpf`u0FDl|u=MGE9Gmu8} zp0$E)zUJAv!p{}-2hUzcO5myCxg?=bpw{Oy8?UDNJw_F$t_UkBMkqnRI!GymX8K~k z|J>ZTmvF`_F-z{qo6nu+`RC}V=Z!+FK!eZkR5oF;WpvpKc_y~S!JSOlyG+(&S_t7^ z>A@E=mDyPBa{AZ{7QwHeZ@%z4Of>po-_E2TJl90EF|qWS5B_oFM=$;p8I|h4St!$C(^-JQ)tqgU>lxF;uF|!h(7wADEOq{uPn+8+qvqO-^Wf_)GW39T2ju zHqiGzHYn_w&=>mmS5jqI_We6dRP*~J`t-$gnhhJMdADn5%PVnOOSE?QZ43MLg71~} zJnU_LZPbd9H0Y+0b!5#Y4gKcLIBixWr7y*of^FudbpM;0I?vVPoI3pzq{!IAjtTcb zkqZ;bR}mNT6|?|wVN z@`?2K{@8eX;Z+q{XI2D~!f#!{nI;Yhc^NL#{nK~b9Whvevr&WNx~WRUdy6;aRs;i@RzI|};M zAGGw|JChoG8Ii{FoCl9y*<&w>#P*py;hiE(z9|}O_L<>aD1}aapy$mr>wa)VPH2m- zUTc{iZIotdw6w)%!6nU?(f6l}$>ouFScO%Q+&;SCE+ecCgVtUVNe8}VvGH$wkI%%8 z$NQoJ1JYO&k6Dsw&xfWoaYo&h5gL72zAPqA$|5mPQbb|`BtUc0sv-%{oa$(ExSbtg zpqi1912Z`)D}p z@-&dINBHsWLcSJ?dgEqTT?B`gSw&vu2G=e}cLSc|>%x3g`R;3uy4BgBYm> z&jP$^7KJ+vcDur>m9oGt-|cYhBIu2$N59DgvwF+d+59&8{5OB*+eaSyR?e@q))M3$ z0=uTLbJ&8tVj2}$jo?K$G7B{?nyzFvh8hr}nwF?B!Am>-b+NJl3*Sng{8wKtXzcLu z4O$|SXL8!aeh)H+j01;Eys<;FxA$XFw#oZ5hHk?QiEf9drPJ2#*x~AgU-7VW9V@0X z59Om68b-j$CO0G45YTkDW-|jFejM%U?Ct6%A^QBgp#mdw7r@0aIN$H-^|ZnXCH%TA zq+`*NPX%pt`cHrS;lSTie22oF4UHdoNzG>t_|?2zBbn(dp#rakKJ|hjvD4Av0q-T& z@$b-O_n+cM+<)@QRATWXTEEKtF8%oZo&A4F&l~I-O|Lnq8&{R33u1X53%mJ0zpIJSos)2LJk?ub~uXr{T&;NjrKc|Whs!{{0)FWwQs+@rh ziM$xK0)-b7BSz53GauMAaZ91|?6IfQtj~)nnk;KBYH8=^$#feyx#m8ifv}M(K1@k4 zq5SkrmoU?BFHM(N`Gu9HT}r-p49<^E8R@DolCY4RSsaE>ML6=U{j`4Ce&|c}rP74+ zMm~#f|167ke3ngDpV6T814id-5L0$h1Dg35m`|X1CsU~Dl1T5JOs1hPGwGH~$+YEC zJbW9dIT)vzAv1I6U6*$8OXpE*l8+}~k%Mx#*ye!KFo%ez z``({!+5tZcbadlYTYJfLZsz`&F0#kj+1U>T8DZ#bZ;xnmiv>4D8`2Cnp|*;P*d2j_ zNDXZctk?zTbbE*sE=G5Y_Fnig({@&MnYgCAbDs#mfQqyhP6VT^#9uIW;W;4wYS3Qh z&FJY|IpbDB*=3gxtk&-qhD@9>VaNm@-gqJQfs0DMyniW9R02jcVQ3k`as(y~aWf)` z$lEcr1QV_$5i2mE1%Vx&usu>Wes0BLYcLdtb>I~TauC4{0G^4g=#3}oq63qD;h%Y} z!(yRlPsi{D{J`~U-mxT<6qyZnEu(ci-gmn4`a@VOCPuUFaCG*xdf@H_`&|{vLvvUZ zUI&eUoim8Sfp68kCT0xA$o*Ulb^j^<*;%ptPvy_<)bpqKeh@>J5`W2p(aeQ@RmQuP zB7gDxQA?v=Wg1tRf~xX>s{Dj-V$n(ABuKeN7RLmlFs3SovIQ0X3g>A4&VzE0TH`8B zP?Zx<B7=0BhAw7dis}%adyr`p0yBR@{3~h&+Uh7Ovt# zI^X*p4Q&wy`b~U(|9LF)04sx|z;3MNU3s+*9fi^*#fOmH&G=b?A-u{(8WBnmN)gr~ z97VXoEI>jNkU*_{L;X&Og^{%5sYBB z<}8us6UHda%a#qPQ>wXLE_-jMV?OyQbPRHF?!5z_XYzICPJu5wQgD&O_r)!WTV?#5 dBlQzOIgbH!3PpfNyW<=H(fxP0`8ZZ<}(S%Qo&*VXGiqpCSsig3EB5;4(^N zxHWZ6lp{J6P3j5TkkPDhi1jrNwokMY2m4fmH4rnb~eyqlzX@%pdx{z@eh!kh6yRx&ji-hw>#dzQ#eqT7Q7LTLYI! z{#n%EtOyVk^9zEi@kLkFJJj{?Iigub?9CBjjla|54mgZ#Z|r#1nUho+j&OH6T`ns5 z{b7Bl#~Enz(G|2DB}MwXS~{t(6}tR5XWQVn4nCT}>~V>th#MukFovDXi6*I`uX8$7 z=CL?f<)ocKah$X1tOlyIkagr0Ju;tP@A`q)P|Pi9aCuwkfe;27v$EI@*=?5UlD!*2)(1%saq(Io<4>$u|{^nMnOA4#o{XTD4?t0Fn_t7nAxVoDeT2^9lO6gH40c| zb5`QrpQ%|&MYeeN_w0@eJBegFD$1_qHfskxV7Uw{oU5Bx`Dlkk{d76BU5aRg-RgCF zm)U~i`0+tqjjzk=DziBZVHMDZRUXL;o2;v4g*(9aI~@h1z*oHimX@4sp>e>}kNoW(Y{7k`^PL%SU*HnO@Yg{rJ5JL{fO*mKS(WaMt2d^ElE zypS4a@2xqWlq%nR-_57(`R4^<$=N*pc$)RGx`*nv&Kgib{Yj#V${uU>Fu;i874)i)ejyrjRn`AF5$Bc;xdOf3UiquGAEu%yrWvNe>^pPaur za@(vEsoBTJ6m6b)Jk542t*}3>@K{=Le_HWN{@u&=x9`8Y)5)^mIejRQ17>c*Hz4G#xBMqJvY#YL)ISg5|fgn(9~`T__0bmTAXE zbB9_7+$efg&@|oa^sEV@3wfmgI#+&vKHbcErdxXc1O#wUlqo+C;7=4~@WZ1lj{-c} z@wgX`Z}oXwyC{{sfqca^{B*<>w&Jiy5%AohTL8idE-4_j2HZX`Z0!}D9;mq-CdF%- z1VIw$TBO~Hunh;qdVH-;Pc!(u%k6RoBtPAVeLE2Tf)GI9E<7T6DYjw6Qo{3y{urp~ z{cLfiRf{Jdg!groR+7LTtt^fl7hxR`5SFr2mFF}z=y$O8^s&?FBS^}FC7;p@SjA(O zZ!KC0rEpYpbF0Vc_ro#jX>Nunm=3KxCQpOF^Kp7bOuI@`&Vw*bhOX94ab{LsbwHbf zd{UXQ+MdO?&K|74hQK+fp#+-tg||Y*g~7D&7wA}1|zO!uhf>1J?yL6 zsSCNmF+g&S9cpgdu+HDrif3b3w*t_)OrrHb;vZyhQ`qB7g62kv-so)D?dRgqglA1t~??BSj@VvjqK;BEvwffbjz3rqI`gk!H!PNnMAtx_j$ z0gC!Nbc*Vn)fY(oe+XY9^dfMDbx``9x(A>k$hIx9ix!2+{Q#3iBE8)Y^ERrDa$`vz-r!(-q%^ z#&DEh3N!}Rc%;VVk`x$pI{GbkX*-=5AFk}qc2}zS1YuKLB=N&EJk`Ja)Yp%TyJj_99GsZor&V2BB?S5wy&+r z%J<(nWX881-oh{2c@4`_#65(qShkqh*t^SC#dGpsfXFX$O4#R3%Ztqi;Sw=;_d0DI zyFvZ2J_T;jk1a13#ft(v*`6$ZE3kjJkD2;!7!@|SB#eP`AhJ=1hI<0+Rb>a#H-UnC zZdlvW6$rrn2Ct{w4M5o9j$-i;VGnd10)+}LT0*NlZhd*9Trq zLU!N=&Ksp>@Pz;zE`C@@E3v0*re^3|t=EhI8n!IkI{VMkI$^_PZvx#k3o5+keo0He%tjWm|0>wk)MnPm= zYYddKn|7rYbqlU+*XVBJ!@^c^D2F1#b%HBrt?_2#njGbK6*85x5lFmHqbG6*i8`#$Mug2!0ef4c_ zud7K~9iUard5fbW4;txs1RfiTurw73Bf%gumP@T2l8a8q)>`Bri=c)ooWxf4?kzKj z%wlf6Awvlaa1T{Hg1ZHP63u=R*yFcmMcctO{gc3i>x2PydFbe^KZ^Q~W7`H)LTo8Z zzGG5ieNug@@P2B5!mg$*O6Ryx;JGi zSGp8+EJG+qs6dzuutP(y!tz9fVuTWeNeB}Vgiz_GorLUW|F~}~-$#54VKRY&yv)uD zGoM7&@ecXJI$?X&vAoLuyvqHPkLES3Q*s$Pg9TVl6F&{AIcFSOgQYrznFzBH<{(^+ zP>(PdfgkC7bqs?S7`{M!S{vAREO9PBN4f1)I3Nvyuj~NG2^;6FX$TbOHw0$*s6^3e zVfDc2F#`Gm%ED=&)uC6SyUd#IFUUkXzHGD&N`5_XTB@wuG-c`;?3w#B#HC{Bo%^S% z3le~+9#X&G%XWwgOU_~_^x)hjR{T(wxLst69-06t#6p;gv3XpVQs?mW z+Maz7v~Y$Rwr>c{pasVHUbwkl_01D%Sg4@;Eozio3;XEUiIO z!w_k0mzxH$`6h%P1@`fCHyY6Ws2LkfY{B#SrX(C<988xz&KAi7QDXD+Ermv;NkvFU z-~l=o?$K~XZ63ab(-iDWMxI+)?hBLkFF-Mz=<~9;_e|0J;l>fG_#0Q){Ciyo)nf-= zxPfFa`g*b0FNXf|`eqehW{Vh4*pfF=NeVmgXc2_4fQGF+WESUlvuU%;skAPD=NbPX zN{c(uUErfB-E4i6neD7Gv31w!S?56wtDKd<79CDwpM9WX-@YHAU!%hR9BQ`rVEPO& z4UF0dGpUE$6u0>(Y~ee7xG${s2Yj7$8unxX@SDzHxO{+BzLhz;6auB6Lf1Osv?1o0 z!S^c%-~WE{)Hw->1KtkLbTows2E(#{!8TJO9pNP-@;Gi@2SzjzcGiovmDz#BMm83N}k(=U187Qh1PdNT5RL{USxAVOi$+r-C#i42C5Cm5Gd1!*!mC0Xs^a) zdWpUGVME05GO>N{WisjLB!~)+9`$OCMG%Hp*;>0`$yYFII8P0i5$?biJTM`{#ghfz zS0Wo`c-);WJ}11YdA~^{?$DNSjT*OiI6t0 z%#G=jSb7Q|tm7U4X?3K}JCs(lf%8_?C0L30?*q|}UZaR}E z1}9+DN@WMnPk#|kpYo`K7NECa&klrJ5pF~H6TH$oCy_IU=evO7L+iXDzPN_|mc9@kwvJC}uZCL)_BcoAzSnJ{uoNi$? zf1e+-l{fi1nsM?W!tyQ*=IhV0xfilUw~GDv_pzaE7a&sGLIoG+6Vk$N|KYXCnZVhh z4(r|iI=9Oud6fg3AU7jihy(5wQZ=PM3P&hjZk1CQqYi(^T>Ik;@e37u<40GI`%5rt zy(2=g++n13BVhCkM+`5L!k-^lD1^2H44wGAl}q8ndE9&-iQYpPKL2gDr8f8m&;M7T zFPPrQp1x!ikE__hOC31DpROgzlR!&&9aR+SM;2EjOkmr7E{Mi^$qpscr~QPT`q{ys zH^L@X@QaDrf5{ThsaVY~3bRzg-upG7`3Q=#G(!5(8n87{r`O*mQCpRpLfuE#(Ek+3 zZ%=$$AEM}^2p=KvYthG0x;$H$`dfuTP($wtB(a5V|Lr_U#+?(^4+XEVW;%ssr@M&U zOGvxcgp}q7MUtJyT@8=6!K8@Vv2P2)!}4^Iq$}??iLxY;3^7J6-!77O(`;ZQH1zN{ zoIvch$Z?a%Cw+Bla!MyZqJh)9XqQbsq9Ie*lqXE`ej~Y!J+&)Az9*I>=`0n%p*vc3 z+DQ@{*kzTUpFs>!DLV&QuZ`=DlQ)$Tv+UInqx=^GNo1dWZIB<GJ7V5^sqQV4UY)cl@xZgzf~^?=#D`IFcBZHr#CL zHpzAaSq9uuktpj>4-sI1^RH%k-7I2|4LZ;}eW-7(x!XLVH#~a*o!vat3&-<}Aq930 z7S<*PQrWqu6WF0A2aUD&sX=4yeM&J_Mg~qNfT;@qT(%*GYm>T@+Gnx@gHJB)|h9t-z*MZgctuTOv&y<_gkk~cgBf0#Tk$^oF)0gc|;3SEBMiueIpzcm+ zZ)E*9CCHzHLFAJr5~)h=PX6Ppse^KOZCDPQ{R}!q6c@$2 zzDgSw#XZBKc*ea?C&Vju8@87Krsf+K`cQqX@ycDmRx5vCB~heN-ee*f^3QfK>VTa@ zlUDFR>l6ZSM0xdR@q7%%O`kW@HpAy_b1&vNcMrR0@>QzxI8UNtTH*m`(?^O}-AvTLx*h?93)(lbeBK&~Vu` ziaL<}^YY!^0(>tZhitUgQ$No94k2FvV;v7^RT-x;%bK>Y$idIf^I-77DR= zFmb@QGRlK3#z(3}IE}Ny`yf4orOy$DgD}-bU{AH&GKS31{tL@B^3E}&yN9QKGm#jt z^2$XHvn1sbF>(!f3`oLeNPLo zKVVr=!b$|ZwbL#HOl{&EDayTB+v@Xlt?<$<^4oB$lMjt0_h|enpon}Rm!#;F>^fOK zn@dLNMu8>#MxS1f;0 z3*oy1!WitzC^>p2MD&PRBuR}iQtq8jOqR3&-Zd355c8DMT5GpeZYT#u_|cRz+@9W@ z&dyylM?t(&C?Q0r;dFm@wDA`CIs4Gj<`|-0o6((tuz zHk()ya-bost)#wHe(7ut%p5lSoY`a?amc~h1Z*t7F`IN~z67!+`MYeAF4BCta5VW` zSBR2+i)7A|COJQceAQPphuF1+j>%zFjoArE) z%do|beJ?E_PpkVT7n47ezH1hdH;MeyVlqKKRYH=$8RxZ->^{#DvV*HD33zW`&LkF@^nv^* zNZfynmsKuO5Pt&b`M)kfp;043+g;@ID-BxQMkX2XU$W3?klO(FZEa-Bf0@`tA~!52 zqkDcv@+q7g=g-s9%s>7eX82D^bU7{u|6|gxNFIUJD1=K`{Rtrhs}jN=;x--y^Z^8X z%AgM+EPWOcvmeTRh&xRpR+AAd2;A$^QN>DxDg^FpAr$w=zg>NgjR?D7tp8bAa+C48 z$(s4({LMsu#7(kFBQ=im$y&{Hay~Xi(?HHoT0u04=a;CGGWwSA#C9^*%yUGZS0`XEx7RK5L+xZ#5&y#rKX|!je5pAL zeDc1euUO%8b$O&Iv=*iX8Vi26e4(8bmv^a1`R0-f0{&j`>XwRR@@Cxy0e>%4X%a|O Y@5~DV{9G8@7)Ok~CI1remm=%`2W^id&;S4c diff --git a/ui/pages/__pycache__/sync.cpython-310.pyc b/ui/pages/__pycache__/sync.cpython-310.pyc index 59a7e8ea6a2c1aac161e25d5d6e46e36dfe91665..3b93e7d92b247fae226384864f75ebfdab2ed580 100644 GIT binary patch delta 25159 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 z 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 delta 19788 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 diff --git a/ui/pages/artists.py b/ui/pages/artists.py index 56b7bb12..2d76e35e 100644 --- a/ui/pages/artists.py +++ b/ui/pages/artists.py @@ -1788,6 +1788,7 @@ class DownloadMissingAlbumTracksModal(QDialog): self.download_in_progress = False self.cancel_requested = False self.permanently_failed_tracks = [] + self.cancelled_tracks = set() # Track indices of cancelled tracks print(f"📊 Total album tracks: {self.total_tracks}") @@ -2062,13 +2063,15 @@ class DownloadMissingAlbumTracksModal(QDialog): header_label.setStyleSheet("color: #ffffff; padding: 5px;") self.track_table = QTableWidget() - self.track_table.setColumnCount(5) - self.track_table.setHorizontalHeaderLabels(["Track", "Artist", "Duration", "Matched", "Status"]) + self.track_table.setColumnCount(6) + self.track_table.setHorizontalHeaderLabels(["Track", "Artist", "Duration", "Matched", "Status", "Cancel"]) self.track_table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch) self.track_table.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeMode.Interactive) self.track_table.horizontalHeader().setSectionResizeMode(3, QHeaderView.ResizeMode.Interactive) + self.track_table.horizontalHeader().setSectionResizeMode(5, QHeaderView.ResizeMode.Fixed) self.track_table.setColumnWidth(2, 90) self.track_table.setColumnWidth(3, 140) + self.track_table.setColumnWidth(5, 70) self.track_table.setStyleSheet(""" QTableWidget { @@ -2086,7 +2089,7 @@ class DownloadMissingAlbumTracksModal(QDialog): self.track_table.setAlternatingRowColors(True) self.track_table.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows) - self.track_table.verticalHeader().setDefaultSectionSize(35) + self.track_table.verticalHeader().setDefaultSectionSize(50) self.track_table.verticalHeader().setVisible(False) self.populate_track_table() @@ -2129,6 +2132,16 @@ class DownloadMissingAlbumTracksModal(QDialog): status_item = QTableWidgetItem("—") status_item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) self.track_table.setItem(i, 4, status_item) + + # Create empty container for cancel button (will be populated later for missing tracks only) + container = QWidget() + container.setStyleSheet("background: transparent;") + layout = QVBoxLayout(container) + layout.setContentsMargins(5, 5, 5, 5) + layout.setAlignment(Qt.AlignmentFlag.AlignCenter) + + self.track_table.setCellWidget(i, 5, container) + for col in range(5): self.track_table.item(i, col).setFlags(self.track_table.item(i, col).flags() & ~Qt.ItemFlag.ItemIsEditable) @@ -2158,6 +2171,107 @@ class DownloadMissingAlbumTracksModal(QDialog): """Convert milliseconds to MM:SS format""" seconds = duration_ms // 1000 return f"{seconds // 60}:{seconds % 60:02d}" + + def add_cancel_button_to_row(self, row): + """Add cancel button to a specific row (only for missing tracks)""" + container = self.track_table.cellWidget(row, 5) + if container and container.layout().count() == 0: # Only add if container is empty + cancel_button = QPushButton("×") + cancel_button.setFixedSize(20, 20) + cancel_button.setMinimumSize(20, 20) + cancel_button.setMaximumSize(20, 20) + cancel_button.setStyleSheet(""" + QPushButton { + background-color: #dc3545; + color: white; + border: 1px solid #c82333; + border-radius: 3px; + font-size: 14px; + font-weight: bold; + padding: 0px; + margin: 0px; + text-align: center; + min-width: 20px; + max-width: 20px; + width: 20px; + } + QPushButton:hover { + background-color: #c82333; + border-color: #bd2130; + } + QPushButton:pressed { + background-color: #bd2130; + border-color: #b21f2d; + } + QPushButton:disabled { + background-color: #28a745; + color: white; + border-color: #1e7e34; + } + """) + cancel_button.setFocusPolicy(Qt.FocusPolicy.NoFocus) + cancel_button.clicked.connect(lambda checked, row_idx=row: self.cancel_track(row_idx)) + + layout = container.layout() + layout.addWidget(cancel_button) + + def hide_cancel_button_for_row(self, row): + """Hide cancel button for a specific row (when track is downloaded)""" + container = self.track_table.cellWidget(row, 5) + if container: + layout = container.layout() + if layout and layout.count() > 0: + cancel_button = layout.itemAt(0).widget() + if cancel_button: + cancel_button.setVisible(False) + print(f"🫥 Hidden cancel button for downloaded track at row {row}") + + def cancel_track(self, row): + """Cancel a specific track - works at any phase""" + # Get cancel button and disable it + container = self.track_table.cellWidget(row, 5) + if container: + layout = container.layout() + if layout and layout.count() > 0: + cancel_button = layout.itemAt(0).widget() + if cancel_button: + cancel_button.setEnabled(False) + cancel_button.setText("✓") + + # Update status to cancelled + self.track_table.setItem(row, 4, QTableWidgetItem("🚫 Cancelled")) + + # Add to cancelled tracks set + if not hasattr(self, 'cancelled_tracks'): + self.cancelled_tracks = set() + self.cancelled_tracks.add(row) + + track = self.album.tracks[row] + print(f"🚫 Track cancelled: {track.name} (row {row})") + + # If downloads are active, also handle active download cancellation + download_index = None + + # Check active_downloads list + if hasattr(self, 'active_downloads'): + for download in self.active_downloads: + if download.get('table_index') == row: + download_index = download.get('download_index', row) + print(f"🚫 Found active download {download_index} for cancelled track") + break + + # Check parallel_search_tracking for download index + if download_index is None and hasattr(self, 'parallel_search_tracking'): + for idx, track_info in self.parallel_search_tracking.items(): + if track_info.get('table_index') == row: + download_index = idx + print(f"🚫 Found parallel tracking {download_index} for cancelled track") + break + + # If we found an active download, trigger completion to free up the worker + if download_index is not None and hasattr(self, 'on_parallel_track_completed'): + print(f"🚫 Triggering completion for active download {download_index}") + self.on_parallel_track_completed(download_index, success=False) def create_buttons(self): """Create improved button section""" @@ -2247,6 +2361,7 @@ class DownloadMissingAlbumTracksModal(QDialog): def on_track_analyzed(self, track_index, result): """Handle individual track analysis completion with live UI updates""" self.analysis_progress.setValue(track_index) + row_index = track_index - 1 if result.exists_in_plex: matched_text = f"✅ Found ({result.confidence:.1f})" self.matched_tracks_count += 1 @@ -2255,7 +2370,9 @@ class DownloadMissingAlbumTracksModal(QDialog): matched_text = "❌ Missing" self.tracks_to_download_count += 1 self.download_count_label.setText(str(self.tracks_to_download_count)) - self.track_table.setItem(track_index - 1, 3, QTableWidgetItem(matched_text)) + # Add cancel button for missing tracks only + self.add_cancel_button_to_row(row_index) + self.track_table.setItem(row_index, 3, QTableWidgetItem(matched_text)) def on_analysis_completed(self, results): """Handle analysis completion""" @@ -2305,6 +2422,14 @@ class DownloadMissingAlbumTracksModal(QDialog): track_result = self.missing_tracks[self.download_queue_index] track = track_result.spotify_track track_index = self.find_track_index_in_album(track) + + # Skip if track was cancelled + if hasattr(self, 'cancelled_tracks') and track_index in self.cancelled_tracks: + print(f"🚫 Skipping cancelled track at index {track_index}: {track.name}") + self.download_queue_index += 1 + self.completed_downloads += 1 + continue + self.track_table.setItem(track_index, 4, QTableWidgetItem("🔍 Searching...")) self.search_and_download_track_parallel(track, self.download_queue_index, track_index) self.active_parallel_downloads += 1 @@ -2625,21 +2750,32 @@ class DownloadMissingAlbumTracksModal(QDialog): def on_parallel_track_completed(self, download_index, success): """Handle completion of a parallel track download""" + if not hasattr(self, 'parallel_search_tracking'): + print(f"⚠️ parallel_search_tracking not initialized yet, skipping completion for download {download_index}") + return track_info = self.parallel_search_tracking.get(download_index) if not track_info or track_info.get('completed', False): return track_info['completed'] = True if success: self.track_table.setItem(track_info['table_index'], 4, QTableWidgetItem("✅ Downloaded")) + # Hide cancel button since track is now downloaded + self.hide_cancel_button_for_row(track_info['table_index']) self.downloaded_tracks_count += 1 self.downloaded_count_label.setText(str(self.downloaded_tracks_count)) self.successful_downloads += 1 else: - self.track_table.setItem(track_info['table_index'], 4, QTableWidgetItem("❌ Failed")) + # Check if track was cancelled (don't overwrite cancelled status) + table_index = track_info['table_index'] + current_status = self.track_table.item(table_index, 4) + if current_status and "🚫 Cancelled" in current_status.text(): + print(f"🔧 Track {download_index} was cancelled - preserving cancelled status") + else: + self.track_table.setItem(table_index, 4, QTableWidgetItem("❌ Failed")) + if track_info not in self.permanently_failed_tracks: + self.permanently_failed_tracks.append(track_info) + self.update_failed_matches_button() self.failed_downloads += 1 - if track_info not in self.permanently_failed_tracks: - self.permanently_failed_tracks.append(track_info) - self.update_failed_matches_button() self.completed_downloads += 1 self.active_parallel_downloads -= 1 @@ -2687,6 +2823,44 @@ class DownloadMissingAlbumTracksModal(QDialog): album_name = getattr(self.album, 'name', 'Unknown Album') self.parent_artists_page.scan_manager.request_scan(f"Album download completed: {album_name} ({self.successful_downloads} tracks)") + # Add cancelled tracks that were missing from Plex to permanently_failed_tracks for wishlist inclusion + if hasattr(self, 'cancelled_tracks') and hasattr(self, 'missing_tracks'): + for cancelled_row in self.cancelled_tracks: + # Check if this cancelled track was actually missing from Plex + cancelled_track = self.album.tracks[cancelled_row] + missing_track_result = None + + # Find the corresponding missing track result + for missing_result in self.missing_tracks: + if missing_result.spotify_track.id == cancelled_track.id: + missing_track_result = missing_result + break + + # Only add to wishlist if track was actually missing from Plex AND not successfully downloaded + if missing_track_result: + # Check if track was successfully downloaded (don't add downloaded tracks to wishlist) + status_item = self.track_table.item(cancelled_row, 4) + current_status = status_item.text() if status_item else "" + + if "✅ Downloaded" in current_status: + print(f"🚫 Cancelled track {cancelled_track.name} was already downloaded, skipping wishlist addition") + else: + cancelled_track_info = { + 'download_index': cancelled_row, + 'table_index': cancelled_row, + 'track': cancelled_track, + 'track_name': cancelled_track.name, + 'artist_name': cancelled_track.artists[0] if cancelled_track.artists else "Unknown", + 'retry_count': 0, + 'spotify_track': missing_track_result.spotify_track # Include the spotify track for wishlist + } + # Check if not already in permanently_failed_tracks + if not any(t.get('table_index') == cancelled_row for t in self.permanently_failed_tracks): + self.permanently_failed_tracks.append(cancelled_track_info) + print(f"🚫 Added cancelled missing track {cancelled_track.name} to failed list for wishlist") + else: + print(f"🚫 Cancelled track {cancelled_track.name} was not missing from Plex, skipping wishlist addition") + # Add permanently failed tracks to wishlist before showing completion message failed_count = len(self.permanently_failed_tracks) wishlist_added_count = 0 diff --git a/ui/pages/sync.py b/ui/pages/sync.py index 562242db..9f9d45c8 100644 --- a/ui/pages/sync.py +++ b/ui/pages/sync.py @@ -3815,6 +3815,7 @@ class DownloadMissingTracksModal(QDialog): self.cancel_requested = False self.permanently_failed_tracks = [] + self.cancelled_tracks = set() # Track indices of cancelled tracks print(f"📊 Total tracks: {self.total_tracks}") @@ -4102,13 +4103,15 @@ class DownloadMissingTracksModal(QDialog): header_label.setStyleSheet("color: #ffffff; padding: 5px;") self.track_table = QTableWidget() - self.track_table.setColumnCount(5) - self.track_table.setHorizontalHeaderLabels(["Track", "Artist", "Duration", "Matched", "Status"]) + self.track_table.setColumnCount(6) + self.track_table.setHorizontalHeaderLabels(["Track", "Artist", "Duration", "Matched", "Status", "Cancel"]) self.track_table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch) self.track_table.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeMode.Interactive) self.track_table.horizontalHeader().setSectionResizeMode(3, QHeaderView.ResizeMode.Interactive) + self.track_table.horizontalHeader().setSectionResizeMode(5, QHeaderView.ResizeMode.Fixed) self.track_table.setColumnWidth(2, 90) self.track_table.setColumnWidth(3, 140) + self.track_table.setColumnWidth(5, 70) self.track_table.setStyleSheet(""" QTableWidget { @@ -4126,7 +4129,7 @@ class DownloadMissingTracksModal(QDialog): self.track_table.setAlternatingRowColors(True) self.track_table.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows) - self.track_table.verticalHeader().setDefaultSectionSize(35) + self.track_table.verticalHeader().setDefaultSectionSize(50) self.track_table.verticalHeader().setVisible(False) self.populate_track_table() @@ -4153,6 +4156,16 @@ class DownloadMissingTracksModal(QDialog): status_item = QTableWidgetItem("—") status_item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) self.track_table.setItem(i, 4, status_item) + + # Create empty container for cancel button (will be populated later for missing tracks only) + container = QWidget() + container.setStyleSheet("background: transparent;") + layout = QVBoxLayout(container) + layout.setContentsMargins(5, 5, 5, 5) + layout.setAlignment(Qt.AlignmentFlag.AlignCenter) + + self.track_table.setCellWidget(i, 5, container) + for col in range(5): self.track_table.item(i, col).setFlags(self.track_table.item(i, col).flags() & ~Qt.ItemFlag.ItemIsEditable) @@ -4160,6 +4173,107 @@ class DownloadMissingTracksModal(QDialog): """Convert milliseconds to MM:SS format""" seconds = duration_ms // 1000 return f"{seconds // 60}:{seconds % 60:02d}" + + def add_cancel_button_to_row(self, row): + """Add cancel button to a specific row (only for missing tracks)""" + container = self.track_table.cellWidget(row, 5) + if container and container.layout().count() == 0: # Only add if container is empty + cancel_button = QPushButton("×") + cancel_button.setFixedSize(20, 20) + cancel_button.setMinimumSize(20, 20) + cancel_button.setMaximumSize(20, 20) + cancel_button.setStyleSheet(""" + QPushButton { + background-color: #dc3545; + color: white; + border: 1px solid #c82333; + border-radius: 3px; + font-size: 14px; + font-weight: bold; + padding: 0px; + margin: 0px; + text-align: center; + min-width: 20px; + max-width: 20px; + width: 20px; + } + QPushButton:hover { + background-color: #c82333; + border-color: #bd2130; + } + QPushButton:pressed { + background-color: #bd2130; + border-color: #b21f2d; + } + QPushButton:disabled { + background-color: #28a745; + color: white; + border-color: #1e7e34; + } + """) + cancel_button.setFocusPolicy(Qt.FocusPolicy.NoFocus) + cancel_button.clicked.connect(lambda checked, row_idx=row: self.cancel_track(row_idx)) + + layout = container.layout() + layout.addWidget(cancel_button) + + def hide_cancel_button_for_row(self, row): + """Hide cancel button for a specific row (when track is downloaded)""" + container = self.track_table.cellWidget(row, 5) + if container: + layout = container.layout() + if layout and layout.count() > 0: + cancel_button = layout.itemAt(0).widget() + if cancel_button: + cancel_button.setVisible(False) + print(f"🫥 Hidden cancel button for downloaded track at row {row}") + + def cancel_track(self, row): + """Cancel a specific track - works at any phase""" + # Get cancel button and disable it + container = self.track_table.cellWidget(row, 5) + if container: + layout = container.layout() + if layout and layout.count() > 0: + cancel_button = layout.itemAt(0).widget() + if cancel_button: + cancel_button.setEnabled(False) + cancel_button.setText("✓") + + # Update status to cancelled + self.track_table.setItem(row, 4, QTableWidgetItem("🚫 Cancelled")) + + # Add to cancelled tracks set + if not hasattr(self, 'cancelled_tracks'): + self.cancelled_tracks = set() + self.cancelled_tracks.add(row) + + track = self.playlist.tracks[row] + print(f"🚫 Track cancelled: {track.name} (row {row})") + + # If downloads are active, also handle active download cancellation + download_index = None + + # Check active_downloads list + if hasattr(self, 'active_downloads'): + for download in self.active_downloads: + if download.get('table_index') == row: + download_index = download.get('download_index', row) + print(f"🚫 Found active download {download_index} for cancelled track") + break + + # Check parallel_search_tracking for download index + if download_index is None and hasattr(self, 'parallel_search_tracking'): + for idx, track_info in self.parallel_search_tracking.items(): + if track_info.get('table_index') == row: + download_index = idx + print(f"🚫 Found parallel tracking {download_index} for cancelled track") + break + + # If we found an active download, trigger completion to free up the worker + if download_index is not None and hasattr(self, 'on_parallel_track_completed'): + print(f"🚫 Triggering completion for active download {download_index}") + self.on_parallel_track_completed(download_index, success=False) def create_buttons(self): """Create improved button section""" @@ -4247,6 +4361,7 @@ class DownloadMissingTracksModal(QDialog): def on_track_analyzed(self, track_index, result): """Handle individual track analysis completion with live UI updates""" self.analysis_progress.setValue(track_index) + row_index = track_index - 1 if result.exists_in_plex: matched_text = f"✅ Found ({result.confidence:.1f})" self.matched_tracks_count += 1 @@ -4255,7 +4370,9 @@ class DownloadMissingTracksModal(QDialog): matched_text = "❌ Missing" self.tracks_to_download_count += 1 self.download_count_label.setText(str(self.tracks_to_download_count)) - self.track_table.setItem(track_index - 1, 3, QTableWidgetItem(matched_text)) + # Add cancel button for missing tracks only + self.add_cancel_button_to_row(row_index) + self.track_table.setItem(row_index, 3, QTableWidgetItem(matched_text)) def on_analysis_completed(self, results): """Handle analysis completion""" @@ -4304,6 +4421,14 @@ class DownloadMissingTracksModal(QDialog): track_result = self.missing_tracks[self.download_queue_index] track = track_result.spotify_track track_index = self.find_track_index_in_playlist(track) + + # Skip if track was cancelled + if hasattr(self, 'cancelled_tracks') and track_index in self.cancelled_tracks: + print(f"🚫 Skipping cancelled track at index {track_index}: {track.name}") + self.download_queue_index += 1 + self.completed_downloads += 1 + continue + self.track_table.setItem(track_index, 4, QTableWidgetItem("🔍 Searching...")) self.search_and_download_track_parallel(track, self.download_queue_index, track_index) self.active_parallel_downloads += 1 @@ -4617,6 +4742,9 @@ class DownloadMissingTracksModal(QDialog): def on_parallel_track_completed(self, download_index, success): """Handle completion of a parallel track download""" + if not hasattr(self, 'parallel_search_tracking'): + print(f"⚠️ parallel_search_tracking not initialized yet, skipping completion for download {download_index}") + return track_info = self.parallel_search_tracking.get(download_index) if not track_info or track_info.get('completed', False): return @@ -4624,18 +4752,26 @@ class DownloadMissingTracksModal(QDialog): if success: print(f"🔧 Track {download_index} completed successfully - updating table index {track_info['table_index']} to '✅ Downloaded'") self.track_table.setItem(track_info['table_index'], 4, QTableWidgetItem("✅ Downloaded")) + # Hide cancel button since track is now downloaded + self.hide_cancel_button_for_row(track_info['table_index']) self.downloaded_tracks_count += 1 # --- FIX --- # Corrected the label update to use the incremented counter variable. self.downloaded_count_label.setText(str(self.downloaded_tracks_count)) self.successful_downloads += 1 else: - print(f"🔧 Track {download_index} failed - updating table index {track_info['table_index']} to '❌ Failed'") - self.track_table.setItem(track_info['table_index'], 4, QTableWidgetItem("❌ Failed")) + # Check if track was cancelled (don't overwrite cancelled status) + table_index = track_info['table_index'] + current_status = self.track_table.item(table_index, 4) + if current_status and "🚫 Cancelled" in current_status.text(): + print(f"🔧 Track {download_index} was cancelled - preserving cancelled status") + else: + print(f"🔧 Track {download_index} failed - updating table index {table_index} to '❌ Failed'") + self.track_table.setItem(table_index, 4, QTableWidgetItem("❌ Failed")) + if track_info not in self.permanently_failed_tracks: + self.permanently_failed_tracks.append(track_info) + self.update_failed_matches_button() self.failed_downloads += 1 - if track_info not in self.permanently_failed_tracks: - self.permanently_failed_tracks.append(track_info) - self.update_failed_matches_button() self.completed_downloads += 1 self.active_parallel_downloads -= 1 @@ -4706,6 +4842,44 @@ class DownloadMissingTracksModal(QDialog): if self.successful_downloads > 0 and hasattr(self, 'parent_sync_page') and self.parent_sync_page.scan_manager: self.parent_sync_page.scan_manager.request_scan(f"Playlist download completed ({self.successful_downloads} tracks)") + # Add cancelled tracks that were missing from Plex to permanently_failed_tracks for wishlist inclusion + if hasattr(self, 'cancelled_tracks') and hasattr(self, 'missing_tracks'): + for cancelled_row in self.cancelled_tracks: + # Check if this cancelled track was actually missing from Plex + cancelled_track = self.playlist.tracks[cancelled_row] + missing_track_result = None + + # Find the corresponding missing track result + for missing_result in self.missing_tracks: + if missing_result.spotify_track.id == cancelled_track.id: + missing_track_result = missing_result + break + + # Only add to wishlist if track was actually missing from Plex AND not successfully downloaded + if missing_track_result: + # Check if track was successfully downloaded (don't add downloaded tracks to wishlist) + status_item = self.track_table.item(cancelled_row, 4) + current_status = status_item.text() if status_item else "" + + if "✅ Downloaded" in current_status: + print(f"🚫 Cancelled track {cancelled_track.name} was already downloaded, skipping wishlist addition") + else: + cancelled_track_info = { + 'download_index': cancelled_row, + 'table_index': cancelled_row, + 'track': cancelled_track, + 'track_name': cancelled_track.name, + 'artist_name': cancelled_track.artists[0] if cancelled_track.artists else "Unknown", + 'retry_count': 0, + 'spotify_track': missing_track_result.spotify_track # Include the spotify track for wishlist + } + # Check if not already in permanently_failed_tracks + if not any(t.get('table_index') == cancelled_row for t in self.permanently_failed_tracks): + self.permanently_failed_tracks.append(cancelled_track_info) + print(f"🚫 Added cancelled missing track {cancelled_track.name} to failed list for wishlist") + else: + print(f"🚫 Cancelled track {cancelled_track.name} was not missing from Plex, skipping wishlist addition") + # Add permanently failed tracks to wishlist before showing completion message failed_count = len(self.permanently_failed_tracks) wishlist_added_count = 0