videowatch: lokale Dateien, die keine Videos sind, sofort mit klarer Meldung abweisen #54
Labels
No labels
herkunft/alpha-feedback
status
blockiert
status
zu-testen
typ
bug
typ
docs
typ
enhancement
typ
feature
typ
idea
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
iris/Iris#54
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
Am 2026-10-16 wurde ein Screenshot (
.png) in die videowatch-Queue gegeben. Die Queue nimmt ihn an, und er scheitert erst später im Lauf. Welche Fehlermeldung genau erschien, ist nicht festgehalten, und ich habe den Fall nicht nachgestellt. Die Beobachtungen unten stammen aus dem Code und ausffprobe.Befund
resolve_local()inskills/videowatch/download.pyprüft nur, ob die Datei existiert. Bei einer Endung außerhalb vonVIDEO_EXTSgibt sie nur die Warnung... is not a known video extension, proceeding anywayaus und macht weiter.ffprobemeldet für eine PNG-Datei einen Videostream mit Codecpng,duration=N/Aund keine Tonspur. Frame-Extraktion und Transkription haben damit nichts zu verarbeiten.process_queue.py, Titel = Dateiname). Erst der Lauf deswatch_local.pyscheitert, dann nach drei Versuchen.Vorschlag
resolve_local()prüft perffprobe, ob die Datei eine Dauer größer 0 oder eine Tonspur hat. Sonst bricht sie sofort ab mit einer klaren Meldung, zum BeispielKeine Video- oder Audiodatei: <Name>. Eine Endung allein ist kein Kriterium (es gibt Videos mit anderer Endung).failed.POST /videowatch/playlistund.../items) dieselbe Prüfung machen, damit gar kein Queue-Eintrag entsteht.Offen
Zusammenhang: iris/Iris#50.
PR #63 gemergt: fix(videowatch): Dateien ohne Video und Ton sofort abweisen, ohne Wiederholungen (iris/Iris#54)
download.py: resolve_local prüft per ffprobe auf Audio oder einen Videostream mit Dauer und
wirft UnusableSourceError (Keine Video- oder Audiodatei: ); die Endung allein entscheidet
nicht mehr. watch_local.py beendet sich dafür mit Exit-Code 65, process_queue.py wiederholt
solche Läufe nicht. Unit-Tests in skills/videowatch/tests.
Co-Authored-By: Claude Sonnet 5.5 noreply@anthropic.com
alf/2ndbrain#63
Commits:
Stand 2026-10-16: Worker-Teil umgesetzt (alf/2ndbrain PR #63)
Geändert (
skills/videowatch/):download.py:resolve_local()prüft perffprobe, ob die Datei Audio oder einen Videostream mit mindestens 0,5 s Dauer enthält. SonstUnusableSourceError("Keine Video- oder Audiodatei: <Name>"). Die Endung allein entscheidet nicht (ein Video mit Endung.binwird angenommen, eine Textdatei.mp4abgewiesen). Ein Video ohne Ton gilt weiter als gültig. Fehltffprobe, wird nicht abgewiesen, der spätere Schritt meldet das selbst.watch_local.py: fängt den Fehler getrennt ab, schreibt[error] …ins Log, schickt die Benachrichtigung ohne den Zusatz „Unerwarteter Fehler" und beendet sich mit Exit-Code 65.process_queue.py:NO_RETRY_EXIT_CODES = {65}— solche Einträge gehen sofort auffailed, ohne Wiederholungen und ohne Pause.lastErrorzeigt dank des Logs die Meldung.Geprüft:
skills/videowatch/tests/test_unusable_source.py,python3 -m unittest discover -s tests): PNG, Textdatei mit Video-Endung und fehlende Datei werden korrekt behandelt; stummes Video, reines Audio und Video mit anderer Endung werden angenommen; Exit-Code 65 gibtfailednach einem Versuch ohne Pause, Exit-Code 1 wird weiter wiederholt.Keine Video- oder Audiodatei: Bildschirmfoto 2026-10-16 um 14.06.21.png.Nicht geprüft / nicht umgesetzt:
watch_local.pyund der Queue mit einem Bild.watch_local.pynimmt vor der Pipeline die globale Sequenz-Sperre; ich wollte nicht in eine laufende Queue eingreifen.POST /videowatch/playlistund.../items, Mac- und Linux-Server) ist nicht umgesetzt. Der Eintrag entsteht weiter in der Queue und scheitert, sobald er an der Reihe ist. Er steht dann sofort auffailedmit klarer Meldung und lässt sich löschen (siehe iris/Iris#50).process_queue.py; das habe ich nicht geprüft.Die Änderung ist über den Symlink
~/.hermes/skills/videowatchsofort für neue Läufe aktiv. Ein bereits laufenderprocess_queue.pybehält bis zu seinem Ende den alten Stand.PR #64 gemergt: fix(videowatch): yt-dlp-Grund in der Meldung, dauerhafte Fehler ohne Wiederholung (iris/Iris#54)
download.py fängt stderr von yt-dlp ab (vorher am Lauf-Log vorbei) und nimmt die letzte ERROR-Zeile
in die Meldung auf. Unsupported URL, Private video, Video unavailable u. ä. beenden den Lauf mit
Exit-Code 65 (UnusableSourceError), ohne Wiederholungen; 403/429 bleiben wiederholbar.
process_queue.py: Präfix SystemExit aus lastError entfernt. 5 neue Tests.
Co-Authored-By: Claude Sonnet 5.5 noreply@anthropic.com
alf/2ndbrain#64
Commits:
PR #11 gemergt: fix(videowatch): Fehler- und Hinweismeldung der Queue verschwindet nach 10 Sekunden (iris/Iris#54)
Co-Authored-By: Claude Sonnet 5.5 noreply@anthropic.com
iris/2ndbrain-ios#11
Commits:
PR #55 gemergt: fix(videowatch): Fehler- und Hinweismeldung der Queue verschwindet nach 10 Sekunden (iris/Iris#54)
Co-Authored-By: Claude Sonnet 5.5 noreply@anthropic.com
#55
Commits:
Nachtrag 2026-10-16: yt-dlp-Grund, keine Wiederholung bei dauerhaften Fehlern, Meldung räumt sich auf
Anlass: Beim bewussten Testen mit falschen Eingaben zeigten zwei Einträge nur
SystemExit: yt-dlp did not produce a video file in /var/folders/… (exit 1), und die Queue versuchte beide dreimal. Die wirklichen Gründe, mityt-dlp --simulategeprüft: für die Adobe-Learn-SeiteUnsupported URL, fürhsyuLbgtQw8(vierter Eintrag der Playlist)Private video.Ursache der fehlenden Meldung:
subprocess.run(..., stderr=sys.stderr)reicht den echten Dateideskriptor weiter. DieERROR:-Zeile von yt-dlp erreichte deshalb das Lauf-Log nicht, das nur über Pythons eigenen Schreiber mitschreibt.Geändert
skills/videowatch/download.py:stderrvon yt-dlp wird abgefangen, ins Log weitergereicht, und die letzteERROR:-Zeile kommt in die Meldung. Dauerhafte Gründe (Unsupported URL,Private video,Video unavailable,has been removed,is not available,members-only,only available to) lösenUnusableSourceErroraus, also Exit-Code 65 und kein Wiederholen. HTTP 403/429 und „Sign in to confirm you're not a bot" bleiben bewusst wiederholbar. Bei Fehlern ohneERROR:-Zeile bleibt der Exit-Code in der Meldung.process_queue.py: Das PräfixSystemExit:fällt auslastErrorweg.Geprüft: 13 Unit-Tests insgesamt (5 neu: Unsupported URL, Private video, wiederholbarer 403, Fehler ohne Grundzeile, Präfix); mit den echten URLs aus dem Test über
download.py:yt-dlp: [youtube] hsyuLbgtQw8: Private videoundyt-dlp: Unsupported URL: https://www.adobe.com/…. Builds vonIris.xcodeprojund der iOS-App sind erfolgreich.Nicht geprüft / offen
Geschlossen auf Wunsch von Alf nach eigener Prüfung: funktioniert. Umgesetzt in alf/2ndbrain #63 und #64, iris/Iris #55, iris/2ndbrain-ios #11. Offen geblieben und bewusst nicht Teil dieses Issues: der frühe Abweis beim Hinzufügen (Mac- und Linux-Server).