Files
rippy/docker/worker/test_titel_auswahl.py
T
Hitonabi 3a4eb25392
Ampel / ampel (push) Successful in 29s
Track-Auswahl-Tabelle, nativer Windows-Worker (via UI angeboten), Anleitungs-Tab
Volle Titel-Auswahl vor dem Rip (Etappe-12-Rest):
- worker.tasks.scan_tracks: makemkvcon info -> Titel-Liste (Dauer/Groesse/
  Kapitel, apdefs-Attr 8/9/11) in die settings-Tabelle 'tracks:<device>';
  API: POST /devices/{n}/scan-tracks + GET /devices/{n}/tracks (Polling).
- Rip-Dialog: 'Disc scannen' -> Tabelle mit Checkboxen, Vorauswahl ab
  5 min, Groessen-Summe; gewaehlte Titel als meta.titles in den Job.
- rip_titel_auswahl: ein makemkvcon-Aufruf je Titel (mkv kann nur einen
  Titel oder all), Fortschritt anteilig. Parser-Tests dabei.

Nativer Windows-Worker OHNE Docker (Commander-Wunsch):
- Die Rippy-Instanz versorgt sich selbst: GET /worker-setup/windows
  liefert install.ps1, /worker-setup/paket den Worker-Code als Zip
  (api-Dockerfile kopiert docker/worker/*.py als worker_dist/ ins Image).
- install.ps1: Python-Check, venv + requirements, HandBrakeCLI 1.9.2 vom
  offiziellen GitHub-Release (URL per HEAD verifiziert), start-worker.bat
  mit celery -Q transcode --pool=solo (Celery-Doku: Windows nur solo),
  optional -Autostart via schtasks onlogon.
- tasks.py laedt jetzt auch ohne fcntl (Import-Guard) — rip_disc ist auf
  solchen Workern hart verriegelt (Klartext-Fehler statt Crash).
- Einstellungen -> Worker: Varianten-Umschalter Linux(Docker)/Windows(nativ)
  mit passenden Copy-Paste-Befehlen.

Anleitungs-Tab: Rippy erklaert sich selbst (Disc-Weg, Serien, NAS,
Media-Server, Benachrichtigungen, Key, Worker, Downloads, FAQ).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 15:18:08 +02:00

63 lines
1.7 KiB
Python

"""Tests für die Hauptfilm-Auswahl (TINFO-Parsing) und Datei-Laufzeiten."""
from ripping import (
build_makemkv_cmd,
laengster_titel,
parse_scan_dauer,
parse_tinfo_dauern,
parse_titel_info,
)
# Echte Robot-Mode-Zeilenform laut makemkv.com/developers/usage.txt:
# TINFO:<titel>,<attr>,<code>,"wert" — Attribut 9 = Laufzeit "H:MM:SS"
TINFO_BEISPIEL = """
TINFO:0,2,0,"Hauptfilm"
TINFO:0,9,0,"1:52:29"
TINFO:1,9,0,"0:03:12"
TINFO:2,9,0,"0:24:01"
MSG:1011,0,1,"Using LibreDrive mode","%1","x"
"""
def test_parse_tinfo_dauern():
dauern = parse_tinfo_dauern(TINFO_BEISPIEL)
assert dauern == {0: 6749, 1: 192, 2: 1441}
def test_laengster_titel_ist_der_hauptfilm():
assert laengster_titel({0: 6749, 1: 192, 2: 1441}) == 0
assert laengster_titel({}) is None
def test_makemkv_cmd_mit_titelwahl():
cmd = build_makemkv_cmd("/dev/sr0", "/out", titel="7")
assert cmd[-2:] == ["7", "/out"]
assert "all" not in cmd
def test_makemkv_cmd_default_bleibt_all():
cmd = build_makemkv_cmd("/dev/sr0", "/out")
assert cmd[-2:] == ["all", "/out"]
def test_parse_titel_info_volle_tabelle():
"""Attr 8=Kapitel, 9=Dauer, 11=Bytes (MakeMKV apdefs.h) → Auswahl-Tabelle."""
ausgabe = """
TINFO:0,8,0,"24"
TINFO:0,9,0,"1:52:29"
TINFO:0,11,0,"31234567890"
TINFO:1,9,0,"0:03:12"
TINFO:1,11,0,"98765432"
"""
titel = parse_titel_info(ausgabe)
assert titel == [
{"nr": 0, "dauer_s": 6749, "groesse_bytes": 31234567890, "kapitel": 24},
{"nr": 1, "dauer_s": 192, "groesse_bytes": 98765432, "kapitel": 0},
]
def test_parse_scan_dauer():
ausgabe = "\n + duration: 01:52:29\n"
assert parse_scan_dauer(ausgabe) == 6749
assert parse_scan_dauer("kein treffer") == 0