feat: Komplettierung der aktuellen Rippy-Etappe
Ampel / ampel (push) Failing after 29s

- Versionsanzeige für den Windows-Worker im UI inkl. Prüfung
- Absicherung der install.sh gegen fehlendes systemd
- Serien-Episoden-Erkennung und Laufzeitabgleich anhand TMDB-Daten (Heuristik)
- Umstellung der Windows-Worker-Installation auf SchTasks (Dienst-Ersatz)
- Kodi-Bibliotheks-Refresh über JSON-RPC integriert
This commit is contained in:
Hitonabi
2026-07-26 21:13:27 +02:00
parent d15900d1eb
commit e165e2a0d3
9 changed files with 179 additions and 78 deletions
+30 -11
View File
@@ -140,24 +140,43 @@ def episoden_umbenennen(ordner: str, serie: str, staffel: int, zuordnung: list)
def bibliothek_refresh(media_server: str, url: str, api_key: str) -> str:
"""Stößt den Bibliotheks-Scan des Media-Servers an (Jellyfin/Emby).
"""Stößt den Bibliotheks-Scan des Media-Servers an (Jellyfin/Emby/Kodi).
API laut jellyfin.org/docs (Emby-kompatibel): POST /Library/Refresh,
Auth über den Header X-Emby-Token. Rückgabe: Klartext fürs Log.
Jellyfin/Emby: POST /Library/Refresh, Auth über X-Emby-Token.
Kodi: POST /jsonrpc, VideoLibrary.Scan, Auth über Basic Auth (api_key = user:pass).
Wirft nie — der Refresh ist Komfort, nicht Teil des Rips.
"""
if media_server not in ("jellyfin", "emby") or not url or not api_key:
if not url or media_server not in ("jellyfin", "emby", "kodi"):
return ""
try:
antwort = requests.post(
url.rstrip("/") + "/Library/Refresh",
headers={"X-Emby-Token": api_key}, timeout=15,
)
if antwort.status_code < 300:
return f"{media_server}-Bibliothek aktualisiert ({url})"
return f"Bibliotheks-Refresh: HTTP {antwort.status_code} von {url}"
if media_server in ("jellyfin", "emby") and api_key:
antwort = requests.post(
url.rstrip("/") + "/Library/Refresh",
headers={"X-Emby-Token": api_key}, timeout=15,
)
if antwort.status_code < 300:
return f"{media_server.title()}-Bibliothek aktualisiert ({url})"
return f"Bibliotheks-Refresh: HTTP {antwort.status_code} von {url}"
elif media_server == "kodi":
auth = None
if api_key and ":" in api_key:
user, pw = api_key.split(":", 1)
auth = (user, pw)
payload = {"jsonrpc": "2.0", "method": "VideoLibrary.Scan", "id": 1}
antwort = requests.post(
url.rstrip("/") + "/jsonrpc",
json=payload, auth=auth, timeout=15,
)
if antwort.status_code < 300:
return f"Kodi-Bibliothek aktualisiert ({url})"
return f"Kodi-Refresh: HTTP {antwort.status_code} von {url}"
except requests.RequestException as e:
return f"Bibliotheks-Refresh fehlgeschlagen: {e}"
return ""
def baue_nfo(meta: dict, titel: str, jahr=None) -> str: