Files
LinedanceAfspiller/linedance-app/ui/scan_worker.py
2026-04-25 21:28:31 +02:00

52 lines
1.8 KiB
Python

"""
scan_worker.py — QThread der scanner biblioteker i baggrunden.
Rapporterer fremgang via signals uden at blokere GUI.
"""
from PyQt6.QtCore import QThread, pyqtSignal
class ScanWorker(QThread):
progress = pyqtSignal(int, int, str) # done, total, filename
finished = pyqtSignal(int, str) # antal, library_path
error = pyqtSignal(str)
batch_ready = pyqtSignal(int) # antal sange scannet så langt
def __init__(self, library_id: int, library_path: str,
db_path: str, overwrite_bpm: bool = False):
super().__init__()
self._library_id = library_id
self._library_path = library_path
self._db_path = db_path
self._overwrite_bpm = overwrite_bpm
self._cancelled = False
def cancel(self):
self._cancelled = True
self.requestInterruption()
def run(self):
try:
from local.scanner import scan_library
self._batch_count = 0
def on_progress(done, total, filename):
if self.isInterruptionRequested():
raise InterruptedError()
self.progress.emit(done, total, filename)
self._batch_count += 1
if self._batch_count % 50 == 0:
self.batch_ready.emit(self._batch_count)
count = scan_library(
self._library_id,
self._library_path,
self._db_path,
overwrite_bpm=self._overwrite_bpm,
progress_callback=on_progress,
)
if not self._cancelled:
self.finished.emit(count, self._library_path)
except InterruptedError:
pass
except Exception as e:
self.error.emit(str(e))