Commit Graph

99 Commits

Author SHA1 Message Date
Hitonabi 37711f87c1 Jikan-Retry bei 504 + Cache-Verfall fuer mittelgute Prescan-Treffer
Ampel / ampel (push) Failing after 39s
Jikan (Gratis-Dienst) wirft sporadisch 504 — ein Retry mit 2s Pause;
aktuell ist der Dienst ganz down, die Kette faellt sauber auf OMDb.
Prescan-Cache: 0.6-0.9 verfaellt nach 1 Tag, ab 0.9 nach 7 Tagen —
sonst wuerde ein frueher OMDb-Treffer bessere Quellen fuer immer blocken.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 21:25:10 +02:00
Hitonabi 07be54e62a Jikan/MAL-Quelle + Job-Titel + Abbrechen-Knopf + Dark-Hover + Ordner-Verwaltung
Ampel / ampel (push) Failing after 38s
Commander-Befunde (Screenshots 23.07. abends):
- Jikan (MyAnimeList, kostenlos OHNE Key) als Anime-Quelle vor OMDb —
  waehlt per Titel-Aehnlichkeit (SequenceMatcher, Schwelle 0.55) statt
  blind Treffer 1; damit trifft "Evangelion 2.22" den exakten Film
- Job-Titel: POST /jobs uebernimmt den erkannten Disc-Titel aus dem
  DISC_CACHE — Schluss mit "Unbekannt" in der Queue
- Kooperativer Job-Abbruch: POST /jobs/{id}/cancel setzt canceling,
  der Worker prueft das Flag bei jedem Fortschritts-Update und killt
  den Encoder-Prozess sauber (RipAbbruch); UI-Knopf "Abbrechen" fuer
  laufende, Status-Badge "Wird abgebrochen"
- Dark-Mode: Job-Zeilen-Hover war hart hell (hover:bg-slate-50)
- Speicherziele: lokaler Ordner-Browser mit "Ordner anlegen"
  (GET /browse + POST /browse/mkdir, nur unter /app/media)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 21:22:57 +02:00
Hitonabi 85f352b14f OMDb-Qualitaets-Gate: ohne Poster UND Plot = Nicht-Treffer, Kette laeuft weiter
Ampel / ampel (push) Failing after 36s
Der Datenmuell-Eintrag ("Episode 110 - ...") war der EINZIGE s=-Treffer
fuer den vollen Titel und brach die Kandidaten-Kette bei 0.8 ab, bevor
"Evangelion" allein probiert wurde. N/A-Werte werden jetzt normalisiert.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 21:13:03 +02:00
Hitonabi 241ce3ec78 OMDb-Ergebnis-Waehler: Filme vor Episoden, Poster vor ohne, kurz vor lang
Ampel / ampel (push) Failing after 39s
Die unscharfe Suche nahm blind Treffer 1 — fuer "Evangelion" war das
"Episode 110 - ..." (ein Review-Podcast ueber den Film, ohne Poster).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 21:11:42 +02:00
Hitonabi f2d5961c33 Metadaten-Feinschliff: Wort-Strip-Degradation + kein Caching von "unknown"
Ampel / ampel (push) Failing after 40s
- titel_kandidaten strippt hintere Worte iterativ bis auf eins
  ("Evangelion 2.22" wird auch als "Evangelion" gesucht — OMDb braucht das)
- Nur Treffer ab Confidence 0.6 landen im Redis-Cache: ein gecachtes
  "unknown" wurde sonst auch nach Key-Eintrag ewig wieder serviert
  (Redis ist persistent; Alt-Eintraege auf der VM geloescht)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 21:10:15 +02:00
Hitonabi 90eb17d407 UX-Runde: echte Disc-Titel via BD-Metadaten, Preview-Crash, Dashboard, Ziele
Ampel / ampel (push) Failing after 38s
Commander-Befunde 23.07. abends:
1. Metadaten "klappen nicht": Wurzel = kryptisches Volume-Label + kein
   TMDB-Key. Jetzt: API mountet die Disc read-only (CAP_SYS_ADMIN ist da)
   und liest den KLARTEXT-Titel aus BDMV/META/DL/bdmt_*.xml; dazu
   progressive Suchdegradation (Titel-Varianten) und OMDb-Unscharf-Suche
   (s= + imdbID-Nachladen) — mit dem vorhandenen OMDb-Key gibt es damit
   Titel/Jahr/Poster auch ohne TMDB
