mirror of
https://github.com/Andre-Bzk/twitch4steamdeck.git
synced 2026-11-15 09:33:09 +01:00
7.8 KiB
7.8 KiB
Twitch4SteamDeck — TODO
Checkboxen-Tracker. Nach jedem erledigten Punkt sofort abhaken und kurzes Update in
CLAUDE_PROGRESS.mdergänzen.
Phase 0 — Projekt-Skelett
package.json, tsconfig (root/node/web)electron.vite.config.ts,electron-builder.yml,.gitignore- Main-Stub mit BrowserWindow
- Preload-Stub mit
contextBridge - Renderer (React + Big-Screen-Baseline-CSS)
- Smoke-Test:
npm install && npm run devzeigt Fenster
Phase 1 — Twitch OAuth Device Code Flow
deviceCodeFlow.ts(request + polling + refresh)tokenStore.ts(safeStorage-Persistenz)authService.ts(Lifecycle + EventEmitter)- IPC-Handler + Preload-Bridge
LoginScreen.tsx(QR + Code + Countdown)App.tsxRouting nach Auth-Status.env.example- End-to-End-Verifikation durch User (Login mit echter Twitch-App durchführen)
- Token-Persistenz prüfen: App-Neustart → bleibt eingeloggt
- Logout testen:
userData/twitch-tokens.binwird gelöscht (später)
Phase 2 — Twitch Helix-Client + Followed-Channels-Home-Screen
src/main/twitch/types.ts(Helix-Response-Typen)src/main/twitch/helixClient.ts(fetch-Wrapper, Auth-Header, Client-ID-Header, Paginierung)- Helix-Endpoints implementieren:
GET /users(eigener User → user_id cachen)GET /channels/followed?user_id=…(paginiert)GET /streams?user_id=…(batched, max 100 IDs pro Call)
- IPC:
twitch:get-followedregistrieren (merged live-Status + Avatar) - Preload-API erweitern:
window.t4sd.twitch.getFollowed FollowingScreen.tsx— Karten-Grid mit Live-Indicator, Vorschaubild, Titel, Zuschauerzahl- Spatial-Navigation: eigene Implementierung (Arrow-Keys + Region-Switch Sidebar ↔ Main)
- Gamepad-Service:
src/renderer/src/input/gamepad.ts(Gamepad-API → Keyboard-Events) FocusableCard.tsx— Block-Layout, Avatar + Name + Titel + Spiel + Viewer-BadgeAppShell.tsx+Sidebar.tsx— Layout mit linker Navigation (Du folgst / Durchsuchen / Mein Account)Icons.tsx— inline SVG-Icons (Heart, Compass, User)BrowseScreen.tsx+AccountScreen.tsx— Platzhalter-Screens mit Logout- End-to-End-Verifikation durch User (2026-04-07: Karten + Tastatur-Nav bestätigt)
Phase 3 — Streamlink + mpv (Live-Wiedergabe)
Vorab (Dev-Setup, Windows)
- User:
mpvinstallieren —winget install shinchiro.mpv, viasetxzum PATH - User:
streamlinkinstallieren —winget install streamlink(8.2.1) - User: Baseline-Test erfolgreich:
streamlink --twitch-disable-ads twitch.tv/streamerhouse best --player mpv
Backend (Main-Prozess)
src/main/playback/types.tssrc/main/playback/streamlink.ts—resolveStreamlinkBin()(Win32-Pfad-Auflösung),spawnStreamlink()mit--player mpv --player-args "..."(Variante 2)src/main/playback/mpvController.ts— Named Pipe (Win32) / Unix Socket (Linux), connect mit Retry,quit(),disconnect()src/main/playback/playbackService.ts- IPC-Kanäle:
playback:start-live,playback:stop,playback:event
Renderer (UI)
- Preload +
t4sd.d.tserweitern:window.t4sd.playback.{startLive, stop, onEvent} src/renderer/src/screens/ChannelScreen.tsx(Hero + Live-Button + Zustandsanzeige)- Routing in
AppShell.tsx:selectedChannel-State →ChannelScreen FocusableCard.onSelect→ setztselectedChannelviaonSelectChannel-Prop- Spatial-Nav: Escape/B im ChannelScreen → Stop oder Zurück
Verifikation
- Stream startet: mpv-Fenster öffnet sich, Stream spielt ab (2026-04-08) (Fix: --twitch-api-header entfernt, resolveMpvBin() ergänzt)
- User: Stop-Verhalten: mpv-Fenster schließt sich, keine Zombie-Prozesse (2026-04-08)
- User: Logout → Login → Stream starten funktioniert ohne App-Neustart (2026-04-08)
⚠️
--twitch-disable-adsist von streamlink deaktiviert — Werbung wird ggf. abgespielt (Post-MVP)
Phase 4 — VOD-Browsing + -Wiedergabe
- Helix
GET /videos?user_id=…&type=archive→getVideos()in helixClient - VOD-Shelf im ChannelScreen (horizontal, obere Hälfte fix)
playback:start-vodIPC-Kanal +PlaybackService.startVod()- mpv
--start=<seconds>beim Spawn (Parameter vorbereitet für Phase 5) - User: VOD-Wiedergabe + Stop-Verhalten verifiziert (2026-04-08)
Phase 5 — Lokaler VOD-Verlauf (Resume)
- SQLite-Setup:
src/main/store/db.ts(better-sqlite3, Migration) historyRepo.tsmitvod_history-Tabelle- mpv
time-pos-Observer schreibt alle ~5s in DB - Auto-Resume: beim VOD-Start Position aus DB lesen →
--start=<s> - Auto-Complete bei >95% Wiedergabefortschritt
- Resume-Indikator auf VOD-Karte (Fortschrittsbalken + „0:16 von 6:22" + „Vor X Min.")
- Completed-Indikator (dunkles Overlay + Checkmark)
- User: Verifiziert (2026-04-08)
„Continue Watching"-Reihe— entfällt (nicht benötigt)
Phase 5.5 — Browse-Menü: Kategorien + Top Live-Streams
HelixGame,GameInfoTypen intypes.tshelixClient.ts:getTopGames()+getTopStreams(gameId?)- IPC:
twitch:get-top-games,twitch:get-top-streams - Preload +
t4sd.d.ts: Typen + API-Methoden gamepad.ts: Button 2 (X) →'x', Button 3 (Y) →'y'BrowseScreen.tsx: Shelf (Top Live) + Grid (Kategorien), Key-MappingCategoryScreen.tsx: Streams-Grid pro GameAppShell.tsx:selectedCategory-Routingglobal.css: Browse/Game-Card-Styles- User: End-to-End-Verifikation (Browse laden, Live starten, Kategorie-Drilldown)
Phase 5.6 — Einstellungen + Sprach-Badge/Flagge
languageinHelixStream+FollowedChannelInfo(types.ts, preload, t4sd.d.ts)helixClient.ts:languageingetTopStreams+getFollowedWithLiveStatusSettingsContext.tsx: Provider +useSettings()+ localStorage-PersistenzIcons.tsx:SettingsIcon(Zahnrad)Sidebar.tsx: 4. Tab „Einstellungen"LanguageBadge.tsx: Badge/Flag/Both Rendering + 38-Sprachen-MapSettingsScreen.tsx: Radio-Liste mit 4 OptionenAppShell.tsx: Settings-Tab routenmain.tsx:<SettingsProvider>um AppFocusableCard.tsx: LanguageBadge unten-rechtsBrowseScreen.tsx: LanguageBadge in Shelf-Cardsglobal.css: Badge + Settings-Screen Styles- User: End-to-End-Verifikation (Einstellungen + Badge funktionieren, Persistenz bestätigt; Flaggen erst auf Steam Deck testbar)
Phase 6 — Flatpak-Packaging
flatpak/tv.twitch4steamdeck.App.ymlManifest (Runtime, Module, Permissions)flatpak/twitch4steamdeck.shLauncher (zypak-wrapper)flatpak/tv.twitch4steamdeck.App.desktopDesktop-Eintragflatpak/build-flatpak.shBuild-Skript für WSL2 (inkl. SHA256-Auflösung)resources/icons/icon.svgApp-Icon (Platzhalter)- mpv + streamlink als Flatpak-Module im Manifest definiert
- Fix (Phase 6.1): streamlink Python-Deps via
flatpak-pip-generatoreingebunden (build-flatpak.shSchritt 4b +!include python3-streamlink.jsonim Manifest) - Fix (Phase 6.1): mpv-Patch
patches/mpv-ffmpeg7-avio-const.patchins Manifest eingebunden - User: WSL2-Setup (flatpak, flatpak-builder, Runtimes) — einmalig
- User:
bash flatpak/build-flatpak.shin WSL2 neu ausführen (nach 6.1-Fix) - User: Auf Steam Deck installieren und Login + Live + VOD durchspielen
- User: Als Non-Steam-Game in Gaming Mode hinzufügen, dort testen
Post-MVP (bewusst nicht im ersten Release)
- Chat (Live + VOD-Replay) inkl. BTTV/FFZ/7TV
- Suche / Kategorien-Browsing
- Eigene Twitch-Client-ID im Build verankert
- README mit Disclaimer (ToS) + Setup-Anleitung
- Flathub-Einreichung