fix(worker): erster Film in einer neuen Ablage war immer unerreichbar
Ampel / ampel (push) Failing after 30s
Ampel / ampel (push) Failing after 30s
Im ersten vollstaendigen Durchlauf aufgefallen: Der Rip lief sauber durch (40 GB Akira, Marke rip_fertig sprang korrekt auf true), die Kompression brach 0,2 s spaeter ab mit "Dieser Worker erreicht die Ziel (fertige Datei) nicht: \\192.168.178.62\rippy\movies\Akira (1988)". Die Freigabe war erreichbar. Es fehlten zwei noch nie angelegte Ordner - movies und der Filmordner darin. Die Pruefung liess aber nur EINE fehlende Ebene durch (sie sah nach dirname), obwohl gleich darauf os.makedirs die ganze Kette anlegt. Damit war jeder ERSTE Film in einer neuen Ablage systematisch unerreichbar. Jetzt zaehlt, ob irgendein Vorfahre existiert (erster_vorhandener_ordner, begrenzt auf 12 Stufen, damit auf einer toten Freigabe nicht endlos geklopft wird). Zweiter Fehler in derselben Meldung: Sie behauptete "RIPPY_PATH_MAP ist gesetzt, deckt diesen Pfad aber nicht ab" - und nannte im selben Satz den korrekt uebersetzten UNC-Pfad. Wer dem folgte, suchte in der Karte statt in der Freigabe. Die Karte wird nur noch beschuldigt, wenn sie den Pfad wirklich nicht angefasst hat; sonst steht da, was zutrifft: uebersetzt, aber gerade nicht erreichbar. Dazu der Artikel-Fehler "erreicht die Ziel" behoben. Diese Pruefung hatte KEINEN einzigen Test - deshalb kam beides durch. Jetzt 12 (301 gruen). Beim Schreiben ist noch ein dritter Fehler aufgefallen: `isdir=os.path.isdir` als Vorgabewert bindet die Funktion beim IMPORT, ein Ersetzen geht danach ins Leere. Aufloesung jetzt beim Aufruf. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+64
-12
@@ -735,6 +735,46 @@ def _ist_uebersetzt(container_pfad: str, lokal_pfad: str) -> bool:
|
||||
return container_pfad != lokal_pfad
|
||||
|
||||
|
||||
# Wie weit wird nach einem vorhandenen Elternordner gesucht. Begrenzt, damit auf
|
||||
# einer toten Freigabe nicht endlos geklopft wird.
|
||||
MAX_ELTERN_STUFEN = 12
|
||||
|
||||
|
||||
def erster_vorhandener_ordner(pfad: str, isdir=None, dirname=None) -> str:
|
||||
"""Der nächste EXISTIERENDE Ordner oberhalb von `pfad` — oder "".
|
||||
|
||||
⚠️ Vorfall 26.07.2026, im vollen Durchlauf aufgefallen: Der Rip lief sauber
|
||||
durch (40 GB), die Kompression brach sofort ab mit „Dieser Worker erreicht
|
||||
das Ziel nicht: \\\\NAS\\rippy\\movies\\Akira (1988)". Erreichbar war die
|
||||
Freigabe sehr wohl — es fehlten schlicht ZWEI Ordner: `movies` und der
|
||||
Filmordner darin. Die Prüfung ließ nur EINE fehlende Ebene durchgehen (sie
|
||||
sah nach `dirname`), obwohl gleich darauf `os.makedirs` die ganze Kette
|
||||
anlegt. Ein Ziel, das noch nie beschrieben wurde, war damit systematisch
|
||||
unerreichbar — also jeder erste Film in einer neuen Ablage.
|
||||
|
||||
Es zählt daher, ob IRGENDEIN Vorfahre existiert: Von dem aus kann
|
||||
`makedirs` den Rest bauen. Existiert keiner, ist die Freigabe wirklich weg.
|
||||
|
||||
`isdir`/`dirname` werden BEIM AUFRUF aufgelöst, nicht als Vorgabewert
|
||||
gebunden — sonst zeigt die Vorgabe für immer auf die Funktion von damals,
|
||||
und ein Ersetzen von `os.path.isdir` (im Test wie im Betrieb) ginge ins
|
||||
Leere. Genau darüber bin ich beim Schreiben der Tests gestolpert.
|
||||
"""
|
||||
isdir = isdir or os.path.isdir
|
||||
dirname = dirname or os.path.dirname
|
||||
aktuell = dirname(pfad or "")
|
||||
for _ in range(MAX_ELTERN_STUFEN):
|
||||
if not aktuell:
|
||||
return ""
|
||||
if isdir(aktuell):
|
||||
return aktuell
|
||||
naechster = dirname(aktuell)
|
||||
if naechster == aktuell: # Wurzel erreicht
|
||||
return ""
|
||||
aktuell = naechster
|
||||
return ""
|
||||
|
||||
|
||||
def _erreichbarkeit_pruefen(raw_container: str, raw_lokal: str,
|
||||
final_container: str, final_lokal: str) -> str:
|
||||
"""Kann DIESER Worker Quelle und Ziel überhaupt sehen? Klartext oder "".
|
||||
@@ -761,17 +801,18 @@ def _erreichbarkeit_pruefen(raw_container: str, raw_lokal: str,
|
||||
fremder_worker = not os.path.isdir("/app")
|
||||
|
||||
for zweck, container, lokal in (
|
||||
("Quelle (Rohdaten)", raw_container, raw_lokal),
|
||||
("Ziel (fertige Datei)", final_container, final_lokal),
|
||||
("die Quelle (Rohdaten)", raw_container, raw_lokal),
|
||||
("das Ziel (fertige Datei)", final_container, final_lokal),
|
||||
):
|
||||
if os.path.isdir(lokal):
|
||||
continue
|
||||
# Ziel darf fehlen, solange sein Elternordner erreichbar ist — es wird
|
||||
# gleich angelegt. Nur ein unerreichbarer ELTERN-Pfad ist ein Problem.
|
||||
if zweck.startswith("Ziel") and os.path.isdir(os.path.dirname(lokal) or "."):
|
||||
# Das ZIEL darf fehlen — es wird gleich mit `os.makedirs` angelegt, und
|
||||
# zwar samt aller fehlenden Zwischenebenen. Es genügt also, dass
|
||||
# irgendein Vorfahre existiert (Herleitung in erster_vorhandener_ordner).
|
||||
if zweck.startswith("das Ziel") and erster_vorhandener_ordner(lokal):
|
||||
continue
|
||||
|
||||
text = [f"Dieser Worker erreicht die {zweck} nicht: {lokal}"]
|
||||
text = [f"Dieser Worker erreicht {zweck} nicht: {lokal}"]
|
||||
if fremder_worker and not mapping:
|
||||
text.append(
|
||||
"Ursache: RIPPY_PATH_MAP ist auf dieser Maschine nicht gesetzt. "
|
||||
@@ -784,13 +825,24 @@ def _erreichbarkeit_pruefen(raw_container: str, raw_lokal: str,
|
||||
"start-tray.bat setzen, z. B. "
|
||||
"set RIPPY_PATH_MAP=/app/media=\\\\NAS\\rippy-media"
|
||||
)
|
||||
elif fremder_worker and mapping and not _ist_uebersetzt(container, lokal):
|
||||
text.append(
|
||||
f"RIPPY_PATH_MAP ist gesetzt ({mapping}), deckt diesen Pfad aber "
|
||||
f'nicht ab: „{container}" wurde von keinem Eintrag übersetzt — '
|
||||
'fehlt ein Präfix, oder ist es ein anderes Verzeichnis als erwartet?'
|
||||
)
|
||||
elif fremder_worker and mapping:
|
||||
text.append(f"RIPPY_PATH_MAP ist gesetzt ({mapping}), deckt diesen Pfad aber nicht ab.")
|
||||
if not _ist_uebersetzt(container, lokal):
|
||||
text.append(
|
||||
f'„{container}" wurde von keinem Eintrag übersetzt — fehlt ein '
|
||||
'Präfix, oder ist es ein anderes Verzeichnis als erwartet?'
|
||||
)
|
||||
# ⚠️ Hier stand bis zum 26.07.2026 dieselbe Meldung wie oben — „deckt
|
||||
# diesen Pfad nicht ab" —, obwohl die Karte ihn nachweislich übersetzt
|
||||
# hatte (der UNC-Pfad stand im selben Satz). Wer der Meldung folgte,
|
||||
# suchte den Fehler in der Karte, während die Freigabe schlicht nicht
|
||||
# verbunden war. Eine falsche Ursache ist teurer als gar keine.
|
||||
text.append(
|
||||
f'Übersetzt wurde er korrekt ({container} → {lokal}, Karte: '
|
||||
f'{mapping}) — dieser Pfad ist auf diesem Rechner nur gerade '
|
||||
'nicht erreichbar. Ist die Freigabe verbunden? Anmeldedaten noch '
|
||||
'gültig? Von Hand prüfen: den Pfad im Explorer öffnen.'
|
||||
)
|
||||
else:
|
||||
text.append(
|
||||
"Der Pfad existiert nicht. Liegt das Arbeitsverzeichnis auf einer "
|
||||
|
||||
Reference in New Issue
Block a user