2. Weisses Fenster beim Pre-Scan: Lucide-Icons sind forwardRef —
   Direktaufruf getIcon(...)({size}) crashte die Seite; als JSX gerendert
3. Dashboard sortiert: System-Leiste (Encoder + aktiver Job) oben,
   Disc/Geraete -> Stats -> Jobs, Live-Log ans Ende
4. Ziel-Dialog mit ORDNER-BROWSER (GET /browse, nur unter /app/media);
   Schnellwahl nutzt die Settings-Unterordner statt Hartkodierung;
   Tab "Verzeichnisse" in "Speicherziele" aufgegangen (redundant)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 21:07:55 +02:00
Hitonabi 3d384c1e86 Fix: db.update_job fehlte im API-Modul (retry-transcode warf 500)
Ampel / ampel (push) Failing after 36s
Die Job/Log-Tabellen leben bewusst doppelt in api/ und worker/ —
update_job gab es nur im Worker. Der Import-Smoke-Test prueft Routen,
aber keine Modul-Attribute; Lehre fuer die Etappe "geteiltes Paket".

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 20:55:57 +02:00
Hitonabi 7652afe955 Deploy-Befunde gefixt: Disc-Typ-Verlust, giftiger Prescan-Cache, caps-Import
Ampel / ampel (push) Failing after 28s
- Pre-Scan verlor den erkannten Typ (BDs hiessen immer "DVD"): scan()
  reicht disc_type jetzt in die Zweige durch
- GIFTIG: Cache-Key nur aus Geraetepfad — die naechste Disc im selben
  Laufwerk haette die Metadaten der vorherigen geerbt. Key enthaelt jetzt
  einen Disc-Fingerabdruck (Label|Groesse)
- Worker-Faehigkeiten: import caps auf Modulebene — im worker_ready-Signal
  war /app nicht mehr im sys.path (ModuleNotFoundError im Deploy-Log)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 20:54:14 +02:00
Hitonabi b584cc29ad Universal-Sprint: Wizard, UI-Mounts, Encoder-Erkennung, Task-Split, README
Ampel / ampel (push) Successful in 29s
Commander-Ziel: All-in-one, universell, weitergebbar.

- First-Run-Wizard: startet automatisch bei neuer Installation (Keys,
  Verarbeitung, erkannte Hardware); /setup + /setup/complete
- Data-Mounts via UI: Einstellungen -> Speicherziele haengt NFS/SMB direkt
  ein (mounts.py, CAP_SYS_ADMIN + rshared-Propagation, Auto-Remount beim
  Start, CIFS-Creds via Datei statt Kommandozeile); nfs-common/cifs-utils
  im api-Image
- Encoder-Erkennung: jeder Worker meldet beim Start ehrlich seine
  Faehigkeiten (caps.py -> workers-Tabelle), GET /capabilities, Anzeige
  in Wizard + Verarbeitung-Tab
- Task-Split: transcode_files als eigener Task auf Queue "transcode"
  (Basis fuer optionale Remote-GPU-Worker, deploy/remote-transcode-worker.yml
  EXPERIMENTELL) + POST /jobs/{id}/retry-transcode + UI-Knopf
  "Neu komprimieren" bei fehlgeschlagenen Jobs
- API-Keys aus der DB: Settings-UI/Wizard ueberstimmen Env — vorher waren
  die Key-Felder im UI reine Dekoration (Clients lasen nur Env)
- README komplett neu: generischer Schnellstart, Laufwerk-Override via
  docker-compose.override.yml, Architektur, Env-Tabelle

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 20:49:08 +02:00
Hitonabi e350523f7e Dashboard-Disc-Karte: Auto-Pre-Scan beim Einlegen — man SIEHT was drinliegt
Ampel / ampel (push) Successful in 41s
Commander-Befund: Disc wurde erkannt, aber das UI verriet nicht WAS.
- Watcher stoesst beim Einlegen (und beim Start mit bereits eingelegter
  Disc) automatisch den Pre-Scan an, Ergebnis landet im DISC_CACHE und
  im Log ("Disc erkannt: Titel (Jahr) [typ, Confidence]")
- GET /devices liefert das disc-Feld mit Titel/Jahr/Typ/Confidence/Poster
- UI: prominente Karte "Im Laufwerk erkannt" mit Poster (TMDB relativ
  oder OMDb absolut), Beschreibung und Rippen-Start (Ziel-Dialog)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 19:55:18 +02:00
