diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..12a5e90 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,46 @@ +# YouTube App + +Selbst-gehostete Anwendung: YouTube-Videos per Browser Extension erfassen, auf einem Server speichern und per Kotlin-App auf Android/Android TV streamen und herunterladen. + +## Dokumentation + +- `systems.md` — Technologie-Stack pro Komponente +- `commication.md` — Kommunikationsflüsse zwischen den Systemen +- `features.md` — Konkrete Features und Benutzerinteraktionen +- `architecture.md` — Detaillierter Systemaufbau (Endpoints, Services, Models, Screens) +- `szenarios.md` — Benutzer-Szenarien + +## Architektur + +Drei Komponenten: + +### Browser Extension (JavaScript, Manifest V3) +- Content Script liest YouTube-DOM aus, extrahiert Videodaten +- Background Script sendet Daten an Server (POST /videos) + +### 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 + +### 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 + +## API Endpoints + +- `POST /videos` — Videodaten von Extension empfangen +- `GET /videos` — alle Videos abrufen +- `GET /videos/downloaded` — heruntergeladene Videos abrufen +- `POST /videos/{id}/download` — Download auf Server triggern +- `GET /videos/{id}/stream` — Video streamen +- `GET /videos/{id}/file` — Video-Datei zum Download auf Client ausliefern + +## Entscheidungen + +- Kein Jellyfin — erfüllt nicht die Anforderung, Videos vor dem Download aufzulisten +- Kein PostgreSQL/MySQL — SQLite reicht für den Prototyp +- Keine Benutzerprofile im Prototyp +- Videos werden auf dem Server gespeichert, Client speichert nur bei explizitem Download +- Sprache der Dokumentation: Deutsch diff --git a/architecture.md b/architecture.md new file mode 100644 index 0000000..4a3aade --- /dev/null +++ b/architecture.md @@ -0,0 +1,28 @@ +# Browser Extension +- Content Script — YouTube-DOM auslesen, Videodaten extrahieren +- Background Script — Daten an Server senden (POST /videos) +# Server +## API +- POST /videos — Videodaten von Extension empfangen +- GET /videos — alle Videos abrufen +- GET /videos/downloaded — heruntergeladene Videos abrufen +- POST /videos/{id}/download — Download triggern +- GET /videos/{id}/stream — Video streamen +- GET /videos/{id}/file — Video-Datei zum Download ausliefern +## Services +- VideoService — Videos speichern, abrufen, Status verwalten +- DownloadService — yt-dlp aufrufen, Download-Status tracken +## Model +- Video — id, title, youtuber, thumbnail_url, youtube_url, file_path +# App +## Screens +- AllVideosScreen — alle Videos als Cards +- DownloadedVideosScreen — heruntergeladene Videos als Cards +- VideoDetailScreen — Starten, Download, Zurück +- VideoPlayerScreen — Player mit Standard-Controls +## ViewModel +- VideoViewModel — Video-State verwalten, API-Aufrufe triggern, lokal bevorzugen sonst streamen +## API +- ServerApi — kommuniziert mit FastAPI (GET /videos, POST /download, GET /stream, GET /videos/{id}/file) +## Model +- Video — id, title, youtuber, thumbnailUrl, youtubeUrl, isDownloaded, localFilePath \ No newline at end of file diff --git a/commication.md b/commication.md new file mode 100644 index 0000000..d3f652d --- /dev/null +++ b/commication.md @@ -0,0 +1,17 @@ +# Browser Extension intern +- Videodaten erfassen +# Browser Extension -> Server +- Videodaten senden +# Server intern +- Videodaten persistieren +- Video herunterladen +# Server -> App +- Video streamen +- Videodatei senden +# App -> Server +- Videos abrufen +- Video download anfragen +- Video stream anfragen +# App intern +- Video streamen anfragen +- Video downloaden anfragen diff --git a/features.md b/features.md new file mode 100644 index 0000000..85a6a66 --- /dev/null +++ b/features.md @@ -0,0 +1,13 @@ +# Aufgaben +## Browser +- Youtube Videos werden erfasst +- Videodaten (Titel, Youtuber, Bild, Url) werden nach dem erfassen an den Server gesendet +- Extension hat keine Einstellung +## App +- Ansicht: Navigation mit Alle Videos, Heruntergeladen +- Alle Videos: Videos als Cards auflisten (Untereinander: Bild, Youtuber, Titel) +- Heruntergeladen: Heruntergeladene Videos als Cards auflisten (Untereinander: Bild, Youtuber, Titel) +- Klick auf Card zeigt die Videoübersicht (Starten, Download, Zurück) +- Klick auf Startet startet dem Stream mit den Standard Video-Controls +- Klick auf Download lädt das Video herunter und übertragt es auf den Client +- Beim streamen wird das Video heruntergeladen, wenn noch nicht geschehen \ No newline at end of file diff --git a/plan.md b/plan.md deleted file mode 100644 index ed88ed1..0000000 --- a/plan.md +++ /dev/null @@ -1,19 +0,0 @@ -Browser Extension: - -Profilauswahl pro User -Erkennt YouTube-Suchergebnisse im DOM -Extrahiert Video-ID, Titel, Thumbnail -Sendet Daten mit Profil-Zuordnung an lokalen Server - -Server (Ubuntu Desktop lokal): - -Empfängt Video-Daten, ordnet sie dem Profil zu -Download via yt-dlp + sofortiges Streaming -Jellyfin als Media Server mit Benutzerprofilen - -Clients: - -Smart TV / Fire Stick via Jellyfin App (jeder loggt sich in sein Profil ein) -Android App optional als mobiler Player - -Prototyp: Hetzner CAX11, später lokal. diff --git a/systems.md b/systems.md new file mode 100644 index 0000000..80b1ebd --- /dev/null +++ b/systems.md @@ -0,0 +1,9 @@ +# Browser Extension +- Javascript: Daten angezeigter Videos an Server senden +# Server +- FastAPI: Videodaten empfangen +- python: Downlods triggern, Videos streamen +- yt-dlp + ffmpeg: Video herunterladen +- SQLite: Daten persistieren +# App +- Kotlin: Videos auflisten, Download triggern, Videos abspielen diff --git a/szenarios.md b/szenarios.md new file mode 100644 index 0000000..2ce8f9c --- /dev/null +++ b/szenarios.md @@ -0,0 +1,8 @@ +# Szenario 1 +- Benutzer geht auf die Youtube Startseite -> Alle auf der Seite sichtbaren Youtube Videos werden erfasst +- Benutzer öffnet die App -> Alle eben sichtbaren Videos werden angezeigt +- Benutzer klickt auf ein Video -> In der Übersicht auf Starten -> Das Video wird abgespielt +# Szenario 2 +- Benutzer öffnet die App -> Klickt auf ein Video -> In der Übersicht auf Download +- Das Internet fällt aus -> Benutzer öffnet die App -> Geht auf heruntergeladene Videos +- Das vorhin heruntergeladene Video wird angezeigt -> Übersicht Abspielen -> Video wird abgespielt \ No newline at end of file