fix(windows): Dauerscan der Disc, aufblitzende Fenster, Docker-Einstellung uebernommen
Ampel / ampel (push) Successful in 1m30s
Ampel / ampel (push) Successful in 1m30s
Commander: „liest er die disc NOCHMAL ein das macht aber keinen sinn, wenn er
sie bereits erkannt hat. Außerdem öffnen sich nun immer irgendwelche fenster
ganz kurz im hintergrund."
## Beides war dieselbe Schleife
In der Disc-Wache stand:
except OSError:
continue
Damit blieb `bekannt[pfad]` ungesetzt, und im naechsten Durchlauf war
`vorher is None` — also wieder „Erststart, liegt schon eine Disc drin". **Ein
einziger fehlgeschlagener Lesevorgang loeste einen neuen Vor-Scan aus.**
Und der scheitert regelmaessig: Waehrend der Vor-Scan laeuft, haelt
makemkvcon das Laufwerk (gemessen: /devices braucht dann 14 s statt 5). Also
Scan haelt das Laufwerk -> Statusabfrage scheitert -> naechster Durchlauf
haelt es fuer den ersten -> neuer Scan. Eine Schleife, die sich selbst am
Leben haelt.
Und weil derselbe makemkvcon-Aufruf in `prescan.py` als EINZIGER kein
`creationflags=OHNE_FENSTER` hatte, blitzte bei jeder Runde eine Konsole auf.
Das war meine Zeile von heute Vormittag.
Die Entscheidung steckt jetzt in `disc_entscheidung()` — pure Funktion, also
ohne Laufwerk pruefbar. Zwei getrennte Fragen statt einer: Haben wir dieses
Laufwerk je gelesen, und was war zuletzt drin? Ein Fehlschlag beantwortet die
zweite nicht und darf die erste nicht zuruecksetzen.
Nachgemessen: Ein Tabwechsel loest KEINEN neuen Scan aus (8 Erkennungen
vorher, 8 nachher). Meine erste Zaehlung von „7 vs 8" war ein Messfehler —
zwei verschieden grosse Abfragefenster.
## Aus dem Docker-Betrieb uebernommen
`docker/worker/entrypoint.sh` setzt vor jedem Worker-Start zwei Dinge:
`app_Key` und `app_UpdateEnable`. Der Key war schon uebernommen, die zweite
nicht — auf dem Rechner des Commanders nachgesehen: NICHT gesetzt.
Das ist MakeMKVs Web-Kontakt; darueber holt es die Disc-Schluessel fuer
4K-UHD nach (Meldung 3338, auf Windows gemessen). „Fuer Windows umschreiben"
heisst hier: Registry statt settings.conf, DWORD statt Text — die
Nachbarwerte (`app_BackupDecrypted`) zeigen die Form.
Gesetzt wird NUR, was fehlt: Wer den Web-Kontakt bewusst abgeschaltet hat,
behaelt ihn abgeschaltet. Ein Waechter-Test vergleicht kuenftig die
`app_*`-Namen aus der entrypoint.sh gegen die Windows-Seite — sonst driften
die beiden Betriebe auseinander.
871 Tests gruen, ruff sauber.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
f0d39b4d04
commit
aeb3128a85
@@ -198,6 +198,70 @@ def _in_registry(key: str) -> str:
|
||||
return "HKCU\\" + REGISTRY_PFAD
|
||||
|
||||
|
||||
#: Einstellungen, die der Docker-Betrieb beim Start AUSDRÜCKLICH setzt
|
||||
#: (`docker/worker/entrypoint.sh`) — hier für Windows übersetzt.
|
||||
#:
|
||||
#: `app_UpdateEnable` ist MakeMKVs Web-Kontakt. Er ist ab Werk an, und genau
|
||||
#: deshalb steht er in der entrypoint.sh: „damit die Einstellung
|
||||
#: nachvollziehbar ist und nicht versehentlich kippt". Quelle dort:
|
||||
#: forum.makemkv.com/forum/viewtopic.php?t=20364
|
||||
#:
|
||||
#: Für Rippy hängt daran mehr als Kosmetik: Über diesen Kanal holt MakeMKV die
|
||||
#: Disc-Schlüssel für 4K-UHD nach (Meldung 3338 „Downloading latest HK to …",
|
||||
#: am 25.07.2026 auf einem Windows-PC gemessen — unter Linux passiert es nie).
|
||||
#: Ohne ihn scheitert jede unbekannte UHD-Pressung.
|
||||
#:
|
||||
#: Auf dem Rechner des Commanders nachgesehen (29.08.2026): **nicht gesetzt.**
|
||||
#: Die Werte daneben (`app_UpdateLastCheck`, `app_BackupDecrypted`) zeigen die
|
||||
#: native Form — Wahrheitswerte stehen in der Registry als DWORD, nicht als
|
||||
#: Text wie in der settings.conf.
|
||||
DOCKER_EINSTELLUNGEN = {"app_UpdateEnable": 1}
|
||||
|
||||
|
||||
def einstellungen_sicherstellen(plattform_name: str = None, setzer=None,
|
||||
lesen=None) -> list:
|
||||
"""Setzt fehlende MakeMKV-Einstellungen. Gibt zurück, was gesetzt wurde.
|
||||
|
||||
**Nur was FEHLT.** Wer den Web-Kontakt bewusst abgeschaltet hat, soll ihn
|
||||
abgeschaltet behalten — Rippy stellt einen Ausgangszustand her, es
|
||||
überstimmt keine Entscheidung.
|
||||
"""
|
||||
if not plattform(plattform_name).startswith("win"):
|
||||
# Im Container macht das die entrypoint.sh, und zwar in der
|
||||
# settings.conf. Hier nichts tun statt es doppelt zu machen.
|
||||
return []
|
||||
lesen = lesen or _registry_hat
|
||||
setzer = setzer or _registry_dword
|
||||
gesetzt = []
|
||||
for name, wert in DOCKER_EINSTELLUNGEN.items():
|
||||
try:
|
||||
if lesen(name):
|
||||
continue
|
||||
setzer(name, wert)
|
||||
gesetzt.append(name)
|
||||
except OSError:
|
||||
continue # Registry nicht schreibbar — kein Beinbruch
|
||||
return gesetzt
|
||||
|
||||
|
||||
def _registry_hat(name: str) -> bool:
|
||||
import winreg
|
||||
|
||||
try:
|
||||
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, REGISTRY_PFAD) as s:
|
||||
winreg.QueryValueEx(s, name)
|
||||
return True
|
||||
except OSError:
|
||||
return False
|
||||
|
||||
|
||||
def _registry_dword(name: str, wert: int) -> None:
|
||||
import winreg
|
||||
|
||||
with winreg.CreateKey(winreg.HKEY_CURRENT_USER, REGISTRY_PFAD) as s:
|
||||
winreg.SetValueEx(s, name, 0, winreg.REG_DWORD, int(wert))
|
||||
|
||||
|
||||
def key_zuruecknehmen(plattform_name: str = None, entferner=None) -> bool:
|
||||
"""Einen abgelehnten Schlüssel wieder entfernen. True, wenn etwas wegging."""
|
||||
if not plattform(plattform_name).startswith("win"):
|
||||
|
||||
@@ -213,3 +213,76 @@ def test_die_codes_stehen_so_da_wie_gemessen():
|
||||
assert "zu alt" in auf.KRITISCHE_CODES[5021]
|
||||
assert "Volume" not in auf.KRITISCHE_CODES[5021]
|
||||
assert auf.KEY_ABGELEHNT == (5020, 5021)
|
||||
|
||||
|
||||
# ── 5. Was der Docker-Betrieb setzt, gilt auch auf Windows ──────────────
|
||||
#
|
||||
# Commander 29.08.2026: „Prüfe doch einfach mal wie die Docker Rippy heute
|
||||
# funktioniert. Schau was du davon abschließend übernehmen kannst. Wichtig ist
|
||||
# das du das für Windows Umschreibst."
|
||||
#
|
||||
# `docker/worker/entrypoint.sh` setzt vor JEDEM Worker-Start zwei Dinge in
|
||||
# MakeMKVs settings.conf: `app_Key` und `app_UpdateEnable`. Der Key war schon
|
||||
# uebernommen — `app_UpdateEnable` nicht.
|
||||
#
|
||||
# Das ist MakeMKVs Web-Kontakt. Ueber ihn holt MakeMKV die Disc-Schluessel
|
||||
# fuer 4K-UHD nach (Meldung 3338, auf Windows gemessen; unter Linux passiert
|
||||
# es nie). Auf dem Rechner des Commanders nachgesehen: NICHT gesetzt.
|
||||
#
|
||||
# „Fuer Windows umschreiben" heisst hier konkret: Registry statt Datei, und
|
||||
# DWORD statt Text — die Nachbarwerte (`app_BackupDecrypted`) zeigen die Form.
|
||||
|
||||
|
||||
def test_windows_setzt_was_der_entrypoint_setzt():
|
||||
gesetzt = {}
|
||||
namen = auf.einstellungen_sicherstellen(
|
||||
plattform_name="win32",
|
||||
lesen=lambda n: False,
|
||||
setzer=lambda n, w: gesetzt.__setitem__(n, w))
|
||||
assert "app_UpdateEnable" in namen
|
||||
assert gesetzt["app_UpdateEnable"] == 1, "in der Registry ein DWORD, kein Text"
|
||||
|
||||
|
||||
def test_eine_vorhandene_einstellung_wird_NICHT_ueberschrieben():
|
||||
"""Wer den Web-Kontakt bewusst abgeschaltet hat, behaelt ihn abgeschaltet.
|
||||
Rippy stellt einen Ausgangszustand her, es ueberstimmt keine Entscheidung."""
|
||||
angefasst = []
|
||||
namen = auf.einstellungen_sicherstellen(
|
||||
plattform_name="win32",
|
||||
lesen=lambda n: True,
|
||||
setzer=lambda n, w: angefasst.append(n))
|
||||
assert namen == [] and angefasst == []
|
||||
|
||||
|
||||
def test_im_container_macht_das_der_entrypoint():
|
||||
"""Dort steht es in der settings.conf — doppelt waere zwei Wahrheiten."""
|
||||
assert auf.einstellungen_sicherstellen(plattform_name="linux",
|
||||
lesen=lambda n: False,
|
||||
setzer=lambda n, w: 1 / 0) == []
|
||||
|
||||
|
||||
def test_eine_gesperrte_registry_wirft_nicht():
|
||||
"""Ein Einstellungswert ist kein Grund, warum nichts geht."""
|
||||
def sperrt(n, w):
|
||||
raise OSError(5, "Zugriff verweigert")
|
||||
|
||||
assert auf.einstellungen_sicherstellen(plattform_name="win32",
|
||||
lesen=lambda n: False,
|
||||
setzer=sperrt) == []
|
||||
|
||||
|
||||
def test_der_entrypoint_und_windows_kennen_DIESELBEN_namen():
|
||||
"""Waechter: Kommt in der entrypoint.sh eine Einstellung dazu, muss sie
|
||||
hier auftauchen — sonst driften Docker und Windows auseinander."""
|
||||
import io
|
||||
import os
|
||||
import re
|
||||
|
||||
hier = os.path.dirname(os.path.abspath(__file__))
|
||||
pfad = os.path.join(hier, "..", "..", "..", "docker", "worker", "entrypoint.sh")
|
||||
with io.open(os.path.abspath(pfad), encoding="utf-8") as f:
|
||||
text = f.read()
|
||||
im_entrypoint = set(re.findall(r"\bapp_[A-Za-z]+", text))
|
||||
# app_Key laeuft ueber `key_ablegen`, der Rest ueber DOCKER_EINSTELLUNGEN.
|
||||
offen = im_entrypoint - {"app_Key"} - set(auf.DOCKER_EINSTELLUNGEN)
|
||||
assert not offen, "entrypoint.sh setzt %s — Windows nicht" % sorted(offen)
|
||||
|
||||
@@ -381,6 +381,12 @@ def _beta_key_holen(melden=None) -> str:
|
||||
from rippy.rip import makemkv_aufruf
|
||||
from rippy.tools import katalog
|
||||
|
||||
# Was der Docker-Betrieb beim Start ausdruecklich setzt, gilt hier auch —
|
||||
# uebersetzt in die Windows-Form (Registry statt settings.conf). Ohne den
|
||||
# Web-Kontakt holt MakeMKV keine Disc-Schluessel fuer 4K-UHD nach.
|
||||
for name in makemkv_aufruf.einstellungen_sicherstellen():
|
||||
melden(" MakeMKV-Einstellung gesetzt: %s" % name)
|
||||
|
||||
urteil = makemkv_aufruf.key_setzen_und_pruefen(key, katalog.finden("makemkv"))
|
||||
if urteil["ok"]:
|
||||
melden(" MakeMKV-Beta-Key geholt und angenommen (…%s)." % key[-6:])
|
||||
|
||||
Reference in New Issue
Block a user