Hitonabi dfef585ec8 Speicherziel-Wahl: Rip-Ziel pro Job frei waehlbar (Etappe 16 / Task 16)
Ampel / ampel (push) Successful in 28s
- POST /jobs nimmt target_dir (validiert unter /app/media, .. fliegt raus)
- GET /storage-targets: Verzeichnisse unter /app/media inkl. Mount-Flag
  und freiem Platz — NFS/SMB-Shares unter /srv/rippy/media erscheinen
  dank rslave-Bind automatisch
- jobs.target_dir (Mini-Migration via ADD COLUMN IF NOT EXISTS)
- Worker: rip_disc(target_dir) mit eigener Validierung; CD/Video/
  Transcode-Pfade legen im gewaehlten Ziel ab
- UI: "Rippen starten" oeffnet den Ziel-Dialog (Filme/Serien/Musik oder
  eigener Pfad); Modal-Bugfix: customPath wurde still ignoriert

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 16:20:36 +02:00
Hitonabi 06cab545da Compose: MAKEMKV_URL_BASE als Build-Arg aus .env — Deploy-Abbruch gefixt
Ampel / ampel (push) Successful in 34s
Der plain "compose up --build" kannte das Wayback-Build-Arg nicht, griff
auf das tote makemkv.com zu (curl 22) und liess den halben Stack gestoppt
zurueck (nginx fand den api-Upstream nicht mehr). Jetzt steuert die .env
die Quelle; Default bleibt die offizielle URL.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 16:14:54 +02:00
Hitonabi ef137b64cd Media als /srv/rippy/media-Bind mit rslave — Fundament fuer freie Rip-Ziele
Ampel / ampel (push) Successful in 32s
Commander-Anforderung: Ablageziel via Rippy waehlbar (Share/NFS/UNC).
Statt anonymem Docker-Volume liegt /app/media jetzt auf /srv/rippy/media
der VM; rslave-Propagation laesst NACH Container-Start eingehaengte
NFS/SMB-Mounts live im Container auftauchen. Naechster Schritt:
target_dir pro Job + Ziel-Auswahl im UI (Task 16).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 16:12:00 +02:00
Hitonabi 2474b683e2 Transcode-Stufe: HandBrake komprimiert NACH dem MakeMKV-Rip + --noscan-Fix
Ampel / ampel (push) Successful in 34s
Commander-Entscheid 23.07.: 40-GB-Rohdateien sind kein brauchbares
Endprodukt. Architektur bleibt zweistufig, weil HandBrake AACS nicht
lesen kann: MakeMKV rippt verlustfrei nach /app/temp/raw, HandBrake
macht daraus x265 auf Arbeitsgroesse in /app/media, Roh-Verzeichnis
wird erst NACH komplettem Erfolg geloescht (keepOriginal behaelt es).

- Worker: handbrake-cli im Image, run_handbrake + _komprimiere,
  Job-Status "transcoding", Settings aus Postgres (transcodeEnabled/
  Preset/keepOriginal), Fortschritt je Datei aggregiert
- makemkvcon: --noscan im Kommando verankert — der Geraete-Scan haengt
  (1.18.4) bzw. crasht (1.17.7) im Container, mit --noscan + dev:-Pfad
  laeuft es (Befund 23.07., DRV-Zeile beweist Laufwerks-Erkennung)
- UI: Settings-Tab "Verarbeitung" (Toggle/Preset/Original behalten),
  Status-Badge "Komprimieren", LiveLog erkennt transcoding als aktiv
- KONZEPT/ROADMAP entsprechend aktualisiert; Tests fuer HandBrake-Cmd
  (arbeitet auf DATEI, nie am Geraet) und Progress-Regex

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 15:56:37 +02:00
Hitonabi 009898efae MakeMKV auf 1.17.7 gepinnt — 1.18.x haengt unter Linux beim Laufwerks-Scan
Ampel / ampel (push) Successful in 40s
Bei uns reproduziert (100% CPU, keine Ausgabe, auch mit sg-Knoten), im
MakeMKV-Forum vielfach bestaetigt (t=38128, t=38239, t=38249); Community-
Workaround ist 1.17.7. Bonus: exakt die Version, die spaeter die Firmware
flashen kann. MAKEMKV_URL_BASE als Build-Arg, weil makemkv.com gerade
per Cloudflare-525 down ist (Wayback-Snapshot als Ausweichquelle);
sha256 der Tarballs wird im Build-Log festgehalten.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 15:39:56 +02:00
Hitonabi bd6409038e UDF-Volume-Label-Leser (Blu-rays haben keine ISO-Bridge) + Etappe 12 (ARM)
Ampel / ampel (push) Successful in 35s
Praxis-Befund mit echter BD-50: reines UDF, der ISO-PVD-Leser griff nicht.
Jetzt ECMA-167-Weg (AVDP Sektor 256 -> Main VDS -> PVD Tag-ID 1 ->
Volume Identifier als d-string), mit Tests fuer das d-string-Parsing.

