good
This commit is contained in:
parent
fc4a39ab8c
commit
dafbc3b1c5
1 changed files with 37 additions and 17 deletions
|
|
@ -6,6 +6,7 @@ from PyQt6.QtGui import QFont, QPalette, QColor
|
||||||
import time
|
import time
|
||||||
import asyncio
|
import asyncio
|
||||||
import threading
|
import threading
|
||||||
|
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||||
try:
|
try:
|
||||||
import resource
|
import resource
|
||||||
HAS_RESOURCE = True
|
HAS_RESOURCE = True
|
||||||
|
|
@ -36,6 +37,8 @@ class MetadataUpdateWorker(QThread):
|
||||||
self.processed_count = 0
|
self.processed_count = 0
|
||||||
self.successful_count = 0
|
self.successful_count = 0
|
||||||
self.failed_count = 0
|
self.failed_count = 0
|
||||||
|
self.max_workers = 4 # Same as your previous implementation
|
||||||
|
self.thread_lock = threading.Lock()
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
self.should_stop = True
|
self.should_stop = True
|
||||||
|
|
@ -63,30 +66,47 @@ class MetadataUpdateWorker(QThread):
|
||||||
|
|
||||||
total_artists = len(self.artists)
|
total_artists = len(self.artists)
|
||||||
|
|
||||||
for i, artist in enumerate(self.artists):
|
# Process artists in parallel using ThreadPoolExecutor
|
||||||
|
def process_single_artist(artist):
|
||||||
|
"""Process a single artist and return results"""
|
||||||
if self.should_stop:
|
if self.should_stop:
|
||||||
break
|
return None
|
||||||
|
|
||||||
artist_name = getattr(artist, 'title', 'Unknown Artist')
|
artist_name = getattr(artist, 'title', 'Unknown Artist')
|
||||||
self.progress_updated.emit(artist_name, i, total_artists, (i / total_artists) * 100)
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
success, details = self.update_artist_metadata(artist)
|
success, details = self.update_artist_metadata(artist)
|
||||||
self.processed_count += 1
|
return (artist_name, success, details)
|
||||||
|
|
||||||
if success:
|
|
||||||
self.successful_count += 1
|
|
||||||
else:
|
|
||||||
self.failed_count += 1
|
|
||||||
|
|
||||||
self.artist_updated.emit(artist_name, success, details)
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.failed_count += 1
|
return (artist_name, False, f"Error: {str(e)}")
|
||||||
self.artist_updated.emit(artist_name, False, f"Error: {str(e)}")
|
|
||||||
|
with ThreadPoolExecutor(max_workers=self.max_workers) as executor:
|
||||||
|
# Submit all tasks
|
||||||
|
future_to_artist = {executor.submit(process_single_artist, artist): artist
|
||||||
|
for artist in self.artists}
|
||||||
|
|
||||||
# Small delay to prevent overwhelming the APIs
|
# Process completed tasks as they finish
|
||||||
self.msleep(500)
|
for future in as_completed(future_to_artist):
|
||||||
|
if self.should_stop:
|
||||||
|
break
|
||||||
|
|
||||||
|
result = future.result()
|
||||||
|
if result is None: # Task was cancelled
|
||||||
|
continue
|
||||||
|
|
||||||
|
artist_name, success, details = result
|
||||||
|
|
||||||
|
with self.thread_lock:
|
||||||
|
self.processed_count += 1
|
||||||
|
if success:
|
||||||
|
self.successful_count += 1
|
||||||
|
else:
|
||||||
|
self.failed_count += 1
|
||||||
|
|
||||||
|
# Emit progress and result signals
|
||||||
|
progress_percent = (self.processed_count / total_artists) * 100
|
||||||
|
self.progress_updated.emit(artist_name, self.processed_count, total_artists, progress_percent)
|
||||||
|
self.artist_updated.emit(artist_name, success, details)
|
||||||
|
|
||||||
self.finished.emit(self.processed_count, self.successful_count, self.failed_count)
|
self.finished.emit(self.processed_count, self.successful_count, self.failed_count)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue