From 7652afe95575962344cb7c763aa724aa50a33d8a Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 23 Jul 2026 20:54:14 +0200 Subject: [PATCH] Deploy-Befunde gefixt: Disc-Typ-Verlust, giftiger Prescan-Cache, caps-Import MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Pre-Scan verlor den erkannten Typ (BDs hiessen immer "DVD"): scan() reicht disc_type jetzt in die Zweige durch - GIFTIG: Cache-Key nur aus Geraetepfad — die naechste Disc im selben Laufwerk haette die Metadaten der vorherigen geerbt. Key enthaelt jetzt einen Disc-Fingerabdruck (Label|Groesse) - Worker-Faehigkeiten: import caps auf Modulebene — im worker_ready-Signal war /app nicht mehr im sys.path (ModuleNotFoundError im Deploy-Log) Co-Authored-By: Claude Fable 5 --- docker/api/cache/keys.py | 11 ++++++++--- docker/api/prescan/prescan.py | 14 ++++++++++++-- docker/worker/celery_app.py | 9 ++++++--- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/docker/api/cache/keys.py b/docker/api/cache/keys.py index cb4691c..c8a11ed 100644 --- a/docker/api/cache/keys.py +++ b/docker/api/cache/keys.py @@ -30,10 +30,15 @@ FALLBACK_YEAR: Final[int] = 2000 FALLBACK_TITLE: Final[str] = "Unbekannter Titel" -def generate_prescan_key(device_path: str, is_audio: bool = False) -> str: - """Generiere Cache-Key für Pre-Scan.""" +def generate_prescan_key(device_path: str, is_audio: bool = False, fingerprint: str = "") -> str: + """Generiere Cache-Key für Pre-Scan. + + fingerprint (Label+Größe der DISC) ist Pflichtbestandteil seit 23.07.: + Ein Key nur aus dem Gerätepfad servierte der NÄCHSTEN Disc im selben + Laufwerk die Metadaten der vorherigen. + """ prefix = PRESCAN_AUDIO_PREFIX if is_audio else PRESCAN_VIDEO_PREFIX - return f"{prefix}{device_path}" + return f"{prefix}{device_path}:{fingerprint}" def generate_confirmed_key(title: str, year: Optional[int] = None) -> str: diff --git a/docker/api/prescan/prescan.py b/docker/api/prescan/prescan.py index 11dc158..6af7523 100644 --- a/docker/api/prescan/prescan.py +++ b/docker/api/prescan/prescan.py @@ -143,6 +143,16 @@ class PreScan: """Führe Pre-Scan durch.""" disc_type = self._detect_disc_type(device_path) toc = self._read_toc(device_path, disc_type) + # Typ + Disc-Fingerabdruck (Label|Größe) an die Zweige durchreichen — + # der Typ ging vorher verloren (BDs hießen immer "DVD"), und der + # Cache-Key braucht den Fingerabdruck (sonst erbt die nächste Disc + # die Metadaten der vorherigen). + toc["disc_type"] = disc_type + try: + groesse = detection.disc_size_bytes(device_path) + except OSError: + groesse = 0 + toc["fingerprint"] = f"{toc.get('title') or 'unbekannt'}|{groesse}" if disc_type == "CD": return self._scan_audio(device_path, toc) @@ -214,7 +224,7 @@ class PreScan: def _scan_audio(self, device_path: str, toc: Dict) -> PreScanResult: """Pre-Scan für Audio-CD.""" - cache_key = generate_prescan_key(device_path, is_audio=True) + cache_key = generate_prescan_key(device_path, is_audio=True, fingerprint=toc.get("fingerprint", "")) cached = get(cache_key) if cached: return PreScanResult(**cached) @@ -267,7 +277,7 @@ class PreScan: def _scan_video(self, device_path: str, toc: Dict) -> PreScanResult: """Pre-Scan für DVD/Blu-ray.""" - cache_key = generate_prescan_key(device_path, is_audio=False) + cache_key = generate_prescan_key(device_path, is_audio=False, fingerprint=toc.get("fingerprint", "")) cached = get(cache_key) if cached: return PreScanResult(**cached) diff --git a/docker/worker/celery_app.py b/docker/worker/celery_app.py index 0823233..d309d92 100644 --- a/docker/worker/celery_app.py +++ b/docker/worker/celery_app.py @@ -23,12 +23,15 @@ celery_app.conf.update( ) +# Import auf Modulebene: im worker_ready-Signal ist /app nicht mehr +# zuverlässig im sys.path (ModuleNotFoundError 'caps', Deploy 23.07.). +import caps # noqa: E402 +import db # noqa: E402 + + @worker_ready.connect def melde_faehigkeiten(**kwargs): """Beim Start: eigene Encoder-Fähigkeiten in die DB melden (UI-Anzeige).""" - import caps - import db - try: db.init_db() db.save_worker(socket.gethostname(), caps.erkenne_encoder())