ROADMAP Etappe 12 aus der ARM-Vollanalyse: was wir uebernehmen
(Fingerprint-DB, bdmt_eng.xml, Suchdegradation, Manual Mode, Apprise,
Multi-Drive, Backup-Modus) und wo wir ARM schlagen (Serien-Episoden-
Matching, Main-Feature per Laufzeitabgleich).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 15:33:27 +02:00
Hitonabi 1aa51ca943 UI-Feinschliff: Settings-Tabs funktionieren, Details-Knopf tut etwas
Ampel / ampel (push) Successful in 33s
- Settings: Tabs waren reine Dekoration (kein onClick, isActive fest) —
  jetzt echte Tab-Navigation (Ripping/Verzeichnisse/APIs/Benachrichtigungen)
  + OMDb-Key-Feld im APIs-Tab
- Laufwerk-Details: aufklappbares Panel (Pfad/Modell/Seriennummer/Disc)
  mit "Rippen starten" (POST /jobs) und "Auswerfen" (Eject-Endpoint)
- Placebos raus: 4 tote Schnellaktionen, doppelte Geraete-Sektion mit
  zweitem totem Details-Knopf, toter Abmelden-Knopf

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 15:30:09 +02:00
Hitonabi 5528e0f652 Metadaten-Fallback OMDb + Pre-Scan repariert + Eject-Endpoint
- clients/omdb.py: OMDb als zweite Quelle (Fallback-Kette: TMDB exakt ->
  OMDb -> bester TMDB-Vorschlag mit niedriger Confidence -> unknown)
- Pre-Scan-Reparatur: Titel kam nie an — makemkvcon existiert nur im
  Worker, isosize war nirgends installiert (fiel still auf "DVD" zurueck).
  Jetzt: ISO-9660-Volume-Label direkt vom Medium + Label-Normalisierung
  (PULP_FICTION -> Pulp Fiction), Disc-Typ ueber zentrale detection.py
- POST /devices/{name}/eject (CDROMEJECT-ioctl) mit Job-Schutz (409 wenn
  auf dem Laufwerk gerade gerippt wird)
- OMDB_API_KEY in compose/.env.example; .env.example komplett ehrlich
  dokumentiert (JWT-Pflicht, MakeMKV-Beta-Key-Rhythmus)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 15:30:09 +02:00
