# Goldfish Recap YouTube-Untertitel → KI-Recap mit Sprungmarken. Für Second-Screen-Survivors und Goldfisch-Gedächtnisse. **Live:** [ytrecap.schwenk.online](https://ytrecap.schwenk.online) ## Features - YouTube-URL einfügen → strukturiertes Recap mit TL;DR, Vibe-Check und Sprungmarken - Recaps bleiben gespeichert und sind per Link teilbar (`/r/{video_id}`) - Recap erstellen nur mit PIN (JWT in localStorage) - PWA — installierbar auf dem Handy ## Lokale Entwicklung ```bash cp .env.example .env # OPENROUTER_API_KEY und JWT_SECRET setzen python -m venv .venv source .venv/bin/activate pip install -e . python tools/gen_favicon.py uvicorn server.app:app --reload --port 8000 ``` Oder mit Docker: ```bash docker compose -f compose.dev.yml up --build ``` App: http://localhost:8000 ## Deployment (Traefik) 1. `.env` auf dem Server anlegen: ```bash APP_PIN=dein-pin JWT_SECRET=$(openssl rand -hex 32) OPENROUTER_API_KEY=sk-or-... ``` 2. DNS `ytrecap.schwenk.online` → Traefik-Host 3. Start: ```bash docker compose up -d --build ``` Traefik übernimmt TLS via `myresolver`. Persistente Daten liegen in `./data/`. ## API | Endpoint | Auth | Beschreibung | |----------|------|--------------| | `GET /api/health` | — | Healthcheck | | `POST /api/auth/pin` | — | PIN → JWT | | `GET /api/recaps` | — | Liste | | `GET /api/recaps/{video_id}` | — | Einzelnes Recap | | `POST /api/recaps` | JWT | Recap erstellen | | `POST /api/recaps/{video_id}/regenerate` | JWT | Neu generieren | ## YouTube IP-Block / Proxy YouTube blockiert oft Server-IPs (Hetzner, AWS, …). Optional in `.env`: ```bash # Statischer Proxy (z.B. aus Webshare „Proxy Server“ / Dashboard-Zeile) YOUTUBE_PROXY=http://USER:PASS@HOST:PORT ``` Für yt-dlp-Fallback und VTT-Downloads wird dieselbe URL genutzt. **Webshare-Hinweis:** Der kostenlose Tier und „Proxy Server“ (einzelne IP wie im Dashboard) funktionieren *manchmal* für wenige Recaps pro Tag — laut `youtube-transcript-api` aber unzuverlässig. Rotating **Residential** (kostenpflichtig) ist die robuste Lösung: ```bash WEBSHARE_PROXY_USERNAME=... WEBSHARE_PROXY_PASSWORD=... WEBSHARE_PROXY_LOCATIONS=de ``` Öffentliche Gratis-Proxy-Listen: nein (langsam, unsicher, meist schon gebannt). ## Stack - FastAPI + SQLite - youtube-transcript-api (+ yt-dlp Fallback) - OpenRouter (Default: `google/gemini-2.5-flash`) - Vanilla JS PWA