feat(backend): Media-Server-Aufbereitung, echte Webhooks, SMB-Klartext, UHD-Arbeitsverzeichnis, MakeMKV-Key via UI
- jobs.meta (Migration in beiden db.py): Disc-Metadaten wandern in den Job —
Quelle fuer Job-Detail-Popup (GET /jobs/{id}/detail), Ordner-Benennung, NFO.
- medien.py (Worker, mit Tests): Zielordner 'Titel (Jahr)' statt Job-UUID;
movie.nfo/tvshow.nfo (Kodi-Schema, kodi.wiki/view/NFO_files) + poster.jpg
fuer jellyfin/emby/kodi; plex nur Benennung; Kollision -> Job-ID-Suffix.
- notify.py (identisch in API+Worker, mit Tests): Webhook bei Job-Ende —
Discord ({content}, discord.com/developers), Slack ({text},
api.slack.com/messaging/webhooks), ntfy (Rohtext + ?title=, docs.ntfy.sh),
generisches JSON. Vorher war das Setting ein Placebo: nichts sendete je.
POST /notifications/test beweist die Anbindung sofort.
- mounts.py: NT_STATUS-Fehler -> handelbarer Klartext (ACCESS_DENIED ohne
Credentials = Gast-Abfrage verweigert), Timeout-Meldung, mount-Hinweis
bei error(13). Mit Tests.
- tasks.py: Platz-Check per Disc-Groesse (ioctl BLKGETSIZE64) VOR dem Rip;
Arbeitsverzeichnis workDir (unter /app/media, z.B. NAS) statt fix
/app/temp/raw — 4K-UHD-Rohdaten (bis 100 GB) sprengen sonst die VM-Platte;
MakeMKV-Key aus UI-Settings (~/.MakeMKV/settings.conf, Format wie
entrypoint.sh) gilt ab dem naechsten Rip ohne Rebuild.
- caps.py: Werkzeug-Versionen (MakeMKV aus ENV MAKEMKV_VERSION im Image,
makemkvcon hat keinen --version-Schalter lt. usage.txt; HandBrakeCLI
--version lt. handbrake.fr/docs) + Key-Quelle; workers.info-Spalte.
- /browse liefert jetzt auch DATEIEN (Name + Groesse) — der 'leere'
bluray-Ordner war voll, der Browser zeigte nur Unterordner.
- GET /system/info: Versionen, Plattenplatz, Key-/Webhook-Status.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
"""Tests für die SMB-Fehlerübersetzung (Speicherziele → Freigaben auflisten)."""
|
||||
|
||||
from mounts import uebersetze_smb_fehler, validiere_name
|
||||
|
||||
|
||||
def test_access_denied_ohne_credentials_erklaert_gastproblem():
|
||||
meldung = uebersetze_smb_fehler(
|
||||
"session setup failed: NT_STATUS_ACCESS_DENIED", mit_credentials=False
|
||||
)
|
||||
assert "Gast" in meldung
|
||||
assert "Benutzername + Passwort" in meldung
|
||||
|
||||
|
||||
def test_access_denied_mit_credentials_verweist_auf_konto():
|
||||
meldung = uebersetze_smb_fehler(
|
||||
"session setup failed: NT_STATUS_ACCESS_DENIED", mit_credentials=True
|
||||
)
|
||||
assert "stimmen nicht" in meldung
|
||||
|
||||
|
||||
def test_logon_failure_wird_uebersetzt():
|
||||
meldung = uebersetze_smb_fehler("NT_STATUS_LOGON_FAILURE", mit_credentials=True)
|
||||
assert "Passwort falsch" in meldung
|
||||
|
||||
|
||||
def test_unerreichbar_wird_uebersetzt():
|
||||
meldung = uebersetze_smb_fehler(
|
||||
"do_connect: Connection to 10.0.0.9 failed (Error NT_STATUS_IO_TIMEOUT)",
|
||||
mit_credentials=False,
|
||||
)
|
||||
assert "nicht erreichbar" in meldung
|
||||
|
||||
|
||||
def test_unbekannter_fehler_bleibt_erhalten_und_gekappt():
|
||||
meldung = uebersetze_smb_fehler("X" * 500, mit_credentials=False)
|
||||
assert meldung == "X" * 200
|
||||
|
||||
|
||||
def test_validiere_name_bleibt_streng():
|
||||
assert validiere_name("nas-filme")
|
||||
assert not validiere_name("NAS Filme")
|
||||
Reference in New Issue
Block a user