Hitonabi 96c6e1fe42 Compose: /dev/sg1 fuer den Worker — MakeMKV geht ueber SCSI-Generic
Ampel / ampel (push) Successful in 33s
Befund: mit nur /dev/sr0 meldet makemkvcon "can't find any usable optical
drives" — es nutzt die sg-Schicht (libdriveio), nicht den Block-Knoten.
sg1 = BD-Laufwerk in der VM (sg0 = Systemplatte).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 15:16:07 +02:00
Hitonabi 4aa237541f Fix: makemkvcon landete in /usr statt /usr/local — COPY nahm es nie mit
Ampel / ampel (push) Successful in 36s
Deploy-Befund 23.07.: Image frisch gebaut, GPL-Teile da, aber makemkvcon
fehlte — makemkv-bin installiert ohne PREFIX nach /usr, die Final-Stage
kopiert nur /usr/local. Jetzt PREFIX=/usr/local + test -x als Build-Beweis.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 15:14:14 +02:00
Hitonabi 2f6a01c9e4 Merge Kernumbau 23.07.: Etappe 10 (MakeMKV) + Etappe 11 (Job-Kette, UI, Compose)
Ampel / ampel (push) Successful in 30s
Ampel auf dem Branch gruen (Lauf 24: 21 Tests, Ruff, Vite-Build).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 15:06:12 +02:00
Hitonabi ef84392848 Fix: .gitignore-Venv-Muster lib/ verschluckte docker/ui/src/lib/
Ampel / ampel (push) Successful in 30s
Der Ampel-Rot-Lauf 23 zeigte es: api.ts (der neue API-Client) kam nie im
Commit an — das Python-venv-Muster `lib/` galt fuer JEDES lib-Verzeichnis
im Baum. Jetzt auf Root verankert (/lib/), Datei nachgereicht.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 15:04:56 +02:00
Hitonabi cf2f65c567 Doku: 15 Troubleshooting-Leichen raus, SAVEPOINT v3.0 + ROADMAP Etappe 11
Ampel / ampel (push) Failing after 29s
ARCAN-*.md, Setup-/Fix-Skripte (u.a. install-rippy.sh fuer ein nie
existentes "LXC 106"), proxmox-add-drive.sh (scsi-Passthrough war der
falsche Weg — richtig ist USB-Passthrough per Vendor-ID, siehe SAVEPOINT)
und die udev-Rules (referenzierten ein nie gebautes udev_daemon.py).
SAVEPOINT dokumentiert Kernumbau + Hardware-Kette + Firmware-Befund (BU40N
1.05 kann kein UHD — Crossflash 1.03-MK ist der dokumentierte Weg).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 15:02:39 +02:00
Hitonabi f2da1ad525 UI: echter Build hinter nginx, relative API-Pfade, Logs-Seite ehrlich
Vorher lief der Vite-ENTWICKLUNGSSERVER als Produktion, und vier Dateien
riefen hartkodiert http://localhost:8000 auf — vom PC aus fragte der Browser
damit den PC selbst nach Laufwerken (deshalb blieb das UI immer leer);
Settings nutzte ein nie gesetztes VITE_API_URL. Die Logs-Seite zeigte fest
einprogrammierte Fantasie-Einträge ("The Matrix gerippt").

- lib/api.ts: axios-Instanz mit baseURL /api; nginx proxied /api → api:8000
  (ein Origin, kein CORS), SSE-tauglich (proxy_buffering off)
- Dockerfile: Vite-Build → nginx:alpine statt npm run dev
- Logs + LiveLog von echtem /logs-Endpoint; MetadataPreview: echte Laufwerke
  aus /devices statt erfundener /dev/bluray-Optionen, startet echten Job

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 15:02:39 +02:00
Hitonabi eee3a83d0e Compose: Laufwerk als devices: statt Bind-Mount, Ausgabe aufs media-Volume
Bind-Mounts unter volumes: geben dem Container den Geräteknoten, aber keine
Device-Cgroup-Erlaubnis — jedes open() scheiterte mit EPERM. Totes
disc:-Volume raus (kein udevd legt dort je Symlinks an), depends_on wartet
jetzt auf healthy, Worker-read_only bis zur Härtung ausgesetzt (MakeMKV
braucht HOME).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 15:02:13 +02:00
Hitonabi 28a12b2e06 API: Die Job-Kette existiert jetzt — POST /jobs, Watcher, Postgres, /logs
Vorher gab es KEINEN Code-Pfad, der je einen Rip ausgelöst hat: kein
POST /jobs, kein udev-Daemon (udev_daemon.py existierte nirgends), GET /jobs
gab hart [] zurück, Postgres lag komplett brach, der SSE-Stream konnte
strukturell nie senden (sse_connections wurde nie befüllt), udevadm lieferte
ohne udevd nichts.

- POST /jobs: legt Job-Zeile an, schickt worker.tasks.rip_disc via Celery
- GET /jobs aus Postgres (running→processing fürs UI)
- Disc-Watcher: 3s-ioctl-Poll statt udev, protokolliert Einwurf/Auswurf
- /devices über /sys (vendor/model) + ioctl-Status — ehrlich statt leer
- /logs + /settings (Settings-Seite sprach vorher gegen 404)
- SSE-Fix, udev aus dem API-Image entfernt, Import-Smoke-Test

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 15:02:13 +02:00
Hitonabi 780d114fe4 Etappe 10: Worker rippt wirklich — MakeMKV 1.18.4 + ioctl-Disc-Erkennung
Vorher: Dockerfile unbaubar (makepkg ist ein Arch-Paket, existiert in Debian
nicht) und KEIN einziges Ripping-Tool im Image — jeder Rip endete sofort.
Disc-Erkennung via `file -L` konnte auf Block-Devices strukturell nie etwas
erkennen; ihr Test mockte sich die Ausgabe passend.

