""" library_manager.py — Dialog til at se og fjerne musikbiblioteker. """ from PyQt6.QtWidgets import ( QDialog, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QListWidget, QListWidgetItem, QMessageBox, ) from PyQt6.QtCore import Qt, pyqtSignal class LibraryManagerDialog(QDialog): library_removed = pyqtSignal(int) # library_id def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle("Administrer musikbiblioteker") self.setMinimumWidth(500) self.setMinimumHeight(320) self._build_ui() self._load() def _build_ui(self): layout = QVBoxLayout(self) layout.setContentsMargins(16, 16, 16, 16) layout.setSpacing(10) lbl = QLabel("Aktive musikbiblioteker:") lbl.setObjectName("track_meta") layout.addWidget(lbl) self._list = QListWidget() layout.addWidget(self._list) note = QLabel( "Når du fjerner et bibliotek, slettes det fra overvågningen.\n" "Sangene forbliver i databasen men markeres som manglende (⚠)." ) note.setObjectName("result_count") note.setWordWrap(True) layout.addWidget(note) btn_row = QHBoxLayout() btn_add = QPushButton("+ Tilføj mappe") btn_add.clicked.connect(self._add_folder) btn_row.addWidget(btn_add) btn_remove = QPushButton("✕ Fjern valgt") btn_remove.clicked.connect(self._remove_selected) btn_row.addWidget(btn_remove) btn_scan = QPushButton("⟳ Scan alle") btn_scan.setToolTip("Scan alle mapper for nye og ændrede filer") btn_scan.clicked.connect(self._scan_all) btn_row.addWidget(btn_scan) btn_row.addStretch() btn_close = QPushButton("Luk") btn_close.clicked.connect(self.accept) btn_row.addWidget(btn_close) layout.addLayout(btn_row) def _load(self): self._list.clear() try: from local.local_db import get_libraries, get_db libs = get_libraries(active_only=True) # kun aktive for lib in libs: from pathlib import Path path = lib["path"] exists = Path(path).exists() last_scan = lib["last_full_scan"] or "aldrig" if isinstance(last_scan, str) and len(last_scan) > 10: last_scan = last_scan[:10] with get_db() as conn: count = conn.execute( "SELECT COUNT(*) FROM songs WHERE library_id=? AND file_missing=0", (lib["id"],) ).fetchone()[0] exist_icon = "" if exists else " ⚠ mappe ikke fundet" label = f"{path}{exist_icon}\n {count} sange · senest scannet: {last_scan}" item = QListWidgetItem(label) item.setData(Qt.ItemDataRole.UserRole, dict(lib)) if not exists: from PyQt6.QtGui import QColor item.setForeground(QColor("#5a6070")) self._list.addItem(item) except Exception as e: print(f"Library manager load fejl: {e}") def _scan_all(self): mw = self.parent() if hasattr(mw, "start_scan"): mw.start_scan() self._set_status("Scanning startet...") def _set_status(self, text: str): pass # kan udvides med statuslinje i dialogen def _add_folder(self): from PyQt6.QtWidgets import QFileDialog folder = QFileDialog.getExistingDirectory(self, "Vælg musikmappe") if folder: mw = self.parent() if hasattr(mw, "add_library_path"): mw.add_library_path(folder) # Genindlæs listen efter kort pause så DB er opdateret from PyQt6.QtCore import QTimer QTimer.singleShot(600, self._load) def _remove_selected(self): item = self._list.currentItem() if not item: return lib = item.data(Qt.ItemDataRole.UserRole) reply = QMessageBox.question( self, "Fjern bibliotek", f"Fjern overvågningen af:\n{lib['path']}\n\n" "Sange i biblioteket forbliver i databasen men markeres som manglende.", QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No, ) if reply == QMessageBox.StandardButton.Yes: try: mw = self.parent() if hasattr(mw, "_watcher") and mw._watcher: mw._watcher.remove_library(lib["id"]) else: from local.local_db import remove_library remove_library(lib["id"]) self.library_removed.emit(lib["id"]) if hasattr(mw, "_reload_library"): mw._reload_library() self._load() except Exception as e: QMessageBox.warning(self, "Fejl", f"Kunne ikke fjerne: {e}")