Bedre mappehåndtering

This commit is contained in:
2026-04-12 13:42:05 +02:00
parent d6cc22dc9a
commit bdb1f5915a
6 changed files with 417 additions and 639 deletions

View File

@@ -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))