# FuerDieCuts Schneidet aus einem WhatsApp-Chatexport automatisch ein YouTube-Video. Der Export (ZIP mit Medien) wird hochgeladen, die Videos werden anhand der Zeitstempel im Chat chronologisch sortiert. Über eine Maske wählt man, was automatisch passieren soll: - Intro und Outro einfügen (eigene Dateien) - Clips chronologisch aneinanderreihen - Clips über 10 Sekunden auf genau 10 Sekunden beschleunigen - Ton der Clips stummschalten (Intro und Outro ausgenommen) - Backing Track unter den Clip-Teil legen (wird wiederholt und passend gekürzt) - Voice-over pro Clip aufnehmen oder hochladen - Lautstärke jeder Tonspur von 0 bis 100 Ausgabe ist ein MP4 in 1920×1080 mit 30 fps. Hochkant-Clips werden mittig mit unscharfem Hintergrund eingesetzt. Zugang ist über eine PIN geschützt. ## Voraussetzungen - Node.js 20 - ffmpeg und ffprobe im `PATH` (`sudo apt install ffmpeg`) ## Installation und Start ```bash npm install cp .env.example .env # APP_PIN eintragen npm run dev ``` `npm run dev` startet den Express-Server samt Vite im Entwicklungsmodus auf einem Port (`PORT`, Vorgabe 3000) und liest dabei die lokale `.env`. In Produktion: ```bash npm run build NODE_ENV=production APP_PIN=… npm start ``` ## Umgebungsvariablen | Name | Bedeutung | |---|---| | `APP_PIN` | PIN für die Anmeldung, Pflicht | | `SESSION_SECRET` | optional; signiert die Sitzungs-Cookies, sonst wird eines erzeugt | | `PORT` | Port des Servers, Vorgabe 3000 | | `VCH_DATA_DIR` | Ablage für Projekte und Uploads, Vorgabe `./data` | ## Ablauf 1. WhatsApp-Chat mit „Medien anhängen“ exportieren und entpacken. 2. In der App „Neues Video“, den Exportordner wählen. Der Browser liest den Chat selbst; vorgewählt ist Montag bis Freitag der Vorwoche. 3. Videos prüfen (Duplikate sind abgewählt) und hochladen. Nur die gewählten Videos werden übertragen, in Stücken von 8 MB; ein Abbruch lässt sich durch erneutes Wählen des Ordners fortsetzen. 4. Im Projekt anhaken, was passieren soll, Intro, Outro und Backing Track hochladen, Lautstärken einstellen und pro Clip ein Voice-over aufnehmen (der Clip läuft dabei im späteren Tempo) oder als Datei hochladen. 5. „Video erstellen“ rendert im Hintergrund; danach herunterladen. ## Wie geschnitten wird - Jeder Clip wird einzeln auf 1920×1080 bei 30 fps gebracht. Hochkant-Clips stehen mittig vor einer unscharfen, vergrößerten Kopie ihrer selbst. - Clips über 10 Sekunden werden per `setpts` auf genau 10 Sekunden beschleunigt; ihr Ton (falls nicht stumm) per verketteter `atempo`-Stufen. - Voice-over und Clip-Ton werden pro Clip gemischt und auf Clip-Länge gekürzt. - Die Clip-Segmente werden aneinandergehängt, der Backing Track darunter wiederholt, gekürzt und über 2 Sekunden ausgeblendet; danach kommen Intro und Outro dazu. - Segmente liegen zwischengespeichert unter `render/cache`; wer nur die Musik ändert, wartet nicht auf alle Clips. Zwischenstände tragen unkomprimierten Ton, erst das Endergebnis wird AAC, damit sich über viele Übergänge keine Verschiebung aufsummiert. - Exporte laufen nacheinander, weil ffmpeg alle Kerne nutzt. ## Befehle - `npm test` – Tests (Node-Testrunner) - `npm run lint` – ESLint - `npm run build` – Frontend bauen ## Aufbau - `server/` – Express-Server: Anmeldung, Projekte, Upload in Stücken, ffprobe - `server/render.js` – Schnittplan und ffmpeg-Kette - `server/renderQueue.js` – Exporte im Hintergrund - `src/` – React-Oberfläche (Vite) - `src/lib/whatsapp.js` – liest den Chatexport und ordnet die Videos - `src/lib/upload.js` – Upload in Stücken mit Wiederaufnahme - `test/` – Tests - `Dockerfile` – Produktionsimage mit ffmpeg; Deploy über VCH (`.vch/deploy.yaml`) Aufgebaut auf Node.js, Express, React, Vite und ffmpeg.