- makemkv-oss/bin 1.18.4 multi-stage (bookworm-gepinnt), EULA via
  tmp/eula_accepted, Beta-Key aus MAKEMKV_APP_KEY (entrypoint.sh)
- makemkvcon-Aufruf + PRGV-Parsing laut makemkv.com/developers/usage.txt
  (AGENTS Regel D), HandBrake raus aus dem Ripp-Pfad (KONZEPT: lossless=Muss)
- detection.py: CDROM_DISC_STATUS + BLKGETSIZE64 (cd/dvd/bluray), pure
  classify() mit ehrlichen Tests
- tasks.py: rip_disc als einziger Celery-Task, schreibt Status/Fortschritt
  nach Postgres (db.py), Ausgabe auf /app/media (Volume) statt totem /output

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 15:02:13 +02:00
Hitonabi b80b7681c5 fix: install udev in API container for udevadm device detection
Ampel / ampel (push) Successful in 30s
2026-07-23 13:41:06 +02:00
Hitonabi 977da015fb fix: remove read_only for API container to allow device mounts
Ampel / ampel (push) Successful in 30s
2026-07-23 13:37:51 +02:00
Hitonabi 0ae9378fca fix: add device mounts to API container for /devices endpoint
Ampel / ampel (push) Successful in 35s
2026-07-23 13:36:44 +02:00
Hitonabi 68094f8b43 fix(api): detect direct devices /dev/sr0, /dev/cdrom
Ampel / ampel (push) Successful in 32s
- Get devices from /dev/disc/ (udev symlinks)
- Also check direct devices: /dev/sr0, /dev/cdrom, /dev/dvd
- Use udevadm to detect device type (cd/dvd/bluray)
- Extract model and serial for better identification
2026-07-23 12:59:09 +02:00
Hitonabi ca3139289c docs: Laufwerk an Proxmox VM durchreichen
Ampel / ampel (push) Failing after 13m17s
- VM-Konfiguration prüfen: Laufwerk ist am Host sichtbar
- Anleitung für Proxmox Web-UI und CLI hinzugefügt
- Skript proxmox-add-drive.sh für automatische Konfiguration
2026-07-23 12:56:03 +02:00
Hitonabi e9652a428c feat(ui): implement Discovery, Logs, and Live Log
Ampel / ampel (push) Successful in 29s
- DeviceDiscovery: auto device detection with type and status
- LogsPage: comprehensive logs view with filters and stats
- RipTargetModal: target directory selection wizard
- ConfirmDialog: generic confirmation dialog component
- LiveLogSection: real-time job progress and logs
- Update App.tsx to include new pages
2026-07-23 12:38:16 +02:00
Hitonabi 3e88c328db fix(worker): remove pyudev (needs libudev-dev, not in slim image)
Ampel / ampel (push) Successful in 30s
2026-07-23 12:27:21 +02:00
Hitonabi a456e8587c fix(worker): remove invalid udev package, use syslinux-utils for isoinfo
Ampel / ampel (push) Failing after 28s
2026-07-23 12:24:31 +02:00
Hitonabi 524d2e570e fix(docker-compose): simplify device mounts, remove redundant volumes
Ampel / ampel (push) Failing after 29s
- Remove cdrom/dvd anonymous volumes (not needed with direct mounts)
- Remove redundant devices/cap_add (mounts are sufficient)
2026-07-23 12:20:56 +02:00
Hitonabi 61af353559 fix(worker): mount host devices for disc detection
Ampel / ampel (push) Failing after 30s
- Add direct device mounts (cdrom, dvd, sr0) to worker
- Add SYS_ADMIN capability for udev access
- Install isoinfo and udev in worker container
- Add pyudev for device monitoring
- Update udev rules with correct paths
2026-07-23 12:15:55 +02:00
Hitonabi 9c010d2dc5 Notfall-Deploy: eigener Klon (~/notfall-rippy, stable) statt Arcane-Verzeichnis
Ampel / ampel (push) Successful in 33s
22.07. gelernt: git-Klon im Arcane-Projektverzeichnis kollidiert mit
dessen Promote (read-only .git-Objekte). Arcane gehoert ~/projects/rippy
jetzt allein; .env wird nur gelesen.
2026-07-22 22:54:59 +02:00
Hitonabi 0b93276302 Gruen-Gate: Ampel gruen auf main -> automatische Befoerderung auf stable
Ampel / ampel (push) Successful in 31s
Arcane-GitSync deployt kuenftig von stable (rot deployt NIE).
deploy.sh wird zum Notfall-Hebel. MakeMKV-Entscheid: Konzept gilt,
lossless als Etappe 10 in der ROADMAP verankert.
2026-07-22 22:45:46 +02:00
Hitonabi 419ba42c38 CI: Beweis-Lauf nach Runner-Upgrade auf 0.6.1 (Status-Bug-Fix)
Ampel / ampel (push) Successful in 28s
2026-07-22 22:26:51 +02:00
Hitonabi ad48276fdd Fix: Fortschritts-Regex toleriert Leerzeichen vor % (Testfund)
Ampel / ampel (push) Failing after 14m47s
Echtes HandBrake schreibt "45.50 %" mit Leerzeichen - die alte Regex
hat aus echter Ausgabe NIE einen Fortschritt geparst. Der neue Test
mit realistischer Zeile hat es sofort gefangen.
2026-07-22 19:39:35 +02:00
Hitonabi 0ea5f10b31 Fix-Runde nach Review: alle Befunde behoben + echte Tests
Ampel / ampel (push) Failing after 12m31s
- Metadaten-Preview WIEDERHERGESTELLT (Stub ueberschattete echte
  prescan-Implementierung), tote Altmodule geloescht
