Deploy-Befunde gefixt: Disc-Typ-Verlust, giftiger Prescan-Cache, caps-Import
Ampel / ampel (push) Failing after 28s
Ampel / ampel (push) Failing after 28s
- 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 <noreply@anthropic.com>
This commit is contained in:
Vendored
+8
-3
@@ -30,10 +30,15 @@ FALLBACK_YEAR: Final[int] = 2000
|
|||||||
FALLBACK_TITLE: Final[str] = "Unbekannter Titel"
|
FALLBACK_TITLE: Final[str] = "Unbekannter Titel"
|
||||||
|
|
||||||
|
|
||||||
def generate_prescan_key(device_path: str, is_audio: bool = False) -> str:
|
def generate_prescan_key(device_path: str, is_audio: bool = False, fingerprint: str = "") -> str:
|
||||||
"""Generiere Cache-Key für Pre-Scan."""
|
"""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
|
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:
|
def generate_confirmed_key(title: str, year: Optional[int] = None) -> str:
|
||||||
|
|||||||
@@ -143,6 +143,16 @@ class PreScan:
|
|||||||
"""Führe Pre-Scan durch."""
|
"""Führe Pre-Scan durch."""
|
||||||
disc_type = self._detect_disc_type(device_path)
|
disc_type = self._detect_disc_type(device_path)
|
||||||
toc = self._read_toc(device_path, disc_type)
|
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":
|
if disc_type == "CD":
|
||||||
return self._scan_audio(device_path, toc)
|
return self._scan_audio(device_path, toc)
|
||||||
@@ -214,7 +224,7 @@ class PreScan:
|
|||||||
|
|
||||||
def _scan_audio(self, device_path: str, toc: Dict) -> PreScanResult:
|
def _scan_audio(self, device_path: str, toc: Dict) -> PreScanResult:
|
||||||
"""Pre-Scan für Audio-CD."""
|
"""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)
|
cached = get(cache_key)
|
||||||
if cached:
|
if cached:
|
||||||
return PreScanResult(**cached)
|
return PreScanResult(**cached)
|
||||||
@@ -267,7 +277,7 @@ class PreScan:
|
|||||||
|
|
||||||
def _scan_video(self, device_path: str, toc: Dict) -> PreScanResult:
|
def _scan_video(self, device_path: str, toc: Dict) -> PreScanResult:
|
||||||
"""Pre-Scan für DVD/Blu-ray."""
|
"""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)
|
cached = get(cache_key)
|
||||||
if cached:
|
if cached:
|
||||||
return PreScanResult(**cached)
|
return PreScanResult(**cached)
|
||||||
|
|||||||
@@ -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
|
@worker_ready.connect
|
||||||
def melde_faehigkeiten(**kwargs):
|
def melde_faehigkeiten(**kwargs):
|
||||||
"""Beim Start: eigene Encoder-Fähigkeiten in die DB melden (UI-Anzeige)."""
|
"""Beim Start: eigene Encoder-Fähigkeiten in die DB melden (UI-Anzeige)."""
|
||||||
import caps
|
|
||||||
import db
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
db.init_db()
|
db.init_db()
|
||||||
db.save_worker(socket.gethostname(), caps.erkenne_encoder())
|
db.save_worker(socket.gethostname(), caps.erkenne_encoder())
|
||||||
|
|||||||
Reference in New Issue
Block a user