Files
rippy/docker/ui/src/pages/Anleitung.tsx
T
Hitonabi 71c618073e
Ampel / ampel (push) Successful in 36s
docs: Anleitung auf .exe-Installer, SAVEPOINT v3.9
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 19:20:28 +02:00

179 lines
9.3 KiB
TypeScript

import { ReactNode } from 'react'
import { Disc, Tv, HardDrive, Bell, Wrench, Cpu, Download, HelpCircle } from 'lucide-react'
import { PageHeader } from '../components/ui/PageHeader'
import { Card, CardHeader, CardTitle, CardContent } from '../components/ui/Card'
function Abschnitt({ icon: Icon, titel, children }: { icon: any, titel: string, children: ReactNode }) {
return (
<Card>
<CardHeader>
<CardTitle className="flex items-center gap-2.5">
<Icon size={20} className="text-amber-500" />
<span>{titel}</span>
</CardTitle>
</CardHeader>
<CardContent className="space-y-3 text-sm leading-relaxed text-slate-600 dark:text-slate-300">
{children}
</CardContent>
</Card>
)
}
export default function AnleitungPage() {
const fett = "font-semibold text-slate-100"
return (
<div className="space-y-6 max-w-6xl mx-auto">
<PageHeader
title="Anleitung & Hilfe"
subtitle="So funktioniert Rippy — vom Einlegen der Disc bis zum fertigen Film in deinem Media-Server"
/>
<Abschnitt icon={Disc} titel="Der normale Weg: Disc rein, fertig">
<p>
<span className={fett}>1. Disc einlegen.</span> Rippy erkennt sie automatisch (Titel, Poster,
Beschreibung) und zeigt sie oben im Dashboard. Stimmt der Titel nicht Nicht korrekt?"
klicken und den richtigen wählen — Rippy merkt sich das für diese Disc.
</p>
<p>
<span className={fett}>2. „Rippen starten"</span> und das Ziel wählen: 🎥 Filme, 📺 Serien,
🎵 Musik oder ein eigener Ordner (auch NAS-Freigaben). Optional: Nur Hauptfilm" (längster
Titel) oder per <span className={fett}>„Disc scannen"</span> einzelne Titel an-/abwählen.
</p>
<p>
<span className={fett}>3. Warten.</span> Rippy sichert verlustfrei (MakeMKV) und komprimiert
danach auf Arbeitsgröße (HandBrake) alle Tonspuren und Untertitel bleiben erhalten.
Fertige Jobs haben einen Download-Knopf; Klick auf den Titel zeigt alle Details.
</p>
<p>
<span className={fett}>Vollautomatik:</span> Unter Einstellungen Ripping einschaltbar
dann startet der Rip ohne Nachfrage, sobald eine Disc erkannt wurde. Bereits gerippte
Discs (Fingerabdruck) werden übersprungen.
</p>
</Abschnitt>
<Abschnitt icon={Tv} titel="Serien rippen">
<p>
Im Rippen starten"-Dialog <span className={fett}>„Serien"</span> wählen, Serienname und
Staffel angeben. Die Ablage wird automatisch <code>Serie/Season 02/</code>, und nach dem
Rip ordnet Rippy die Episoden über einen Laufzeit-Abgleich mit TMDB zu und benennt sie
(Serie S02E03.mkv"). Das passiert nur bei <span className={fett}>eindeutiger</span> Zuordnung —
im Zweifel bleiben die Original-Namen und das Log sagt warum.
</p>
<p>
Eine komplette Staffel auf einer Disc klappt auch, wenn alle Episoden gleich lang sind
(Anime-Boxen). Bei Teil-Discs mit lauter gleich langen Episoden ist eine automatische
Zuordnung prinzipiell nicht möglich — dann von Hand umbenennen.
</p>
</Abschnitt>
<Abschnitt icon={HardDrive} titel="NAS &amp; Speicherziele">
<p>
Einstellungen → Speicherziele: Rechner/NAS eintragen, <span className={fett}>Benutzer +
Passwort</span> angeben (Windows und die meisten NAS lehnen Gast-Zugriffe ab!), „Freigaben
auflisten", Freigabe wählen, Einhängen &amp; speichern". Danach taucht das Ziel im
„Rippen starten"-Dialog auf und wird beim Start automatisch wieder verbunden.
</p>
<p>
<span className={fett}>4K-UHD-Tipp:</span> Rohdaten sind bis 100 GB groß. Wenn die
Rippy-Platte knapp ist (Dashboard zeigt den freien Platz), das Arbeitsverzeichnis unter
Einstellungen Verarbeitung auf eine große Freigabe legen. Rippy prüft den Platz vor
jedem Rip und bricht sonst mit Klartext ab.
</p>
</Abschnitt>
<Abschnitt icon={Tv} titel="Jellyfin, Emby, Kodi, Plex">
<p>
Einstellungen Ripping Media-Server: Rippy benennt fertige Rips als Titel (Jahr)" und
legt für Jellyfin/Emby/Kodi zusätzlich <code>movie.nfo</code> + <code>poster.jpg</code> dazu —
dein Server erkennt alles ohne Nacharbeit (Plex nutzt nur die Benennung).
</p>
<p>
<span className={fett}>Null-Klick-Kette:</span> Bei Jellyfin/Emby zusätzlich Server-URL und
API-Key eintragen (Administration → API-Schlüssel) — dann stößt Rippy nach jedem fertigen
Rip sofort einen Bibliotheks-Scan an. Disc rein → Film erscheint im Server.
</p>
</Abschnitt>
<Abschnitt icon={Bell} titel="Benachrichtigungen">
<p>
Einstellungen → Benachrichtigungen: eine Webhook-URL eintragen (Discord-Webhook, ntfy-Thema
für Handy-Push, Slack oder eigenes JSON), „Test senden", speichern. Rippy meldet sich, wenn
ein Job fertig ist, fehlschlägt oder abgebrochen wird. Die Schritt-für-Schritt-Anleitung je
Dienst steht direkt auf der Einstellungs-Seite.
</p>
</Abschnitt>
<Abschnitt icon={Cpu} titel="Weitere Maschinen als Encoding-Worker">
<p>
Die Kompression kann jede Maschine im Netz übernehmen Einstellungen Worker.
Für <span className={fett}>Windows</span> gibt es einen <span className={fett}>Installer
(.exe)</span>: herunterladen, doppelklicken, im Fenster Adresse + Name eintragen,
Installieren" — kein Konsolenfenster, kein CLI (nur Python 3.10+ muss auf dem PC sein).
Für <span className={fett}>Linux</span> gibt es einen Docker-Befehl. Die Maschine taucht
danach unter ihrem Namen in der Worker-Liste auf und zieht sich Kompressions-Jobs
automatisch. Gerippt wird immer auf der Rippy-Hauptmaschine.
</p>
<p>
Der Windows-Worker läuft mit <span className={fett}>Tray-Symbol</span> neben der Uhr
(Status, Start/Stopp, „Rippy öffnen", Log) gestartet über <code>start-tray.bat</code>.
Deinstallieren: <code>uninstall.ps1</code> im Worker-Ordner stoppt alles, entfernt den
Autostart, meldet den Worker in Rippy ab und löscht den Ordner rückstandsfrei.
</p>
<p>
<span className={fett}>Wichtig:</span> Worker verbinden sich direkt im Heimnetz in den
Befehlen immer die <span className={fett}>LAN-Adresse</span> der Rippy-Maschine verwenden,
nie eine externe Domain (die läuft über den Reverse-Proxy und blockt).
</p>
</Abschnitt>
<Abschnitt icon={Wrench} titel="MakeMKV-Beta-Key &amp; System">
<p>
Blu-ray-Ripping braucht den MakeMKV-Beta-Key, der etwa <span className={fett}>monatlich
wechselt</span> (MakeMKV-Forum, Thread MakeMKV is free while in beta"). Neuen Key unter
Einstellungen → System eintragen — gilt ab dem nächsten Rip, ohne Neustart. DVDs gehen
immer auch ohne Key. Dort stehen auch die Werkzeug-Versionen und der freie Speicherplatz.
</p>
<p>
<span className={fett}>Updates:</span> „Auf Updates prüfen" (ebenfalls Einstellungen
System) vergleicht die installierten Versionen mit makemkv.com und den offiziellen
HandBrake-Releases. Gibt es ein MakeMKV-Update, zeigt Rippy den fertigen
Update-Befehl an wichtig, weil neue Versionen auch die neueste
Disc-Schlüssel-Datenbank mitbringen.
</p>
</Abschnitt>
<Abschnitt icon={Download} titel="Fertige Dateien herunterladen">
<p>
Bei fertigen Jobs: Download" in der Aktion-Spalte (oder Klick auf den Titel) → Dateiliste
mit „Alle herunterladen". Die Job-Liste lässt sich per Papierkorb bzw. Erledigte aufräumen"
leeren — <span className={fett}>die gerippten Dateien bleiben dabei immer liegen</span>.
„CSV" exportiert die komplette Historie für Excel.
</p>
</Abschnitt>
<Abschnitt icon={HelpCircle} titel="Häufige Fragen">
<p>
<span className={fett}>Diese Disc wurde bereits gerippt"?</span> Rippy erkennt Discs am
Fingerabdruck. Nochmal rippen geht trotzdem — der Hinweis verhindert nur Versehen.
</p>
<p>
<span className={fett}>4K-UHD schlägt fehl mit „volume key is unknown"?</span> Das Laufwerk
liest die Disc (LibreDrive), aber MakeMKV kennt den Schlüssel dieser (zu neuen) Pressung
noch nicht. Den automatisch gespeicherten AACS-Dump im MakeMKV-Forum einreichen mit einem
der nächsten Updates ist die Disc rippbar.
</p>
<p>
<span className={fett}>Neu komprimieren" fehlt bei einem Fehl-Job?</span> Der Knopf
erscheint nur, wenn die Rohdaten noch daliegen bei einem Job, der nie gerippt hat, gäbe
es nichts zu komprimieren.
</p>
<p>
<span className={fett}>Kein Laufwerk sichtbar?</span> In einer VM muss das Laufwerk per
USB-Passthrough durchgereicht sein (nicht als emuliertes CD-ROM) Details in der README.
</p>
</Abschnitt>
</div>
)
}