Dokumentation: README, KONZEPT, ROADMAP, SAVEPOINT
This commit is contained in:
+2
-3
@@ -65,7 +65,7 @@ Ein modular aufgebautes System, das bei Disc-Einwurf automatisch den Typ erkennt
|
|||||||
- Title, Laufzeit, Scene-Labels werden ausgelesen.
|
- Title, Laufzeit, Scene-Labels werden ausgelesen.
|
||||||
- Video-Titel wird gegen TMDB API gegengeprüft → Matching-Ergebnis mit Confidence-Score.
|
- Video-Titel wird gegen TMDB API gegengeprüft → Matching-Ergebnis mit Confidence-Score.
|
||||||
- Audio-Titel wird gegen MusicBrainz gegengeprüft (bei CD).
|
- Audio-Titel wird gegen MusicBrainz gegengeprüft (bei CD).
|
||||||
- **Rippy zeigt eine Preview im WebUI**: Titel, Jahr, Cover, Scene-Trackliste.
|
- **Rippy zeigt eine Preview im WebUI**: Titel, Jahr, Cover, Trackliste.
|
||||||
- Der Commander kann bestätigen oder manuell korrigieren (z.B. falsches TMDB-Match).
|
- Der Commander kann bestätigen oder manuell korrigieren (z.B. falsches TMDB-Match).
|
||||||
- Bestätigte Metadaten werden im SQLite-Cache persistiert.
|
- Bestätigte Metadaten werden im SQLite-Cache persistiert.
|
||||||
6. **Ripping** (nach Bestätigung):
|
6. **Ripping** (nach Bestätigung):
|
||||||
@@ -185,8 +185,7 @@ Ein modular aufgebautes System, das bei Disc-Einwurf automatisch den Typ erkennt
|
|||||||
|
|
||||||
Änderungen:
|
Änderungen:
|
||||||
- **Metadaten-Lookup VOR dem Ripping** eingefügt (Sek. 5, Schritt 5)
|
- **Metadaten-Lookup VOR dem Ripping** eingefügt (Sek. 5, Schritt 5)
|
||||||
- **100% Jellyfin-Kompatibilität** hinzugefügt: NFO-Generator, Ordnerstruktur, Poster/Backdrop/
|
- **100% Jellyfin-Kompatibilität** hinzugefügt: NFO-Generator, Ordnerstruktur, Poster/Backdrop/Fanart-Download, Jellyfin-kompatible Dateibenennung (Sek. 4, Sek. 5, Sek. 6)
|
||||||
Fanart-Download, Jellyfin-kompatible Dateibenennung (Sek. 4, Sek. 5, Sek. 6)
|
|
||||||
- **Metadaten-Preview im UI** als neuer UX-Schritt (Sek. 7, Schritt 3)
|
- **Metadaten-Preview im UI** als neuer UX-Schritt (Sek. 7, Schritt 3)
|
||||||
- **Neue Risiken**: TMDB-Matching-Fehler (offen, mit Fallback), NFO-Format-Abhängigkeit (Hinweis), Pre-Scan-Latenz (Hinweis), TMDB-Bildrechte (gelöst)
|
- **Neue Risiken**: TMDB-Matching-Fehler (offen, mit Fallback), NFO-Format-Abhängigkeit (Hinweis), Pre-Scan-Latenz (Hinweis), TMDB-Bildrechte (gelöst)
|
||||||
|
|
||||||
|
|||||||
@@ -1,66 +1,117 @@
|
|||||||
# Rippy
|
# Rippy — Automatisches CD/DVD/Blu-ray Ripping-System
|
||||||
|
|
||||||
Ein modernes, eigenständiges System zum automatischen Rippen von CD, DVD und Blu-ray.
|
> **Moderner Ripping-Daemon mit Metadaten-Preview, Jellyfin-Formatierung und Echtzeit-Status.**
|
||||||
Es erkennt Disc-Einwürfe automatisch, sucht Metadaten vor, rippt verlustfrei und legt
|
|
||||||
alles in Jellyfin-konformer Struktur ab — mit Echtzeit-UI statt veralteter Flask-Oberfläche.
|
|
||||||
|
|
||||||
## Was du brauchst
|
---
|
||||||
|
|
||||||
- Ein System mit einem optischen Laufwerk (DVD/Blu-ray)
|
## Features
|
||||||
- Docker + Docker Compose
|
|
||||||
- 1–2 Stunden Zeit für den ersten Bau
|
|
||||||
|
|
||||||
## So legst du los
|
| Feature | Status |
|
||||||
|
|---------|--------|
|
||||||
|
| Disc-Erkennung (CD/DVD/Blu-ray) | ✅ |
|
||||||
|
| Metadaten-Lookup (TMDB/MusicBrainz/TheTVDB) | ✅ |
|
||||||
|
| Pre-Scan ohne Ripping | ✅ |
|
||||||
|
| Jellyfin-Formatierung (NFO + Images) | ✅ |
|
||||||
|
| JWT-Auth + Rate-Limiting | ✅ |
|
||||||
|
| React-UI mit Echtzeit-Updates | ✅ |
|
||||||
|
| SQLite-Cache für API-Rate-Limits | ✅ |
|
||||||
|
| Multi-Disc-Set-Handling | ✅ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Architektur
|
||||||
|
|
||||||
1. Clone das Repo:
|
|
||||||
```
|
```
|
||||||
|
┌─────────────────────────────────────────────┐
|
||||||
|
│ Proxmox LXC (Debian 12) │
|
||||||
|
│ │
|
||||||
|
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
||||||
|
│ │ API │ │ Worker │ │ UI │ │
|
||||||
|
│ │ FastAPI │◄─►│ Celery+ │ │ React+ │ │
|
||||||
|
│ │ │ │ Redis │ │ Nginx │ │
|
||||||
|
│ └──────────┘ └──────────┘ └──────────┘ │
|
||||||
|
│ │ │ │ │
|
||||||
|
│ ▼ ▼ ▼ │
|
||||||
|
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
||||||
|
│ │ PostgreSQL│ │ udev │ │ Media │ │
|
||||||
|
│ │ │ │ Daemon │ │ Store │ │
|
||||||
|
│ └──────────┘ └──────────┘ └──────────┘ │
|
||||||
|
└─────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
### Docker Compose
|
||||||
|
|
||||||
|
```bash
|
||||||
git clone https://git.tobisniceshomelab.ddnsfree.com/Hitonabi/rippy.git
|
git clone https://git.tobisniceshomelab.ddnsfree.com/Hitonabi/rippy.git
|
||||||
cd rippy
|
cd rippy
|
||||||
```
|
|
||||||
2. Lies **KONZEPT.md** — das sagt, was das Projekt ist.
|
|
||||||
3. Lies **ROADMAP.md** — das sagt, in welcher Reihenfolge es gebaut wird.
|
|
||||||
4. Fang mit Etappe 1 an (Fundament + udev-Erkennung).
|
|
||||||
|
|
||||||
## Entwicklungsumgebung (Docker)
|
|
||||||
|
|
||||||
### Starten
|
|
||||||
```
|
|
||||||
docker compose up -d
|
docker compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
### Stoppen
|
### Port-Übersicht
|
||||||
```
|
|
||||||
docker compose down
|
|
||||||
```
|
|
||||||
|
|
||||||
### Logs ansehen
|
| Service | Port | URL |
|
||||||
```
|
|---------|------|-----|
|
||||||
docker compose logs -f
|
| UI | 80 | http://localhost:80 |
|
||||||
```
|
| API | 8000 | http://localhost:8000 |
|
||||||
|
| PostgreSQL | 5432 | localhost:5432 |
|
||||||
|
| Redis | 6379 | localhost:6379 |
|
||||||
|
|
||||||
### Container neu bauen
|
---
|
||||||
```
|
|
||||||
docker compose build
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
## Etappe 1: Fundament
|
## API
|
||||||
|
|
||||||
Aktueller Stand:
|
### Endpoints
|
||||||
- ✅ Docker Compose mit 5 Containern (api, worker, ui, postgres, redis)
|
|
||||||
- ✅ Basis-Dockerfiles für jeden Service
|
|
||||||
- ✅ udev-Regel + Daemon für Disc-Einwurf-Erkennung
|
|
||||||
- ✅ Device-Resolver (UUID/Serial)
|
|
||||||
- ✅ Celery-Job-Erstellung
|
|
||||||
|
|
||||||
### udev-Integration
|
| Endpoint | Method | Description |
|
||||||
|
|----------|--------|-------------|
|
||||||
|
| `/health` | GET | Health check |
|
||||||
|
| `/jobs` | GET | Alle Jobs |
|
||||||
|
| `/devices` | GET | Alle Geräte |
|
||||||
|
| `/prescan` | POST | Pre-Scan durchführen |
|
||||||
|
| `/metadata/lookup` | POST | Metadaten lookup |
|
||||||
|
| `/metadata/confirm` | POST | Metadaten bestätigen |
|
||||||
|
| `/jellyfin/format` | POST | Für Jellyfin formatieren |
|
||||||
|
| `/token` | POST | Login (JWT) |
|
||||||
|
| `/token/refresh` | POST | Refresh Token |
|
||||||
|
| `/api-keys` | POST/GET/DELETE | API-Key Management |
|
||||||
|
|
||||||
1. Kopiere `udev/99-disc-ripper.rules` nach `/etc/udev/rules.d/`
|
---
|
||||||
2. Kopiere `udev/udev_daemon.py` nach `/app/` (im Worker-Container)
|
|
||||||
3. Lade udev-Regeln neu: `sudo udevadm control --reload-rules && sudo udevadm trigger`
|
|
||||||
|
|
||||||
## Weitere Etappen
|
## Tech-Stack
|
||||||
|
|
||||||
Siehe ROADMAP.md für Details zu Etappe 2+.
|
| Layer | Tech |
|
||||||
|
|-------|------|
|
||||||
|
| Backend | Python, FastAPI, Celery |
|
||||||
|
| Database | PostgreSQL, SQLite, Redis |
|
||||||
|
| Frontend | React, Vite, TailwindCSS |
|
||||||
|
| Ripping | MakeMKV, abcde, FFmpeg, HandBrake |
|
||||||
|
| Auth | JWT, OAuth2 |
|
||||||
|
|
||||||
Alles andere steht in den Docs. Viel Spaß beim Bauen.
|
---
|
||||||
|
|
||||||
|
## Roadmap
|
||||||
|
|
||||||
|
- [x] Etappe 1: Container-Infrastruktur
|
||||||
|
- [x] Etappe 2: Ripping-Pipeline
|
||||||
|
- [x] Etappe 3: Metadaten-Lookup + Pre-Scan
|
||||||
|
- [x] Etappe 4: Jellyfin-Formatierung
|
||||||
|
- [x] Etappe 5: API + Auth + WebUI
|
||||||
|
- [ ] Etappe 6: Sicherheit + Compliance
|
||||||
|
- [ ] Etappe 7: Proxmox-Integration
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
GPL-v3
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Credits
|
||||||
|
|
||||||
|
- **Commander**: Projekt-Idee, Anforderungen, Testing
|
||||||
|
- **AI-Box**: Entwicklung, Architektur, Dokumentation
|
||||||
|
|||||||
@@ -61,6 +61,8 @@
|
|||||||
- Commander kann bestätigen oder manuell korrigieren
|
- Commander kann bestätigen oder manuell korrigieren
|
||||||
- Bestätigte Metadaten werden im Cache persistiert
|
- Bestätigte Metadaten werden im Cache persistiert
|
||||||
|
|
||||||
|
**Status:** Abgeschlossen
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Etappe 4: Jellyfin-Formatierung + NFO-Generierung
|
## Etappe 4: Jellyfin-Formatierung + NFO-Generierung
|
||||||
@@ -84,6 +86,8 @@
|
|||||||
- Jellyfin scannt und erkennt alles korrekt
|
- Jellyfin scannt und erkennt alles korrekt
|
||||||
- Multi-Disc-Sets werden als eine Entität angezeigt
|
- Multi-Disc-Sets werden als eine Entität angezeigt
|
||||||
|
|
||||||
|
**Status:** Abgeschlossen
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Etappe 5: API + Auth + WebUI
|
## Etappe 5: API + Auth + WebUI
|
||||||
@@ -109,6 +113,8 @@
|
|||||||
- Echtzeit-Updates via SSE funktionieren
|
- Echtzeit-Updates via SSE funktionieren
|
||||||
- Alle Einstellungen werden gespeichert
|
- Alle Einstellungen werden gespeichert
|
||||||
|
|
||||||
|
**Status:** Abgeschlossen
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Etappe 6: Sicherheit + Compliance + Hardening
|
## Etappe 6: Sicherheit + Compliance + Hardening
|
||||||
|
|||||||
Reference in New Issue
Block a user