- Celery update_state statt Phantom-Task/erfundener API
- abcde-Kommando korrigiert (CD-Ripping war nie funktionsfaehig)
- JWT: fester Schluessel Pflicht, echtes Logout, Cleanup nur Abgelaufene
- main.py: crashende Endpoints (Path/secrets/api_keys), year-Bug,
  Admin-Login aus .env
- Ruff gruen (29 Funde), Tests: auth/cache_keys/ripping_helpers,
  Placebo-test_health raus
- SAVEPOINT: offene MakeMKV-Entscheidung SICHTBAR gemacht (Regel B)
2026-07-22 19:31:48 +02:00
Hitonabi 728f650bf8 Ampel v3: bash -e des Runners abschalten - vollstaendiges Urteil statt Abbruch
Ampel / ampel (push) Failing after 15m5s
Lauf 5 urteilte korrekt ROT (Ruff-Funde + giftiger Placebo-Test),
aber -e schnitt Node-Teil und Klartext-Fazit ab.
2026-07-22 19:19:15 +02:00
Hitonabi 13c0c4b066 Ampel v2: universelle Vorlage (Fix: checkout braucht Node im Container)
Ampel / ampel (push) Failing after 12m54s
+ package-lock.json (fehlte komplett - Builds waren nie reproduzierbar)
2026-07-22 19:11:27 +02:00
Hitonabi 57bda55af4 Harte Regeln (Ampel-Pflicht, Spec-Stopp, deploy.sh-only, keine
CI / ui (push) Failing after 13m34s
CI / api-und-worker (push) Failing after 14m28s
erfundenen APIs) + idempotentes deploy.sh

Lehren aus dem Review 22.07.: stille MakeMKV->HandBrake-Abweichung,
Doppel-Anlage auf der VM, halluzinierte Celery/abcde-Schnittstellen.
2026-07-22 18:59:53 +02:00
Hitonabi be7f615a4b CI-Ampel: Gitea Actions Workflow (Linter, Deps, Imports, Pytest, UI-Build)
CI / ui (push) Failing after 11m51s
CI / api-und-worker (push) Failing after 12m54s
Rot ist ein Ergebnis: ohne echte Tests bleibt die Ampel rot.
Teil der Wasserdicht-Runde 22.07.
2026-07-22 18:56:28 +02:00
Hitonabi 12c67aee27 fix: use dark class instead of data-theme for Tailwind 2026-07-22 17:12:32 +02:00
Hitonabi 85e072a7dd fix: use Tailwind dark: prefix instead of conditional classes 2026-07-22 17:11:02 +02:00
Hitonabi 886cf4398e fix: Dashboard.tsx useEffect syntax error 2026-07-22 17:04:18 +02:00
Hitonabi 24326e49b7 docs: update SAVEPOINT.md with v1.10 and complete dark mode 2026-07-22 17:02:08 +02:00