3a4eb25392
Ampel / ampel (push) Successful in 29s
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>
63 lines
1.7 KiB
Python
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
|