From 73679f5709f927dd626f19de4cd1027ed105b904 Mon Sep 17 00:00:00 2001 From: Broque Thomas Date: Thu, 7 Aug 2025 14:53:16 -0700 Subject: [PATCH] bug fixes --- core/__pycache__/plex_client.cpython-312.pyc | Bin 37045 -> 37910 bytes .../plex_scan_manager.cpython-312.pyc | Bin 0 -> 7638 bytes core/plex_client.py | 15 ++ core/plex_scan_manager.py | 151 ++++++++++++++++++ ui/pages/__pycache__/artists.cpython-312.pyc | Bin 240427 -> 241866 bytes ui/pages/__pycache__/sync.cpython-312.pyc | Bin 234004 -> 235604 bytes ui/pages/artists.py | 19 +++ ui/pages/sync.py | 18 +++ 8 files changed, 203 insertions(+) create mode 100644 core/__pycache__/plex_scan_manager.cpython-312.pyc create mode 100644 core/plex_scan_manager.py diff --git a/core/__pycache__/plex_client.cpython-312.pyc b/core/__pycache__/plex_client.cpython-312.pyc index 040ba5adf87b5bbedb1d815288cfc79c184a7624..22ed4406487a9bd6023bef2e033e03e66dceb66f 100644 GIT binary patch delta 1260 zcmZuwT}&KR6uxI>_K%(Yp}U#x!U9v4Wm$pRVl8M=p)^u06sXWjSEXH1q)Rd zhYljel0b@emfQ5sZW_0#?GLd<83mwKJ+l z>fsLoJmhKpC_py(($LStJ{&NoVGqs`WAHmpidWzJ4*lT9iFuy;718g8q0QP>#E;E6_*|*nR+LCE3}( z@Su>iGtR>>>2_H-m?T3vg*;#~lUKpRC*()@3!C8v%@VyP;LCXhOBJM_?0p2CmM@x9a$8@6634|X{xX7DrU-9rcseO4|fN#m|lLkS* z#^~>H>SR9oTM6;7PTIO&(h@2a#rDXL+2K3dVFJFoP8R2tR{95VlSNpyNm}oaIOPIBeQM7(_$-aWn`4IY6Mp_q!>WshEyu=twqBG%ksrHE~qwZRP;~OMfx7jt1%cX%Kg=?L)JDibic=VTEj_|D|bas$h-kw#*xy-ZWdpp3zDTX2{zq7~%3 zx4#C5sB_Ob(ukV*J%2KD--FLjy+%*(UsFwHD@$W!aXGjtIcHuq#kw>#q(u5U@qfvk gS;ds6H;Tq_<%J6V4zlCOg?+a6EGS<`3^&UE4?k{a9smFU delta 551 zcmXv}T}TvB6rMA8eq?rLS2tI-WNO`Y-CfJ5T`&m?2`UNAK%&}QD4a1VD4dOGA);W& z?7?mJSibe+LkJQ`2lJs`f+A3Ss0WDxp@*QLpnB=Gd$lh2e)pd5JLltm_h;pW$8vbt zvJ8o@KlzE#2RDOo9Lyl|v|g6nt&TYdLXxCnOYq%>BpP7HQnGYdavFTeiO$LY9peBu-%dN)na<1=A7(W zZj)=esS$ZIcNS+vbJ~2R*jCBp+R+bxfPN}PRsaTRd&3%oVKQPB1{Lz-mJD~Owk64+ zMhkYH!4vwLcpia8dblf72PVDkx}bthh5dad9HbjZo-yd6!qK!2Q*`QhmgzG*ZFxe% zv*U4kbn*p*c^VqJt-u@laz}2EWJ~Jt2ceOXqtS&l8N%jAQmDOiUhvcX)1cD$2Z% zf)?J;)G0Xqcr{)ayPC~qVE?n}VcU<}gOTN?-&Vx&&=#BioI ek0sn`Bsj;nRK9}uFpo>PFLKO)j^C2Nb?d)4g^{lS diff --git a/core/__pycache__/plex_scan_manager.cpython-312.pyc b/core/__pycache__/plex_scan_manager.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b2c26c3869eb569a7b975f54ea84be9fabcb356 GIT binary patch literal 7638 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 literal 0 HcmV?d00001 diff --git a/core/plex_client.py b/core/plex_client.py index e5079e31..35bd490b 100644 --- a/core/plex_client.py +++ b/core/plex_client.py @@ -10,6 +10,7 @@ from datetime import datetime, timedelta import re from utils.logging_config import get_logger from config.settings import config_manager +import threading logger = get_logger("plex_client") @@ -630,6 +631,20 @@ class PlexClient: logger.error(f"Error updating track metadata: {e}") return False + def trigger_library_scan(self, library_name: str = "Music") -> bool: + """Trigger Plex library scan for the specified library""" + if not self.ensure_connection(): + return False + + try: + library = self.server.library.section(library_name) + library.update() # Non-blocking scan request + logger.info(f"🎵 Triggered Plex library scan for '{library_name}'") + return True + except Exception as e: + logger.error(f"Failed to trigger library scan for '{library_name}': {e}") + return False + def search_albums(self, album_name: str = "", artist_name: str = "", limit: int = 20) -> List[Dict[str, Any]]: """Search for albums in Plex library""" if not self.ensure_connection() or not self.music_library: diff --git a/core/plex_scan_manager.py b/core/plex_scan_manager.py new file mode 100644 index 00000000..06ca8602 --- /dev/null +++ b/core/plex_scan_manager.py @@ -0,0 +1,151 @@ +#!/usr/bin/env python3 + +import threading +import time +from utils.logging_config import get_logger + +logger = get_logger("plex_scan_manager") + +class PlexScanManager: + """ + Smart Plex library scan manager with debouncing and scan-aware follow-up logic. + + Features: + - Debounces multiple scan requests to prevent spam + - Tracks downloads that happen during active scans + - Automatically triggers follow-up scans when needed + - Thread-safe operation + """ + + def __init__(self, plex_client, delay_seconds: int = 60): + """ + Initialize the scan manager. + + Args: + plex_client: PlexClient instance with trigger_library_scan method + delay_seconds: Debounce delay in seconds (default 60s) + """ + self.plex_client = plex_client + self.delay = delay_seconds + self._timer = None + self._scan_in_progress = False + self._downloads_during_scan = False + self._lock = threading.Lock() + + logger.info(f"PlexScanManager initialized with {delay_seconds}s debounce delay") + + def request_scan(self, reason: str = "Download completed"): + """ + Request a library scan with smart debouncing logic. + + Args: + reason: Optional reason for the scan request (for logging) + """ + with self._lock: + if self._scan_in_progress: + # Plex is currently scanning - mark that we need another scan later + self._downloads_during_scan = True + logger.info(f"📡 Plex scan in progress - queueing follow-up scan ({reason})") + return + + # Cancel any existing timer and start a new one + if self._timer: + self._timer.cancel() + logger.debug(f"⏳ Resetting scan timer ({reason})") + else: + logger.info(f"⏳ Plex scan queued - will execute in {self.delay}s ({reason})") + + # Start the debounce timer + self._timer = threading.Timer(self.delay, self._execute_scan) + self._timer.start() + + def _execute_scan(self): + """Execute the actual Plex library scan""" + with self._lock: + if self._scan_in_progress: + logger.warning("Scan already in progress - skipping duplicate execution") + return + + self._scan_in_progress = True + self._downloads_during_scan = False + self._timer = None + + logger.info("🎵 Starting Plex library scan...") + + try: + success = self.plex_client.trigger_library_scan() + + if success: + logger.info("✅ Plex library scan initiated successfully") + # Start a timer to check for follow-up scans + # Use a reasonable delay assuming scan takes at least 30 seconds + threading.Timer(30, self._scan_completed).start() + else: + logger.error("❌ Failed to initiate Plex library scan") + self._reset_scan_state() + + except Exception as e: + logger.error(f"Exception during Plex library scan: {e}") + self._reset_scan_state() + + def _scan_completed(self): + """Called when we assume the scan has completed""" + with self._lock: + was_in_progress = self._scan_in_progress + downloads_during_scan = self._downloads_during_scan + + # Reset scan state + self._scan_in_progress = False + + if not was_in_progress: + logger.debug("Scan completion callback called but scan was not in progress") + return + + logger.info("📡 Plex library scan completed") + + # Check if we need a follow-up scan + if downloads_during_scan: + logger.info("🔄 Downloads occurred during scan - triggering follow-up scan") + self.request_scan("Follow-up scan for downloads during previous scan") + else: + logger.info("✅ No downloads during scan - scan cycle complete") + + def _reset_scan_state(self): + """Reset scan state after an error""" + with self._lock: + self._scan_in_progress = False + + def force_scan(self): + """ + Force an immediate scan, bypassing debouncing. + Use sparingly - mainly for manual/administrative triggers. + """ + with self._lock: + if self._timer: + self._timer.cancel() + self._timer = None + + if self._scan_in_progress: + logger.warning("Force scan requested but scan already in progress") + return + + logger.info("🚀 Force scan requested - executing immediately") + self._execute_scan() + + def get_status(self) -> dict: + """Get current status of the scan manager""" + with self._lock: + return { + 'scan_in_progress': self._scan_in_progress, + 'downloads_during_scan': self._downloads_during_scan, + 'timer_active': self._timer is not None, + 'delay_seconds': self.delay + } + + def shutdown(self): + """Clean shutdown - cancel any pending timers""" + with self._lock: + if self._timer: + self._timer.cancel() + self._timer = None + logger.info("PlexScanManager shutdown - cancelled pending scan") \ No newline at end of file diff --git a/ui/pages/__pycache__/artists.cpython-312.pyc b/ui/pages/__pycache__/artists.cpython-312.pyc index d7d56fcf65719407a7121f261ccb38075e945e41..e208ce274f548af41cea8747a55967756e65f962 100644 GIT binary patch delta 31004 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 C3265K delta 29975 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 X9|Q3B$5H7;DI$Gi)=vTW%gy{h)Aius diff --git a/ui/pages/__pycache__/sync.cpython-312.pyc b/ui/pages/__pycache__/sync.cpython-312.pyc index c50db33c701be50c81d6ac2efeeb6a3d4aaf3ee4..6489d90e838edce146c476a6b7aaf97e07dfbaed 100644 GIT binary patch delta 33597 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 delta 32308 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 diff --git a/ui/pages/artists.py b/ui/pages/artists.py index 7aea5362..2c3e8fd3 100644 --- a/ui/pages/artists.py +++ b/ui/pages/artists.py @@ -18,6 +18,7 @@ from core.spotify_client import SpotifyClient, Artist, Album from core.plex_client import PlexClient from core.soulseek_client import SoulseekClient, AlbumResult from core.matching_engine import MusicMatchingEngine +from core.plex_scan_manager import PlexScanManager from database.music_database import get_database import asyncio @@ -1740,6 +1741,7 @@ class DownloadMissingAlbumTracksModal(QDialog): self.album = album self.album_card = album_card self.parent_page = parent_page + self.parent_artists_page = parent_page # Reference to artists page for scan manager self.downloads_page = downloads_page self.plex_client = plex_client self.matching_engine = MusicMatchingEngine() @@ -2648,6 +2650,11 @@ class DownloadMissingAlbumTracksModal(QDialog): self.process_finished.emit() except RuntimeError as e: print(f"⚠️ Modal object deleted during downloads complete signal: {e}") + + # Request Plex library scan if we have successful downloads + if self.successful_downloads > 0 and hasattr(self, 'parent_artists_page') and self.parent_artists_page.scan_manager: + 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)") # Determine the final message based on success or failure if self.permanently_failed_tracks: @@ -2815,9 +2822,13 @@ class DownloadMissingAlbumTracksModal(QDialog): def on_manual_match_resolved(self, resolved_track_info): """Handle a track being successfully resolved by the ManualMatchModal""" + print(f"🔧 Manual match resolved (Artists) - download_index: {resolved_track_info.get('download_index')}, table_index: {resolved_track_info.get('table_index')}") original_failed_track = next((t for t in self.permanently_failed_tracks if t['download_index'] == resolved_track_info['download_index']), None) if original_failed_track: self.permanently_failed_tracks.remove(original_failed_track) + print(f"✅ Removed track from permanently_failed_tracks (Artists) - remaining: {len(self.permanently_failed_tracks)}") + else: + print("⚠️ Could not find original failed track to remove (Artists)") self.update_failed_matches_button() class ArtistsPage(QWidget): @@ -2850,6 +2861,9 @@ class ArtistsPage(QWidget): self.download_status_timer.timeout.connect(self.poll_album_download_statuses) self.download_status_timer.start(2000) # Poll every 2 seconds (consistent with sync.py) self.download_status_pool = QThreadPool() + + # Initialize Plex scan manager (will be set when clients are connected) + self.scan_manager = None self.download_status_pool.setMaxThreadCount(1) # One worker at a time to avoid conflicts self._is_status_update_running = False @@ -2878,6 +2892,11 @@ class ArtistsPage(QWidget): self.soulseek_client.download_path = download_path print(f"✅ Set soulseek_client download path for ArtistsPage to: {download_path}") # --- END FIX --- + + # Initialize Plex scan manager now that clients are available + if self.plex_client: + self.scan_manager = PlexScanManager(self.plex_client, delay_seconds=60) + print("✅ PlexScanManager initialized for ArtistsPage") except Exception as e: print(f"Failed to initialize clients: {e}") diff --git a/ui/pages/sync.py b/ui/pages/sync.py index 409f4c87..d6e64f40 100644 --- a/ui/pages/sync.py +++ b/ui/pages/sync.py @@ -16,6 +16,7 @@ import asyncio from core.matching_engine import MusicMatchingEngine from ui.components.toast_manager import ToastType from database.music_database import get_database +from core.plex_scan_manager import PlexScanManager # Define constants for storage STORAGE_DIR = "storage" @@ -1984,6 +1985,11 @@ class SyncPage(QWidget): self.thread_pool = QThreadPool() self.thread_pool.setMaxThreadCount(3) # Limit concurrent Spotify API calls + # Initialize Plex scan manager + self.scan_manager = None + if self.plex_client: + self.scan_manager = PlexScanManager(self.plex_client, delay_seconds=60) + self.setup_ui() # Don't auto-load on startup, but do auto-load when page becomes visible @@ -3564,6 +3570,7 @@ class DownloadMissingTracksModal(QDialog): self.playlist = playlist self.playlist_item = playlist_item self.parent_page = parent_page + self.parent_sync_page = parent_page # Reference to sync page for scan manager self.downloads_page = downloads_page self.matching_engine = MusicMatchingEngine() # State tracking @@ -4163,6 +4170,7 @@ class DownloadMissingTracksModal(QDialog): # Update UI to show the new download has been queued spotify_based_result = self.create_spotify_based_search_result_from_validation(slskd_result, spotify_metadata) + print(f"🔧 Updating table at index {table_index} to '... Queued' for manual retry") self.track_table.setItem(table_index, 4, QTableWidgetItem("... Queued")) # Start the actual download process @@ -4380,6 +4388,7 @@ class DownloadMissingTracksModal(QDialog): track_info['completed'] = True 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 # --- FIX --- @@ -4387,6 +4396,7 @@ class DownloadMissingTracksModal(QDialog): 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")) self.failed_downloads += 1 if track_info not in self.permanently_failed_tracks: @@ -4421,9 +4431,13 @@ class DownloadMissingTracksModal(QDialog): def on_manual_match_resolved(self, resolved_track_info): """Handles a track being successfully resolved by the ManualMatchModal.""" + print(f"🔧 Manual match resolved - download_index: {resolved_track_info.get('download_index')}, table_index: {resolved_track_info.get('table_index')}") original_failed_track = next((t for t in self.permanently_failed_tracks if t['download_index'] == resolved_track_info['download_index']), None) if original_failed_track: self.permanently_failed_tracks.remove(original_failed_track) + print(f"✅ Removed track from permanently_failed_tracks - remaining: {len(self.permanently_failed_tracks)}") + else: + print("⚠️ Could not find original failed track to remove") self.update_failed_matches_button() def find_track_index_in_playlist(self, spotify_track): @@ -4441,6 +4455,10 @@ class DownloadMissingTracksModal(QDialog): # The process_finished signal is still emitted to unlock the main UI. self.process_finished.emit() + + # Request Plex library scan if we have successful downloads + 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)") # Determine the final message based on success or failure. if self.permanently_failed_tracks: