Commander: „das die disc erkennung noch läuft muss sichtbar sein"
Er hat recht, und die Wartezeit ist gemessen: `makemkvcon info` laeuft an
einer Blu-ray in seine 120-Sekunden-Grenze (Disc nach 119 s erkannt). Zwei
Minuten, in denen NICHTS zu sehen war — weder die Disc noch ein Hinweis. Das
sah aus wie ein leeres Laufwerk, also wie ein Fehler.
## Der Zustand war da, er wurde nur weggeworfen
`_auto_prescan` legt beim Start `{"_laeuft": True}` in den Vorrat.
`laufwerke_mit_disc` liess so einen Eintrag KOMPLETT weg — damit keine
halbfertige Disc-Karte mit „Wird erkannt…" als Titel und einem „Rippen
starten"-Knopf erscheint. Richtig gedacht, falsch geloest.
Jetzt gibt es ein eigenes Feld `disc_wird_erkannt`. Die Oberflaeche kann
„wird gelesen" zeigen, ohne einen Titel zu behaupten, den es noch nicht gibt:
eine Karte mit Spinner ueber der Laufwerksliste und eine eigene Zeile im
Server-Status.
## Und der Haken dahinter
Genau waehrend der Erkennung ist die Laufwerks-Auskunft am teuersten:
makemkvcon haelt das Laufwerk, und `device_info` wartet mit. Gemessen:
/devices waehrend des Scans 14,0 s
Zeitgrenze des Schnappschusses 5,0 s -> devices = None
`None` heisst „konnte nicht nachsehen", und die Oberflaeche behaelt dann
ihren Stand — nach einem frischen Laden also GAR NICHTS. Die Anzeige waere
ausgerechnet in ihrer eigenen Phase leer geblieben.
`laufwerke_notdurft()` antwortet deshalb ohne ioctl: letzter bekannter Stand
plus die aktuelle Erkennungs-Marke aus dem Vorrat. Beim Kaltstart wenigstens
der Laufwerksname — die LISTE der Laufwerke ist billig, teuer ist erst das
Anfassen. Nichts wird erfunden: kein Typ, kein Modell. Und wer noch nie
erfolgreich gelesen hat, schweigt weiter mit `None`.
Im Browser gegengeprueft: „Disc wird gelesen — Laufwerk G:" mit Spinner,
Server-Status „Disc wird gelesen — das dauert bis zu zwei Minuten", danach
der richtige Titel.
859 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
dbb934d146
commit
e67138e9ca
@@ -538,3 +538,116 @@ def test_eine_noch_laufende_erkennung_wird_NICHT_als_disc_gemeldet(monkeypatch):
|
||||
{"_laeuft": True, "title": "Wird erkannt…"})
|
||||
|
||||
assert "disc" not in main.laufwerke_mit_disc()[0]
|
||||
|
||||
|
||||
def test_eine_laufende_erkennung_ist_SICHTBAR(monkeypatch):
|
||||
"""Commander 29.08.2026: „das die disc erkennung noch läuft muss sichtbar
|
||||
sein."
|
||||
|
||||
Vorher liess `laufwerke_mit_disc` einen laufenden Eintrag KOMPLETT weg —
|
||||
damit keine halbfertige Disc-Karte mit „Wird erkannt…" als Titel und
|
||||
einem „Rippen starten"-Knopf erscheint. Richtig gedacht, falsch geloest:
|
||||
Fuer die Oberflaeche sah es aus wie ein leeres Laufwerk. Und das dauert:
|
||||
`makemkvcon info` laeuft an einer Blu-ray in seine 120-Sekunden-Grenze
|
||||
(gemessen: Disc nach 119 s erkannt).
|
||||
"""
|
||||
import main
|
||||
|
||||
monkeypatch.setattr(main.device_discovery, "list_optical_devices",
|
||||
lambda: [r"\.\G:"])
|
||||
monkeypatch.setattr(main.device_discovery, "device_info",
|
||||
lambda p: {"id": "G", "name": "Laufwerk G:", "path": p,
|
||||
"type": "bluray", "status": "ready"})
|
||||
monkeypatch.setitem(main.DISC_CACHE, r"\.\G:",
|
||||
{"_laeuft": True, "title": "Wird erkannt…"})
|
||||
|
||||
geraet = main.laufwerke_mit_disc()[0]
|
||||
assert geraet["disc_wird_erkannt"] is True
|
||||
# UND weiterhin keinen Titel behaupten, den es noch nicht gibt.
|
||||
assert "disc" not in geraet
|
||||
|
||||
|
||||
def test_nach_der_erkennung_ist_die_marke_wieder_weg(monkeypatch):
|
||||
import main
|
||||
|
||||
monkeypatch.setattr(main.device_discovery, "list_optical_devices",
|
||||
lambda: [r"\.\G:"])
|
||||
monkeypatch.setattr(main.device_discovery, "device_info",
|
||||
lambda p: {"id": "G", "name": "Laufwerk G:", "path": p,
|
||||
"type": "bluray", "status": "ready"})
|
||||
monkeypatch.setitem(main.DISC_CACHE, r"\.\G:", {"title": "Evangelion 2.22"})
|
||||
|
||||
geraet = main.laufwerke_mit_disc()[0]
|
||||
assert not geraet.get("disc_wird_erkannt")
|
||||
assert geraet["disc"]["title"] == "Evangelion 2.22"
|
||||
|
||||
|
||||
def test_das_geraetemodell_gibt_die_marke_auch_heraus():
|
||||
"""Ohne Feld im Modell schneidet FastAPI sie weg — und das UI saehe
|
||||
wieder nichts (derselbe Fehler wie 25.07. bei `meta`)."""
|
||||
import main
|
||||
|
||||
assert "disc_wird_erkannt" in main.Device.model_fields
|
||||
|
||||
|
||||
# ── Die Notdurft-Auskunft (Befund 29.08.2026) ──────────────────────────
|
||||
#
|
||||
# Waehrend der Disc-Erkennung haelt makemkvcon das Laufwerk. Gemessen:
|
||||
# /devices braucht dann 14,0 s, die Zeitgrenze des Schnappschusses ist 5,0 s.
|
||||
# Der lieferte deshalb `devices = None` („konnte nicht nachsehen") — und nach
|
||||
# einem frischen Laden hatte das UI keinen alten Stand, den es haette behalten
|
||||
# koennen. Der Bildschirm blieb leer, ausgerechnet in der Phase, die sichtbar
|
||||
# sein soll.
|
||||
|
||||
|
||||
def test_notdurft_meldet_den_letzten_stand_plus_die_erkennung(monkeypatch):
|
||||
import main
|
||||
|
||||
monkeypatch.setattr(main, "LETZTE_LAUFWERKE",
|
||||
[{"id": "G", "name": "Laufwerk G:", "path": r"\.\G:",
|
||||
"type": "bluray", "status": "ready"}])
|
||||
monkeypatch.setitem(main.DISC_CACHE, r"\.\G:", {"_laeuft": True})
|
||||
|
||||
geraete = main.laufwerke_notdurft()
|
||||
assert geraete[0]["disc_wird_erkannt"] is True
|
||||
assert geraete[0]["type"] == "bluray", "der letzte bekannte Typ bleibt"
|
||||
|
||||
|
||||
def test_notdurft_ohne_jeden_stand_erfindet_nichts(monkeypatch):
|
||||
"""Wer nie erfolgreich gelesen hat, soll schweigen — `None` heisst
|
||||
„behalte deinen Stand", und das ist die ehrliche Antwort."""
|
||||
import main
|
||||
|
||||
monkeypatch.setattr(main, "LETZTE_LAUFWERKE", [])
|
||||
monkeypatch.setattr(main.device_discovery, "list_optical_devices", lambda: [])
|
||||
assert main.laufwerke_notdurft() is None
|
||||
|
||||
|
||||
def test_notdurft_beim_kaltstart_nennt_wenigstens_das_laufwerk(monkeypatch):
|
||||
"""Kaltstart mitten in der Erkennung: Die LISTE der Laufwerke ist billig,
|
||||
nur das Abfragen des Laufwerks ist teuer."""
|
||||
import main
|
||||
|
||||
monkeypatch.setattr(main, "LETZTE_LAUFWERKE", [])
|
||||
monkeypatch.setattr(main.device_discovery, "list_optical_devices",
|
||||
lambda: [r"\.\G:"])
|
||||
monkeypatch.setitem(main.DISC_CACHE, r"\.\G:", {"_laeuft": True})
|
||||
|
||||
geraete = main.laufwerke_notdurft()
|
||||
assert geraete[0]["disc_wird_erkannt"] is True
|
||||
assert geraete[0]["type"] == "unknown", "kein Typ wird erfunden"
|
||||
|
||||
|
||||
def test_ein_fertiges_ergebnis_ueberschreibt_die_alte_marke(monkeypatch):
|
||||
"""Sonst bliebe „wird erkannt" stehen, nachdem die Disc laengst da ist."""
|
||||
import main
|
||||
|
||||
monkeypatch.setattr(main, "LETZTE_LAUFWERKE",
|
||||
[{"id": "G", "name": "Laufwerk G:", "path": r"\.\G:",
|
||||
"type": "bluray", "status": "ready",
|
||||
"disc_wird_erkannt": True}])
|
||||
monkeypatch.setitem(main.DISC_CACHE, r"\.\G:", {"title": "Evangelion 2.22"})
|
||||
|
||||
geraet = main.laufwerke_notdurft()[0]
|
||||
assert "disc_wird_erkannt" not in geraet
|
||||
assert geraet["disc"]["title"] == "Evangelion 2.22"
|
||||
|
||||
Reference in New Issue
Block a user