From f7555a17d1cb57dc8ea755b517c1ae1c4ff87509 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Sun, 26 Jul 2026 16:23:15 +0200 Subject: [PATCH] fix(zombies): die Fehlermeldung unterscheidet jetzt Rip von Kompression Nachtrag, direkt am echten Fall aufgefallen. Die Zombie-Erkennung hat den toten Rip gefunden (Beleg: nach 140 s noch "processing 12 %", nach 160 s "failed") - aber der Fehlertext sagte: "Die Rohdateien wurden NICHT geloescht: mit 'Neu komprimieren' laeuft die Kompression erneut, ohne die Disc noch einmal zu rippen." Der Satz war fuer einen toten TRANSCODE geschrieben, wo die Roh-MKV vollstaendig ist. Seit "running" mit zu den Arbeitsstati gehoert, traf er auch abgebrochene RIPS - und da ist er schlicht falsch: Die Datei ist ein Bruchstueck (im Vorfall 5,1 GB von rund 40), und wer dem Rat folgt, komprimiert einen Film, der bei 12 % aufhoert. Jetzt unterscheidet der Text die Phase: Rip tot -> "Der Rip war bei 12 % - die Roh-Datei ist UNVOLLSTAENDIG ... Richtig ist: Disc wieder einlegen und neu rippen." Transcode tot -> "Der Rip war fertig, nur die Kompression nicht ..." Die deutschen Anfuehrungszeichen haben dabei zum vierten Mal an einem Tag zugeschlagen (in DOPPELT gequoteten Python-Strings beendet das schliessende Zeichen den String). Die betroffenen Zeilen sind jetzt einfach gequotet, wie es der Bestand ohnehin macht. Co-Authored-By: Claude Opus 5 --- docker/worker/zombies.py | 44 +++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/docker/worker/zombies.py b/docker/worker/zombies.py index e65780e..8e25f46 100644 --- a/docker/worker/zombies.py +++ b/docker/worker/zombies.py @@ -99,16 +99,50 @@ def finde_zombies(offene_jobs, belegte) -> list: return [job for job in offene_jobs if job.get("id") not in belegte] +# In welcher Phase starb der Job? Entscheidet, was danach hilft. +RIP_STATI = ("running", "ripping") + + +def war_im_rip(job) -> bool: + """Starb der Job WÄHREND des Rippens? (pure Funktion) + + Der Unterschied ist für den Nutzer der ganze Punkt: Nach einem toten + TRANSCODE liegt eine vollständige Roh-MKV da — „Neu komprimieren" genügt und + spart eine Stunde Rippen. Nach einem toten RIP liegt ein ABGESCHNITTENES + Bruchstück da (im Vorfall 26.07.2026: 5,1 GB von rund 40), und Komprimieren + ergäbe einen Film, der bei 12 % aufhört. + """ + return (job.get("status") or "") in RIP_STATI + + def fehlertext(job) -> str: - """Ehrlicher Klartext für die Job-Karte — was war, und was jetzt hilft.""" + """Ehrlicher Klartext für die Job-Karte — was war, und was jetzt hilft. + + ⚠️ Der Text unterscheidet die Phase (26.07.2026). Vorher stand hier für JEDEN + Fall „mit 'Neu komprimieren' läuft die Kompression erneut, ohne die Disc noch + einmal zu rippen" — geschrieben für einen toten Transcode. Seit „running" mit + zu den Arbeitsstati gehört, traf derselbe Satz auch abgebrochene RIPS, und da + ist er schlicht falsch: Wer ihn befolgt, bekommt ein Bruchstück komprimiert. + """ zuletzt = job.get("status") or "unbekannt" - return ( + kopf = ( f"Abgebrochen: Der Vorgang lief nicht mehr (zuletzt gemeldet: {zuletzt}). " "Beim Start des Workers war dazu weder ein Prozess noch eine Aufgabe in " "der Warteschlange zu finden — meistens ein Absturz oder ein Neustart " - "mitten im Lauf. Die Rohdateien wurden NICHT gelöscht: mit " - "'Neu komprimieren' läuft die Kompression erneut, ohne die Disc noch " - "einmal zu rippen." + "mitten im Lauf. " + ) + if war_im_rip(job): + fortschritt = job.get("progress") or 0 + return kopf + ( + f'Der Rip war bei {fortschritt} % — die Roh-Datei ist damit ' + 'UNVOLLSTÄNDIG. Sie wurde nicht gelöscht, aber „Neu komprimieren" ' + 'ergäbe einen Film, der mitten drin aufhört. Richtig ist: Disc ' + 'wieder einlegen und neu rippen.' + ) + return kopf + ( + 'Der Rip war fertig, nur die Kompression nicht. Die Roh-Dateien wurden ' + 'NICHT gelöscht: mit „Neu komprimieren" läuft sie erneut, ohne die Disc ' + 'noch einmal zu rippen.' )