feat: add Goldfish Recap YouTube summary PWA
YouTube subtitles via OpenRouter become persistent, shareable recaps with timestamp jump links, PIN-protected creation, and Traefik deploy. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
# 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 |
|
||||
|
||||
## Stack
|
||||
|
||||
- FastAPI + SQLite
|
||||
- youtube-transcript-api (+ yt-dlp Fallback)
|
||||
- OpenRouter (Default: `google/gemini-2.5-flash`)
|
||||
- Vanilla JS PWA
|
||||
Reference in New Issue
Block a user