update
This commit is contained in:
64
CLAUDE.md
64
CLAUDE.md
@@ -14,19 +14,31 @@ Selbst-gehostete Anwendung: YouTube-Videos per Browser Extension erfassen, auf e
|
||||
|
||||
Drei Komponenten:
|
||||
|
||||
### Browser Extension (JavaScript, Manifest V3)
|
||||
- Content Script liest YouTube-DOM aus, extrahiert Videodaten
|
||||
- Background Script sendet Daten an Server (POST /videos)
|
||||
### Browser Extension (`browser_extension/`)
|
||||
- **Manifest V2**, Firefox-kompatibel (`browser.*` API)
|
||||
- `content.js` — extrahiert Videodaten direkt aus dem YouTube-DOM:
|
||||
- `yt-lockup-view-model` (Homepage, Abos, Kanalseiten)
|
||||
- `ytd-video-renderer` (Suchergebnisse)
|
||||
- Debounced MutationObserver (250ms) fuer dynamisch geladene Cards
|
||||
- `yt-navigate-finish` Event-Listener fuer SPA-Navigation
|
||||
- Deduplizierung ueber `sentUrls` Set
|
||||
- `background.js` — empfaengt Nachrichten vom Content Script, sendet POST an Server
|
||||
- Laden via `about:debugging#/runtime/this-firefox` → "Temporaeres Add-on laden" → `manifest.json`
|
||||
|
||||
### Server (Python, FastAPI, SQLite, yt-dlp + ffmpeg)
|
||||
- REST API empfängt Videodaten, liefert Videolisten, triggert Downloads, streamt Videos
|
||||
- yt-dlp lädt Videos von YouTube, speichert auf dem Server
|
||||
- Beim Streamen wird das Video automatisch heruntergeladen, falls noch nicht geschehen
|
||||
### Server (`backend/`)
|
||||
- **Python, FastAPI, SQLAlchemy, SQLite** (`videos/youtubeapp.db`)
|
||||
- **yt-dlp + ffmpeg** fuer Video-Download
|
||||
- Dockerisiert: `docker compose up --build -d` im `backend/` Verzeichnis
|
||||
- Laeuft auf `http://localhost:8000`
|
||||
- Download-Service speichert Videos unter `/videos/{id}.mp4`
|
||||
- Beim Streamen wird automatisch heruntergeladen falls noetig
|
||||
|
||||
### App (Kotlin, Android/Android TV)
|
||||
- Screens: AllVideos, Downloaded, VideoDetail, VideoPlayer
|
||||
- Videos werden vom Server gestreamt, optional auf das Gerät heruntergeladen
|
||||
- Lokale Videos werden bevorzugt abgespielt, sonst Stream
|
||||
### App (`app/`)
|
||||
- **Kotlin, Jetpack Compose**, Android/Android TV
|
||||
- Gradle-Projekt, Modul `frontend`
|
||||
- Aktueller Stand: Skeleton (nur `MainActivity` mit Platzhalter-Text)
|
||||
- Geplante Screens: AllVideos, Downloaded, VideoDetail, VideoPlayer
|
||||
- Emulator: Android Studio → Device Manager → Pixel 6a, API 35
|
||||
|
||||
## API Endpoints
|
||||
|
||||
@@ -37,10 +49,36 @@ Drei Komponenten:
|
||||
- `GET /videos/{id}/stream` — Video streamen
|
||||
- `GET /videos/{id}/file` — Video-Datei zum Download auf Client ausliefern
|
||||
|
||||
## Projektstruktur
|
||||
|
||||
```
|
||||
backend/
|
||||
main.py — FastAPI App, CORS, Startup
|
||||
database.py — SQLAlchemy Engine, Session, Base
|
||||
models.py — Video Model (id, title, youtuber, thumbnail_url, youtube_url, file_path, created_at)
|
||||
schemas.py — Pydantic Schemas (VideoCreate, VideoResponse)
|
||||
routes/videos.py — Alle API-Routen
|
||||
services/
|
||||
video_service.py — CRUD-Operationen
|
||||
download_service.py — yt-dlp Download-Logik
|
||||
Dockerfile — Python 3.12 + ffmpeg
|
||||
docker-compose.yml — Service-Definition, Port 8000, Volume /videos
|
||||
|
||||
browser_extension/
|
||||
manifest.json — Manifest V2, Permissions fuer youtube.com + localhost
|
||||
content.js — DOM-basierte Video-Extraktion + MutationObserver
|
||||
background.js — POST an Server
|
||||
|
||||
app/
|
||||
frontend/src/main/java/com/youtubeapp/
|
||||
MainActivity.kt — Einstiegspunkt (noch Skeleton)
|
||||
```
|
||||
|
||||
## Entscheidungen
|
||||
|
||||
- Kein Jellyfin — erfüllt nicht die Anforderung, Videos vor dem Download aufzulisten
|
||||
- Kein PostgreSQL/MySQL — SQLite reicht für den Prototyp
|
||||
- Kein Jellyfin — erfuellt nicht die Anforderung, Videos vor dem Download aufzulisten
|
||||
- Kein PostgreSQL/MySQL — SQLite reicht fuer den Prototyp
|
||||
- Keine Benutzerprofile im Prototyp
|
||||
- Videos werden auf dem Server gespeichert, Client speichert nur bei explizitem Download
|
||||
- DOM-Extraktion statt ytInitialData-Parsing — funktioniert auch bei SPA-Navigation und Scrollen
|
||||
- Sprache der Dokumentation: Deutsch
|
||||
|
||||
Reference in New Issue
Block a user