From aee5995c1ab80ec1c067b25f723590e3b416d1a7 Mon Sep 17 00:00:00 2001 From: Broque Thomas Date: Sat, 9 Aug 2025 01:37:25 -0700 Subject: [PATCH] auto incremental update --- core/__pycache__/plex_client.cpython-312.pyc | Bin 37910 -> 40136 bytes .../plex_scan_manager.cpython-312.pyc | Bin 7638 -> 13562 bytes core/plex_client.py | 43 ++++++++ core/plex_scan_manager.py | 96 ++++++++++++++++- ui/pages/__pycache__/artists.cpython-312.pyc | Bin 249590 -> 254307 bytes ui/pages/__pycache__/sync.cpython-312.pyc | Bin 243211 -> 247907 bytes ui/pages/artists.py | 92 ++++++++++++++++ ui/pages/dashboard.py | 100 ++++++++++++++++++ ui/pages/sync.py | 91 ++++++++++++++++ 9 files changed, 419 insertions(+), 3 deletions(-) diff --git a/core/__pycache__/plex_client.cpython-312.pyc b/core/__pycache__/plex_client.cpython-312.pyc index 22ed4406487a9bd6023bef2e033e03e66dceb66f..b3944cdc215182d26d34ac891e8dc81d24eb584e 100644 GIT binary patch delta 2027 zcmZ`(Z%h+s7=Q1s|E|6MftGqjDpyOvLP40@To^_KEXq2jQ}GX(to9CDVTE0?+O52un1XANCEA4~u@;`}QbB=HBF<_ul9E zJ-_GA``mpsjo<$XH$2emwE(U^6_delM{gTODD1g7NljxFV!i%xg@<)=6pM3;P6b;s ztUTvpw`yEaQ_5Ddr4Uml)*9@Ud!VLFK4<*&oRyp$|l`(F5Y0-d%WHE#B=dQe`yfk)O?&@z_!d24X4&AOW(9-??;_814iDEvErM z3E+1RX^`=NDXw|B3ughFH>A0&8LgA|eykr15NAO@_8$fkF?5;Z1yk`ZFPTrD$5dKe)jbi-FSK1gk}r3w`{Xw0562_+)IX!$leIhl|ALI72s>0dUX z802;~_C&i`W=qeu=UmIQMqS%TTYFw6VpvY#0z!gg2g?rgd=D>Q0160ibIV0$uMd`@ z=TAUZz8#4K5-mt@NCc6%j06e4z-8^02KFND3KEk@_@QuX`S;Mf0)sR%0dnJY$XB!B z8(Y?A-#SoRmkqfi>g}>A7o>wjCGY`A8bQB2W^?f#cw9DzA{`qwbz}<~+y!SgG0@l@ zf^%B+3cv{b`$TTQls*NIjOMh_l{C6i#P}m0lGd6T&!Y96`FL&iZ-#yzzcaI(tz%6OrKhuY550`>p%nXvR+n~H>z>qXrq4{1Z>CGeV?WMgGv7lB$%|a2S zgsO!+0v#-*_aL!gr@ghrLaow!aQ15aEv+gKO=iCM;K~>_JKO%*gvwEbG-#OJN_mcD z2-5xtwfs);W4l>ou6c1CAqKB~kGVzb*snSh0%UxP#V2D9%sZ{0; rOP-uTDFD6gtS;43^*@5?=q;`sODo+YiDoYwm zib@M>lxm7jiYibfb`Fp}smUR;UoxsqwwqJUAIHV0 M`-uTW7MTO(0LJn{3jhEB diff --git a/core/__pycache__/plex_scan_manager.cpython-312.pyc b/core/__pycache__/plex_scan_manager.cpython-312.pyc index 5b2c26c3869eb569a7b975f54ea84be9fabcb356..1586e0869ad433754e19c8bb4e91c2a28ea5b18c 100644 GIT binary patch literal 13562 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 T?}?Im`vgM|)AuNHBclEfRI1!d delta 1554 zcmZWpZA@EL7(VBIw71`-AGg^`TkIETf;?|{4fe#Xkc+u@`jH%fR4Wf=H5-VmO`gofQt zqa(ERTV(zv=D;h6px5p*XsR)?4GVl&@3ik&oeRTnaUa&eFIrJgsI}Du@R9aPbO&t! z#gT$17>ouGCf_7?f*n8;I3mDH!U8;@11GIpHc~KAsG(qkOJO2PIka! z`etj0Mpg+-qp}&9ZBWqPteI=-?PQm^o@Uambn+=4;xQLQ z;8z=OFcX4%4Ll9C@VZ+NPU0ynr}7-c_IO~9OkC1>HKaf^D#AsV8~(7{$vnMblF4)T z*PgRGt&*^HMr5)F&eeKhIBGSXS*Vs9KzT2GYu^Ru?RHVp(UZNz{BO;Y=K*MOh~!)! zc6`eJG%I3?}Gpqv}YJzLewKti&Of{qS4;5O^1lWBEwEe%*Q%Ftjg zGc-Q-{IP64E6FPHXU+y6mA9l-jt>oG6{Uo;3QGcYRA#!^1B~c*brDm!OJEw^Hr1R> zpH5ehR_B8b(Jhd^tU6DNyIdO<;@+_#o#m|IwBZLw+YO<;%$eb$81~)KpqkwmEc2EE zQ%Kzkwp|al{b+5!Wj%1+df+E(H+;99tRg-XOR%3fdlT$(tlQVyg;tCqiV42AL%Y(Y zOSQAtv<;~wdo9Tm8~WoS&OssE3a|R#g+qZjL<4p>6L=IqRa^}`f*Z8k1l+n}Zd#la$m(VRa~L3`JTpM_$nIic!5U41h#36bvLSa)8$kaK(%UL5=EAvpRiNO7&@NrWVzgYae z=^cz?Fx!$a{%7>dmMESrR$7YKt#Vf1;trC}6ZLo={!E-QSV}@BlN%h%W-=h}jlAq6 zb4#p}mt`udtmY3=ieG=#qZ+l3dAAZTEfkT*7iI2KD-u-vwU<-Z{a; z+!2lXI!auAWGoBQ$=aY=rkeX88Q bool: + """Check if Plex library is currently scanning""" + if not self.ensure_connection(): + logger.debug(f"🔍 DEBUG: Not connected to Plex, cannot check scan status") + return False + + try: + library = self.server.library.section(library_name) + + # Check if library has a scanning attribute or is refreshing + # The Plex API exposes this through the library's refreshing property + refreshing = hasattr(library, 'refreshing') and library.refreshing + logger.debug(f"🔍 DEBUG: Library.refreshing = {refreshing}") + + if refreshing: + logger.debug(f"🔍 DEBUG: Library is refreshing") + return True + + # Alternative method: Check server activities for scanning + try: + activities = self.server.activities() + logger.debug(f"🔍 DEBUG: Found {len(activities)} server activities") + + for activity in activities: + # Look for library scan activities + activity_type = getattr(activity, 'type', 'unknown') + activity_title = getattr(activity, 'title', 'unknown') + logger.debug(f"🔍 DEBUG: Activity - type: {activity_type}, title: {activity_title}") + + if (activity_type in ['library.scan', 'library.refresh'] and + library_name.lower() in activity_title.lower()): + logger.debug(f"🔍 DEBUG: Found matching scan activity: {activity_title}") + return True + except Exception as activities_error: + logger.debug(f"Could not check server activities: {activities_error}") + + logger.debug(f"🔍 DEBUG: No scan activity detected") + return False + + except Exception as e: + logger.debug(f"Error checking if library is scanning: {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 index 06ca8602..185d754a 100644 --- a/core/plex_scan_manager.py +++ b/core/plex_scan_manager.py @@ -31,6 +31,9 @@ class PlexScanManager: self._scan_in_progress = False self._downloads_during_scan = False self._lock = threading.Lock() + self._scan_completion_callbacks = [] # List of callback functions to call when scan completes + self._scan_start_time = None # Track when scan started for timeout + self._max_scan_time = 1800 # Maximum scan time in seconds (30 minutes) logger.info(f"PlexScanManager initialized with {delay_seconds}s debounce delay") @@ -41,6 +44,7 @@ class PlexScanManager: Args: reason: Optional reason for the scan request (for logging) """ + logger.info(f"🔍 DEBUG: Plex scan requested - reason: {reason}") with self._lock: if self._scan_in_progress: # Plex is currently scanning - mark that we need another scan later @@ -59,6 +63,31 @@ class PlexScanManager: self._timer = threading.Timer(self.delay, self._execute_scan) self._timer.start() + def add_scan_completion_callback(self, callback): + """ + Add a callback function to be called when scan completes. + + Args: + callback: Function to call when scan completes (no arguments) + """ + with self._lock: + if callback not in self._scan_completion_callbacks: + self._scan_completion_callbacks.append(callback) + logger.info(f"🔍 DEBUG: Added scan completion callback: {callback.__name__}") + logger.info(f"🔍 DEBUG: Total callbacks registered: {len(self._scan_completion_callbacks)}") + + def remove_scan_completion_callback(self, callback): + """ + Remove a previously registered callback. + + Args: + callback: Function to remove from callbacks + """ + with self._lock: + if callback in self._scan_completion_callbacks: + self._scan_completion_callbacks.remove(callback) + logger.debug(f"Removed scan completion callback: {callback.__name__}") + def _execute_scan(self): """Execute the actual Plex library scan""" with self._lock: @@ -69,6 +98,7 @@ class PlexScanManager: self._scan_in_progress = True self._downloads_during_scan = False self._timer = None + self._scan_start_time = time.time() logger.info("🎵 Starting Plex library scan...") @@ -77,9 +107,8 @@ class PlexScanManager: 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() + # Start polling to detect when scan actually completes + self._start_scan_monitoring() else: logger.error("❌ Failed to initiate Plex library scan") self._reset_scan_state() @@ -88,6 +117,49 @@ class PlexScanManager: logger.error(f"Exception during Plex library scan: {e}") self._reset_scan_state() + def _start_scan_monitoring(self): + """Start monitoring Plex scan status with polling""" + try: + # Initial delay before starting to poll (let scan actually start) + threading.Timer(15, self._poll_scan_status).start() + logger.debug("Started Plex scan status monitoring (30-second intervals, 30-minute timeout)") + except Exception as e: + logger.error(f"Error starting scan monitoring: {e}") + self._reset_scan_state() + + def _poll_scan_status(self): + """Poll Plex to check if library scan is still running""" + try: + with self._lock: + if not self._scan_in_progress: + logger.debug("Scan no longer in progress, stopping polling") + return + + # Check for timeout + if self._scan_start_time and (time.time() - self._scan_start_time) > self._max_scan_time: + logger.warning(f"Plex scan timeout reached ({self._max_scan_time}s), assuming completion") + self._scan_completed() + return + + # Check if Plex is still scanning + is_scanning = self.plex_client.is_library_scanning("Music") + logger.info(f"🔍 DEBUG: Plex scan status check - is_scanning: {is_scanning}") + + if is_scanning: + # Still scanning, poll again in 30 seconds + logger.info("🔍 DEBUG: Plex library still scanning, will check again in 30 seconds") + threading.Timer(30, self._poll_scan_status).start() + else: + # Scan completed! + elapsed_time = time.time() - self._scan_start_time if self._scan_start_time else 0 + logger.info(f"🎵 Plex library scan detected as completed (took {elapsed_time:.1f} seconds)") + self._scan_completed() + + except Exception as e: + logger.error(f"Error polling scan status: {e}") + # Fallback to assuming completion after error + self._scan_completed() + def _scan_completed(self): """Called when we assume the scan has completed""" with self._lock: @@ -103,6 +175,9 @@ class PlexScanManager: logger.info("📡 Plex library scan completed") + # Call registered completion callbacks + self._call_completion_callbacks() + # Check if we need a follow-up scan if downloads_during_scan: logger.info("🔄 Downloads occurred during scan - triggering follow-up scan") @@ -110,10 +185,25 @@ class PlexScanManager: else: logger.info("✅ No downloads during scan - scan cycle complete") + def _call_completion_callbacks(self): + """Call all registered scan completion callbacks""" + with self._lock: + callbacks = self._scan_completion_callbacks.copy() # Copy to avoid lock issues + + logger.info(f"🔍 DEBUG: Calling {len(callbacks)} scan completion callbacks") + for callback in callbacks: + try: + logger.info(f"🔍 DEBUG: Executing callback: {callback.__name__}") + callback() + logger.info(f"🔍 DEBUG: Callback {callback.__name__} completed successfully") + except Exception as e: + logger.error(f"Error in scan completion callback {callback.__name__}: {e}") + def _reset_scan_state(self): """Reset scan state after an error""" with self._lock: self._scan_in_progress = False + self._scan_start_time = None def force_scan(self): """ diff --git a/ui/pages/__pycache__/artists.cpython-312.pyc b/ui/pages/__pycache__/artists.cpython-312.pyc index f40a3a7c8ab6c4175349521b221a6a2d61cd0413..1e728b0e9c5db432822169ff3519ef0741fc6991 100644 GIT binary patch delta 31725 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 delta 31091 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 e?MH=+^t 0: + logger.info(f"✅ Automatic database update completed: {successful} items processed successfully") + else: + logger.info("💡 Automatic database update completed - no new content found") + + # Clean up the worker + if hasattr(self, '_auto_database_worker'): + self._auto_database_worker.deleteLater() + delattr(self, '_auto_database_worker') + + except Exception as e: + logger.error(f"Error handling automatic update completion: {e}") + + def _on_auto_update_error(self, error_message): + """Handle error in automatic database update""" + logger.warning(f"Automatic database update encountered an error: {error_message}") + + # Clean up the worker + if hasattr(self, '_auto_database_worker'): + self._auto_database_worker.deleteLater() + delattr(self, '_auto_database_worker') + def setup_clients(self): """Initialize client connections""" try: @@ -3014,6 +3104,8 @@ class ArtistsPage(QWidget): # Initialize Plex scan manager now that clients are available if self.plex_client: self.scan_manager = PlexScanManager(self.plex_client, delay_seconds=60) + # Add automatic incremental database update after Plex scan completion + self.scan_manager.add_scan_completion_callback(self._on_plex_scan_completed) print("✅ PlexScanManager initialized for ArtistsPage") except Exception as e: diff --git a/ui/pages/dashboard.py b/ui/pages/dashboard.py index 84bdf3e5..c6b3712d 100644 --- a/ui/pages/dashboard.py +++ b/ui/pages/dashboard.py @@ -2377,6 +2377,14 @@ class DashboardPage(QWidget): 'soulseek_client': soulseek_client, 'downloads_page': downloads_page } + + # Initialize Plex scan manager for wishlist modal integration + self.scan_manager = None + if plex_client: + self.scan_manager = PlexScanManager(plex_client, delay_seconds=60) + # Add automatic incremental database update after Plex scan completion + self.scan_manager.add_scan_completion_callback(self._on_plex_scan_completed) + logger.info("✅ PlexScanManager initialized for Dashboard wishlist modal") def set_page_references(self, downloads_page, sync_page): """Called from main window to provide page references for live data""" @@ -2392,6 +2400,98 @@ class DashboardPage(QWidget): """Set the toast manager for showing notifications""" self.toast_manager = toast_manager + def _on_plex_scan_completed(self): + """Callback triggered when Plex scan completes - start automatic incremental database update""" + try: + # Import here to avoid circular imports + from database import get_database + from core.database_update_worker import DatabaseUpdateWorker + + # Check if we should run incremental update + plex_client = self.service_clients.get('plex_client') + if not plex_client or not plex_client.is_connected(): + logger.debug("Plex not connected - skipping automatic database update") + return + + # Check if database has a previous full refresh + database = get_database() + last_full_refresh = database.get_last_full_refresh() + if not last_full_refresh: + logger.info("No previous full refresh found - skipping automatic incremental update") + return + + # Check if database has sufficient content + try: + stats = database.get_database_info() + track_count = stats.get('tracks', 0) + + if track_count < 100: + logger.info(f"Database has only {track_count} tracks - skipping automatic incremental update") + return + except Exception as e: + logger.warning(f"Could not check database stats - skipping automatic update: {e}") + return + + # All conditions met - start incremental update + logger.info("🎵 Starting automatic incremental database update after Plex scan") + self._start_automatic_incremental_update() + + except Exception as e: + logger.error(f"Error in Plex scan completion callback: {e}") + + def _start_automatic_incremental_update(self): + """Start the automatic incremental database update""" + try: + from core.database_update_worker import DatabaseUpdateWorker + + # Avoid duplicate workers + if hasattr(self, '_auto_database_worker') and self._auto_database_worker and self._auto_database_worker.isRunning(): + logger.debug("Automatic database update already running") + return + + # Create worker for incremental update only + plex_client = self.service_clients.get('plex_client') + self._auto_database_worker = DatabaseUpdateWorker( + plex_client, + "database/music_library.db", + full_refresh=False # Always incremental for automatic updates + ) + + # Connect completion signal to log result + self._auto_database_worker.finished.connect(self._on_auto_update_finished) + self._auto_database_worker.error.connect(self._on_auto_update_error) + + # Start the update + self._auto_database_worker.start() + + except Exception as e: + logger.error(f"Error starting automatic incremental update: {e}") + + def _on_auto_update_finished(self, total_artists, total_albums, total_tracks, successful, failed): + """Handle completion of automatic database update""" + try: + if successful > 0: + logger.info(f"✅ Automatic database update completed: {successful} items processed successfully") + else: + logger.info("💡 Automatic database update completed - no new content found") + + # Clean up the worker + if hasattr(self, '_auto_database_worker'): + self._auto_database_worker.deleteLater() + delattr(self, '_auto_database_worker') + + except Exception as e: + logger.error(f"Error handling automatic update completion: {e}") + + def _on_auto_update_error(self, error_message): + """Handle error in automatic database update""" + logger.warning(f"Automatic database update encountered an error: {error_message}") + + # Clean up the worker + if hasattr(self, '_auto_database_worker'): + self._auto_database_worker.deleteLater() + delattr(self, '_auto_database_worker') + def setup_ui(self): self.setStyleSheet(""" DashboardPage { diff --git a/ui/pages/sync.py b/ui/pages/sync.py index b1adeb48..babedeaf 100644 --- a/ui/pages/sync.py +++ b/ui/pages/sync.py @@ -1994,6 +1994,8 @@ class SyncPage(QWidget): self.scan_manager = None if self.plex_client: self.scan_manager = PlexScanManager(self.plex_client, delay_seconds=60) + # Add automatic incremental database update after Plex scan completion + self.scan_manager.add_scan_completion_callback(self._on_plex_scan_completed) self.setup_ui() @@ -2005,6 +2007,95 @@ class SyncPage(QWidget): """Set the toast manager for showing notifications""" self.toast_manager = toast_manager + def _on_plex_scan_completed(self): + """Callback triggered when Plex scan completes - start automatic incremental database update""" + try: + # Import here to avoid circular imports + from database import get_database + from core.database_update_worker import DatabaseUpdateWorker + + # Check if we should run incremental update + if not self.plex_client or not self.plex_client.is_connected(): + logger.debug("Plex not connected - skipping automatic database update") + return + + # Check if database has a previous full refresh + database = get_database() + last_full_refresh = database.get_last_full_refresh() + if not last_full_refresh: + logger.info("No previous full refresh found - skipping automatic incremental update") + return + + # Check if database has sufficient content + try: + stats = database.get_database_info() + track_count = stats.get('tracks', 0) + + if track_count < 100: + logger.info(f"Database has only {track_count} tracks - skipping automatic incremental update") + return + except Exception as e: + logger.warning(f"Could not check database stats - skipping automatic update: {e}") + return + + # All conditions met - start incremental update + logger.info("🎵 Starting automatic incremental database update after Plex scan") + self._start_automatic_incremental_update() + + except Exception as e: + logger.error(f"Error in Plex scan completion callback: {e}") + + def _start_automatic_incremental_update(self): + """Start the automatic incremental database update""" + try: + from core.database_update_worker import DatabaseUpdateWorker + + # Avoid duplicate workers + if hasattr(self, '_auto_database_worker') and self._auto_database_worker and self._auto_database_worker.isRunning(): + logger.debug("Automatic database update already running") + return + + # Create worker for incremental update only + self._auto_database_worker = DatabaseUpdateWorker( + self.plex_client, + "database/music_library.db", + full_refresh=False # Always incremental for automatic updates + ) + + # Connect completion signal to log result + self._auto_database_worker.finished.connect(self._on_auto_update_finished) + self._auto_database_worker.error.connect(self._on_auto_update_error) + + # Start the update + self._auto_database_worker.start() + + except Exception as e: + logger.error(f"Error starting automatic incremental update: {e}") + + def _on_auto_update_finished(self, total_artists, total_albums, total_tracks, successful, failed): + """Handle completion of automatic database update""" + try: + if successful > 0: + logger.info(f"✅ Automatic database update completed: {successful} items processed successfully") + else: + logger.info("💡 Automatic database update completed - no new content found") + + # Clean up the worker + if hasattr(self, '_auto_database_worker'): + self._auto_database_worker.deleteLater() + delattr(self, '_auto_database_worker') + + except Exception as e: + logger.error(f"Error handling automatic update completion: {e}") + + def _on_auto_update_error(self, error_message): + """Handle error in automatic database update""" + logger.warning(f"Automatic database update encountered an error: {error_message}") + + # Clean up the worker + if hasattr(self, '_auto_database_worker'): + self._auto_database_worker.deleteLater() + delattr(self, '_auto_database_worker') def _update_and_save_sync_status(self, playlist_id, result, snapshot_id): """Updates the sync status for a given playlist and saves to file."""