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.' )