From 3af8c941b0d5d1c7bd1d9b8317283df76c88c3a9 Mon Sep 17 00:00:00 2001 From: Broque Thomas <26755000+Nezreka@users.noreply.github.com> Date: Thu, 5 Mar 2026 22:10:28 -0800 Subject: [PATCH] speed up discovery node --- web_server.py | 50 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/web_server.py b/web_server.py index f7079073..0a861bb9 100644 --- a/web_server.py +++ b/web_server.py @@ -20106,25 +20106,41 @@ def _run_playlist_discovery_worker(playlists, automation_id=None): _update_automation_progress(automation_id, phase=f'Discovering: "{pl_name}"', log_line=f'Playlist "{pl_name}" — {len(tracks)} tracks ({discovery_source.upper()})', log_type='info') - for i, track in enumerate(tracks): - total_tracks += 1 - track_id = track['id'] - track_name = track.get('track_name', '') - artist_name = track.get('artist_name', '') - duration_ms = track.get('duration_ms', 0) - - # Check if already discovered + # Fast pre-scan: separate already-discovered from undiscovered + undiscovered_tracks = [] + pl_skipped = 0 + for track in tracks: existing_extra = {} if track.get('extra_data'): try: existing_extra = json.loads(track['extra_data']) if isinstance(track['extra_data'], str) else track['extra_data'] except (json.JSONDecodeError, TypeError): pass - if existing_extra.get('discovered'): + pl_skipped += 1 total_skipped += 1 - _update_automation_progress(automation_id, log_line=f'Already discovered: {track_name}', log_type='skip') - continue + else: + undiscovered_tracks.append(track) + + if pl_skipped > 0: + _update_automation_progress(automation_id, + log_line=f'{pl_skipped} tracks already discovered — skipped', log_type='skip') + + if not undiscovered_tracks: + _update_automation_progress(automation_id, + progress=((total_skipped + total_discovered + total_failed) / max(1, grand_total)) * 100, + log_line=f'All {len(tracks)} tracks already discovered', log_type='skip') + continue + + _update_automation_progress(automation_id, + log_line=f'{len(undiscovered_tracks)} tracks to discover', log_type='info') + + for i, track in enumerate(undiscovered_tracks): + total_tracks += 1 + track_id = track['id'] + track_name = track.get('track_name', '') + artist_name = track.get('artist_name', '') + duration_ms = track.get('duration_ms', 0) # Step 1: Check discovery cache cache_key = _get_discovery_cache_key(track_name, artist_name) @@ -20139,9 +20155,9 @@ def _run_playlist_discovery_worker(playlists, automation_id=None): } db.update_mirrored_track_extra_data(track_id, extra_data) total_discovered += 1 - print(f"⚡ CACHE [{i+1}/{len(tracks)}]: {track_name} → {cached_match.get('name', '?')}") + print(f"⚡ CACHE [{i+1}/{len(undiscovered_tracks)}]: {track_name} → {cached_match.get('name', '?')}") _update_automation_progress(automation_id, - progress=(total_tracks / max(1, grand_total)) * 100, + progress=((total_skipped + total_discovered + total_failed) / max(1, grand_total)) * 100, current_item=track_name, log_line=f'{track_name} → {cached_match.get("name", "?")} (cache)', log_type='success') continue @@ -20235,9 +20251,9 @@ def _run_playlist_discovery_worker(playlists, automation_id=None): except Exception: pass - print(f"✅ [{i+1}/{len(tracks)}] {track_name} → {matched_data['name']} ({best_confidence:.2f})") + print(f"✅ [{i+1}/{len(undiscovered_tracks)}] {track_name} → {matched_data['name']} ({best_confidence:.2f})") _update_automation_progress(automation_id, - progress=(total_tracks / max(1, grand_total)) * 100, + progress=((total_skipped + total_discovered + total_failed) / max(1, grand_total)) * 100, processed=total_discovered + total_failed, current_item=f'{track_name} - {artist_name}', log_line=f'{track_name} → {matched_data["name"]} ({best_confidence:.2f})', log_type='success') @@ -20249,9 +20265,9 @@ def _run_playlist_discovery_worker(playlists, automation_id=None): } db.update_mirrored_track_extra_data(track_id, extra_data) total_failed += 1 - print(f"❌ [{i+1}/{len(tracks)}] No match: {track_name} by {artist_name}") + print(f"❌ [{i+1}/{len(undiscovered_tracks)}] No match: {track_name} by {artist_name}") _update_automation_progress(automation_id, - progress=(total_tracks / max(1, grand_total)) * 100, + progress=((total_skipped + total_discovered + total_failed) / max(1, grand_total)) * 100, processed=total_discovered + total_failed, current_item=f'{track_name} - {artist_name}', log_line=f'{track_name} by {artist_name} → no match', log_type='error')