Session 2026-04-20: SaveTV→NAS-Pipeline repariert (/api/filelist fehlte + falsches JSON-Shape) #85

Open
opened 2026-04-20 17:37:31 +00:00 by orbitalo · 0 comments
Owner

Kontext

User-Bug: "Filme werden nicht mehr automatisch von Save.TV auf die NAS geladen."

Letzter erfolgreicher Transfer war vor ~9 Tagen. Stündlicher Cron auf dem Jellyfin-Server (0 * * * * /usr/local/bin/savetv_sync.py) schrieb seitdem nur API-Fehler (filelist): HTTP Error 404 ins Log.

Root Cause (zwei Schichten)

  1. Der Endpoint /api/filelist auf CT 116 (savetv-web.service, Flask-App hinter Nginx auf 138.201.84.95:9443) war komplett verschwunden. Doku sagte er existiert seit 11.04.2026, Code im Git-Repo hatte ihn aber nicht.
  2. Nach Wiedereinbau lieferte er eine flache Liste ["Titel.mp4", ...]. savetv_sync.py auf dem Jellyfin-Server parst aber d.get("files", []) - hätte also [] bekommen und nichts kopiert (zweite Bruchstelle, war beim ersten Patch noch nicht sichtbar).

Fix

  • Endpoint neu implementiert in homelab-ai-bot/savetv_extra_routes.py (Zeile 186-207)
  • Return-Shape auf {"files": [...], "count": N} korrigiert (wie in der Doku dokumentiert und vom Client erwartet)
  • Commit: 9889b2df auf main, gepusht
  • savetv-web.service in CT 116 neu gestartet
  • Deploy-Workflow eingehalten: Edit im Git-Repo /opt/homelab-brain/ auf pve-hetzner, nicht direkt im CT (Bind-Mount-Falle)

Verifikation

Check Ergebnis
Syntax py_compile OK
curl http://127.0.0.1:8765/api/filelist type: dict, count: 504
Manueller Testlauf auf Jellyfin-Server (nohup) 504 Filme in API, erster Transfer Valerian 1390 MB in 38 s (~37 MB/s)
Callback /api/nas_synced funktioniert (Counter 504 → 503 nach erstem Transfer)
Backlog 504 Filme / ~1,2 TB, geschätzte Abarbeitung 8-10 h

Logfile-Merker

Script schreibt nach /var/log/savetv_sync.log (Unterstrich, nicht Bindestrich wie an manchen Stellen in der Doku stand).

Nicht gelöst / offene Themen

  • SSH-Key-Login für root@192.168.178.149 (Jellyfin-Server) fehlt. User musste selbst einloggen, Agent konnte nicht direkt. Vorschlag: ssh-copy-id von pve-mu-2 oder pve-hetzner, damit zukünftige Debugs ohne User-Handoff laufen.
  • Cron-Output geht nur ins selbst geschriebene Logfile, Stderr von Python-Crashes würde verlorengehen. Optional: Cron umbauen auf 0 * * * * /usr/bin/python3 /usr/local/bin/savetv_sync.py >> /var/log/savetv_sync.log 2>&1.
  • savetv_auto_download.py Cron auf CT 116 läuft laut Doku zwar, aber Downloads kommen aktuell anscheinend primär direkt durch savetv_web.py - nicht weiter untersucht, da NAS-Sync das gemeldete Problem war.

Memories

8 Einträge in OpenMemory geschrieben (Commit-Hash, Code-Diff, Aufrufer-Parsing, Test-Resultate). Erster Versuch war Duplikat, Retry mit spezifischeren IDs/Zahlen erfolgreich.

User-Notiz

User ist morgen früh im Krankenhaus - Session bewusst heute abgeschlossen, Sync läuft autonom per nohup weiter, danach stündlicher Cron.

## Kontext User-Bug: "Filme werden nicht mehr automatisch von Save.TV auf die NAS geladen." Letzter erfolgreicher Transfer war vor ~9 Tagen. Stündlicher Cron auf dem Jellyfin-Server (`0 * * * * /usr/local/bin/savetv_sync.py`) schrieb seitdem nur `API-Fehler (filelist): HTTP Error 404` ins Log. ## Root Cause (zwei Schichten) 1. Der Endpoint `/api/filelist` auf CT 116 (`savetv-web.service`, Flask-App hinter Nginx auf `138.201.84.95:9443`) war komplett verschwunden. Doku sagte er existiert seit 11.04.2026, Code im Git-Repo hatte ihn aber nicht. 2. Nach Wiedereinbau lieferte er eine **flache Liste** `["Titel.mp4", ...]`. `savetv_sync.py` auf dem Jellyfin-Server parst aber `d.get("files", [])` - hätte also `[]` bekommen und nichts kopiert (zweite Bruchstelle, war beim ersten Patch noch nicht sichtbar). ## Fix - Endpoint neu implementiert in `homelab-ai-bot/savetv_extra_routes.py` (Zeile 186-207) - Return-Shape auf `{"files": [...], "count": N}` korrigiert (wie in der Doku dokumentiert und vom Client erwartet) - Commit: `9889b2df` auf `main`, gepusht - `savetv-web.service` in CT 116 neu gestartet - Deploy-Workflow eingehalten: Edit im Git-Repo `/opt/homelab-brain/` auf pve-hetzner, nicht direkt im CT (Bind-Mount-Falle) ## Verifikation | Check | Ergebnis | |---|---| | Syntax `py_compile` | OK | | `curl http://127.0.0.1:8765/api/filelist` | `type: dict`, `count: 504` | | Manueller Testlauf auf Jellyfin-Server (nohup) | `504 Filme in API`, erster Transfer Valerian 1390 MB in 38 s (~37 MB/s) | | Callback `/api/nas_synced` | funktioniert (Counter 504 → 503 nach erstem Transfer) | | Backlog | 504 Filme / ~1,2 TB, geschätzte Abarbeitung 8-10 h | ## Logfile-Merker Script schreibt nach `/var/log/savetv_sync.log` (**Unterstrich**, nicht Bindestrich wie an manchen Stellen in der Doku stand). ## Nicht gelöst / offene Themen - SSH-Key-Login für root@192.168.178.149 (Jellyfin-Server) fehlt. User musste selbst einloggen, Agent konnte nicht direkt. Vorschlag: `ssh-copy-id` von pve-mu-2 oder pve-hetzner, damit zukünftige Debugs ohne User-Handoff laufen. - Cron-Output geht nur ins selbst geschriebene Logfile, Stderr von Python-Crashes würde verlorengehen. Optional: Cron umbauen auf `0 * * * * /usr/bin/python3 /usr/local/bin/savetv_sync.py >> /var/log/savetv_sync.log 2>&1`. - `savetv_auto_download.py` Cron auf CT 116 läuft laut Doku zwar, aber Downloads kommen aktuell anscheinend primär direkt durch `savetv_web.py` - nicht weiter untersucht, da NAS-Sync das gemeldete Problem war. ## Memories 8 Einträge in OpenMemory geschrieben (Commit-Hash, Code-Diff, Aufrufer-Parsing, Test-Resultate). Erster Versuch war Duplikat, Retry mit spezifischeren IDs/Zahlen erfolgreich. ## User-Notiz User ist morgen früh im Krankenhaus - Session bewusst heute abgeschlossen, Sync läuft autonom per `nohup` weiter, danach stündlicher Cron.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: orbitalo/homelab-brain#85
No description provided.