Bedre mappehåndtering
This commit is contained in:
@@ -1,64 +1,47 @@
|
||||
"""
|
||||
scan_worker.py — Kører fuld biblioteks-scanning i en baggrundstråd
|
||||
så GUI ikke fryser.
|
||||
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):
|
||||
"""
|
||||
Kører _full_scan_all() i en baggrundstråd.
|
||||
Sender status-opdateringer undervejs.
|
||||
"""
|
||||
status_update = pyqtSignal(str) # løbende statusbeskeder
|
||||
scan_done = pyqtSignal(int) # antal behandlede filer
|
||||
progress = pyqtSignal(int, int, str) # done, total, filename
|
||||
finished = pyqtSignal(int, str) # antal, library_path
|
||||
error = pyqtSignal(str)
|
||||
|
||||
def __init__(self, watcher, parent=None):
|
||||
super().__init__(parent)
|
||||
self._watcher = watcher
|
||||
self._total = 0
|
||||
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.local_db import get_libraries
|
||||
from local.tag_reader import is_supported
|
||||
import os
|
||||
libraries = get_libraries(active_only=True)
|
||||
from local.scanner import scan_library
|
||||
|
||||
if not libraries:
|
||||
self.status_update.emit("Ingen biblioteker konfigureret")
|
||||
self.scan_done.emit(0)
|
||||
return
|
||||
|
||||
total_processed = 0
|
||||
for lib in libraries:
|
||||
from pathlib import Path
|
||||
path = Path(lib["path"])
|
||||
name = path.name
|
||||
|
||||
if not path.exists():
|
||||
self.status_update.emit(f"⚠ Mappe ikke fundet: {path}")
|
||||
continue
|
||||
|
||||
self.status_update.emit(f"Scanner: {name}...")
|
||||
|
||||
# Tæl filer med os.walk — håndterer permission-fejl sikkert
|
||||
count = 0
|
||||
for dirpath, _, filenames in os.walk(str(path), followlinks=False):
|
||||
for f in filenames:
|
||||
if is_supported(f):
|
||||
count += 1
|
||||
|
||||
self.status_update.emit(f"Scanner: {name} ({count} filer)...")
|
||||
|
||||
# Kør scanning
|
||||
self._watcher._full_scan_library(lib["id"], str(path))
|
||||
total_processed += count
|
||||
|
||||
self.status_update.emit(f"Scan færdig — {total_processed} filer gennemgået")
|
||||
self.scan_done.emit(total_processed)
|
||||
def on_progress(done, total, filename):
|
||||
if self.isInterruptionRequested():
|
||||
raise InterruptedError()
|
||||
self.progress.emit(done, total, filename)
|
||||
|
||||
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.status_update.emit(f"Scan fejl: {e}")
|
||||
self.scan_done.emit(0)
|
||||
self.error.emit(str(e))
|
||||
|
||||
Reference in New Issue
Block a user