feat(drives): V2-4 (Teil 2) — main.py laedt unter Windows, Treiber gemessen
Ampel / ampel (push) Failing after 46s

WAS: rippy/drives/__init__.py waehlt den Treiber fuer DIESE Maschine.
main.py und prescan.py fragen ihn, statt fest den Linux-Treiber zu
importieren. Damit ist der Blocker fuer den nativen Windows-Betrieb weg.

GEMESSEN, vorher (frische Python-3.12-Umgebung unter Windows):
  >>> import main
  ModuleNotFoundError: No module named 'fcntl'

GEMESSEN, nachher:
  main.py laedt unter Windows: JA
    Treiber:   rippy.drives.windows
    Routen:    61
    Laufwerke: ['\\.\G:']

Der Import stand in rippy/drives/linux.py -> detection.py -> fcntl. Genau
dafuer gibt es den Port: Der Aufrufer sagt WAS, nicht WIE. test_treiberwahl.py
haelt ausserdem fest, dass BEIDE Treiber denselben Satz Funktionen anbieten —
sonst faellt eine fehlende erst im Betrieb als AttributeError auf, und zwar
auf der anderen Plattform.

DER TREIBER AN ECHTER HARDWARE (LG BU40N extern, Laufwerk G:, LEER):
  GetDriveTypeW("G:\\")              -> 5 (DRIVE_CDROM)
  list_optical_devices()             -> ['\\.\G:']
  CreateFileW(r"\.\G:")             -> Handle 380
  CHECK_VERIFY2 bei leerem Laufwerk  -> ERROR_NOT_READY (21)
  drive_status()                     -> 1 (CDS_NO_DISC)
  detect_disc_type()                 -> 'no_disc'
  device_info()['status']            -> 'empty'
  MEDIA_REMOVAL (entriegeln)         -> Erfolg,   0,1 ms
  EJECT_MEDIA                        -> Erfolg, 664,8 ms

Die 664,8 ms sind der Beleg, dass wirklich etwas passiert ist: Ein
abgelehnter Steuercode kommt in rund 2 ms zurueck.

BEFUND, DER EIN PLACEBO VERHINDERT HAT: IOCTL_STORAGE_LOAD_MEDIA (Schublade
einziehen) antwortet auf diesem Laufwerk mit ERROR_INVALID_FUNCTION. Bei
flachen und externen Laufwerken ist das die Regel. Deshalb gibt es bewusst
KEINE einziehen()-Funktion — ein Knopf "Schublade schliessen", der auf der
Haelfte aller Laufwerke stillschweigend nichts tut, waere genau die Sorte
Placebo, die in Etappe 19 aufgeraeumt wurde.

Dazu eine DeprecationWarning behoben: '\G' im Docstring ist keine gueltige
Escape-Sequenz und waere in einer kuenftigen Python-Version ein harter Fehler.

NOCH NICHT gemessen: das Verhalten MIT eingelegter Disc (Typ-Erkennung ueber
die Groesse, und ein Auswurf, bei dem wirklich etwas drin ist).

GEMESSEN: ruff sauber, 429 Tests gruen + 13 uebersprungen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-08-28 09:55:15 +02:00
co-authored by Claude Opus 5
parent b723fee3a2
commit 3d7f3b1680
5 changed files with 177 additions and 14 deletions
+16 -7
View File
@@ -12,7 +12,7 @@ import time
import uuid
from rippy import store as db
from rippy.drives import linux as device_discovery
from rippy import drives as laufwerks_schicht
import eta
from rippy.rip import makemkv_daten
import makemkv_key
@@ -25,12 +25,7 @@ import phasen
import presets as preset_auswahl
import rohdaten
from celery_client import celery_client, start_rip
from rippy.drives.detection import (
CDS_DISC_OK,
CDS_NO_DISC,
CDS_TRAY_OPEN,
drive_status,
)
from rippy.drives.cdrom import CDS_DISC_OK, CDS_NO_DISC, CDS_TRAY_OPEN
from config_validation import validate_config, ConfigValidationError
from cache import get as cache_get, init_cache, set as cache_set
@@ -43,6 +38,20 @@ from ratelimit import (
)
from prescan import PreScan
# ── Der Laufwerks-Treiber DIESER Maschine ──────────────────────────────
#
# Bis V2-4 stand hier `from rippy.drives import linux`. Das laedt ueber
# detection.py das Modul `fcntl` — und damit war main.py unter Windows
# ueberhaupt nicht ladbar (am 28.08.2026 in einer frischen Python-3.12-
# Umgebung gemessen: ModuleNotFoundError: No module named 'fcntl').
#
# Genau dafuer gibt es den Port rippy.ports.Drives: Der Aufrufer sagt, WAS
# er will; welcher Treiber das kann, entscheidet rippy/drives/__init__.py.
# Die CDS_*-Konstanten oben kommen aus cdrom.py und gelten auf beiden
# Plattformen — der Windows-Treiber uebersetzt seine Antworten darauf.
device_discovery = laufwerks_schicht.treiber()
drive_status = device_discovery.drive_status
# Auth (JWT/Login/API-Keys) KOMPLETT entfernt — Commander-Entscheid 24.07.2026:
# Rippy läuft ausschließlich im Heimnetz, die Endpoints schützten ohnehin
# nichts (kein Login-Flow im UI) und waren damit Placebo-Oberfläche.