From f250b2baf99aa8442651bd3fffa409b78493ebe4 Mon Sep 17 00:00:00 2001 From: Marek Date: Sun, 5 Apr 2026 10:08:10 +0200 Subject: [PATCH] update --- CLAUDE.md | 64 +++++++++++++++---- .../reports/problems/problems-report.html | 4 +- 2 files changed, 53 insertions(+), 15 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 12a5e90..dfde07a 100644 --- a/CLAUDE.md +++ b/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 diff --git a/app/build/reports/problems/problems-report.html b/app/build/reports/problems/problems-report.html index d2c63dc..5febd65 100644 --- a/app/build/reports/problems/problems-report.html +++ b/app/build/reports/problems/problems-report.html @@ -650,12 +650,12 @@ code + .copy-button {