Merge branch 'feature/youtube-gast-zugang'

# Conflicts:
#	CHANGELOG.md
#	test/downloads/online_screen_test.dart
This commit is contained in:
Hermes (Server)
2026-08-30 10:34:58 +02:00
19 changed files with 1138 additions and 36 deletions
+123
View File
@@ -236,6 +236,129 @@ Vor dem Push ein Review über den gesamten Diff der Blur-Übergang-Serie
-**Getestet:** 3 neue Widget-Tests (RED→GREEN, je einer pro Stelle),
volle Suite (590 Tests) grün, `flutter analyze` ohne Befund.
### 🐛 Cloud-Kontingent-Fix aus dem Task-Review (2026-08-29)
- 🔁 **`BakaAuth.abmelden()` setzt jetzt auch `verbleibend` zurück.**
Referenzmuster `GastZugang.verwerfen()` setzt `_verbleibend = null` mit,
`abmelden()` tat das bisher nicht — nur `_token`/`_benutzer` wurden
zurückgesetzt. Meldet sich ein Cloud-User ab und ein ANDERER Cloud-User
(Dustin/Baka/Tinker) danach an, wäre sonst bis zum nächsten Download der
alte Kontingent-Stand des vorherigen Accounts sichtbar geblieben.
Aktuell folgenlos (da `verbleibend` bis zum Server-Rollout ohnehin immer
`null` ist), aber ein latenter Bug, der beim Server-Rollout live
gegangen wäre. (`lib/services/baka_auth.dart`)
-**Getestet (RED→GREEN):** neuer Test „Abmelden setzt auch den
Kontingent-Stand zurück" in `test/services/baka_auth_test.dart`. Volle
Suite grün, `flutter analyze` ohne Befund.
### ☁️ Cloud-Account-Kontingent: App-Seite für das 100/Tag-Limit (2026-08-29)
- ⚠️ **Reine App-Seite, ohne Wirkung bis der Server mitzieht.** Die
Server-Zählung (`cloud_quota`, 100/Tag je Nutzername) in `yt_proxy.py`
ist NICHT Teil dieser Änderung — das macht die `claude-server`-Session
separat (siehe Nachtrag "100/Tag-Limit auch für Cloud-Accounts" in
`docs/superpowers/specs/2026-08-26-youtube-guest-quota-design.md`). Bis
der Server das neue Feld `cloud_remaining` liefert, bleibt
`auth.verbleibend` einfach `null` — kein Fehler, kein sichtbarer
Unterschied zu heute.
- 🔢 **`BakaAuth` bekommt einen Kontingent-Stand** — analog zu
`GastZugang.verbleibend`/`.merkeVerbleibend(n)`: neues Feld `int?
verbleibend` (Getter) und `void merkeVerbleibend(int n)`
(`lib/services/baka_auth.dart`).
- 🔌 **`YtDownloadService.herunterladen()` liest `cloud_remaining`** aus
einer erfolgreichen `POST /api/yt-dl`-Antwort und ruft bei
Cloud-Zugriff (`!gastAktiv`) `auth.merkeVerbleibend(...)` auf — genau
wie beim bestehenden `guest_remaining`/`gast.merkeVerbleibend(...)`
fürs Gast-Kontingent, aber strikt getrennt (ein Gast-Zugriff liest das
Feld nie, ein Cloud-Zugriff nie `guest_remaining`).
(`lib/services/yt_download_service.dart`)
- 📟 **Angemeldete Cloud-Accounts sehen jetzt „Noch N von 100 heute“**,
sobald der Server den Stand gemeldet hat — an vergleichbarer Stelle wie
der bestehende Gast-Zähler, aber nur bei `auth.istAngemeldet` (Gäste
haben weiter ihren eigenen Text, beide schließen sich gegenseitig aus).
(`lib/downloads/downloads_screen.dart`,
`lib/downloads/youtube_search_screen.dart`)
-**Getestet (TDD, RED→GREEN):** `merkeVerbleibend` in
`test/services/baka_auth_test.dart`; Erfolgsfall mit `cloud_remaining`
plus eine Trennschärfe-Gegenprobe (Gast-Zugriff liest `cloud_remaining`
nie, selbst wenn es im Body steht) in
`test/services/yt_download_test.dart`; je ein Widget-Test für den neuen
„Noch N von 100 heute“-Text in `test/downloads/online_screen_test.dart`
und `test/downloads/youtube_search_screen_test.dart`. Volle Suite
grün, `flutter analyze` ohne Befund.
### 🐛 Gast-Zugang: Fixe aus dem Branch-Abschluss-Review (2026-08-26)
- 🔓 **Gast-Modus war eine Einbahnstraße.** Einmal "Als Gast fortfahren"
angetippt, blieb `gast.hatToken` dauerhaft `true` (Token steckt im
Secure Storage, wird bei jedem App-Start wiederhergestellt) — und damit
war `_AnmeldeDialog`, der EINZIGE Einstieg in der App für die
Baka-Anmeldung (auch für den Melo-Cloud-Sync-Login!), unerreichbar.
Neu: `GastZugang.verwerfen()` verwirft den Token wieder, und ein
"Anmelden"-Knopf neben der Gast-Statuszeile (Download-Tab und
YT-Suche-Tab) ruft ihn auf.
- 🔀 **Ein alter Gast-Token hat den Auto-Login-Rückfallweg für
Server-User verdeckt.** `zugriffOk` prüfte bisher den rohen
`gast.hatToken` statt `istGastModus` — ein Gerät, das früher mal als
Gast lief und jetzt als Server-User mit fehlgeschlagenem Auto-Login
dasteht, bekam die Fehlermeldung dazu nie zu sehen und lud still über
den (limitierten) Gast-Pfad. `istGastModus` wird jetzt vor `zugriffOk`
berechnet und dort statt des rohen Tokens verwendet.
(`lib/downloads/downloads_screen.dart`,
`lib/downloads/youtube_search_screen.dart`)
- ⏱️ **Doppel-Tap auf "Als Gast fortfahren" konnte zwei Anfragen
gleichzeitig auslösen.** Beide Screens sperren den Button jetzt während
`holeToken()` läuft (`_gastLaeuft`).
- 📝 **Widersprüchlicher Hinweistext im YT-Suche-Tab behoben** — der Text
über dem Gast-Button verlangte fälschlich eine Baka-Anmeldung.
- ⚠️ **CHANGELOG ergänzt:** der Abschnitt zum Gast-Zugang unten macht jetzt
klar, dass die Server-Seite (`POST /api/guest-token`) noch fehlt.
-**Getestet:** 2 neue Regressionstests fürs "Anmelden"-Escape-Hatch
(`test/downloads/online_screen_test.dart`,
`test/downloads/youtube_search_screen_test.dart`), 2 bestehende Gast-Tests
im YT-Suche-Tab jetzt mit echtem `gast:`-Wiring in
`YtSearchService`/`YtDownloadService`. Volle Suite grün, `flutter
analyze` ohne Befund.
### 📺👤 YouTube-Gast-Zugang: bewusste Wahl + Tages-Zähler (Download-Tab + YT-Suche-Tab) (2026-08-26)
- ⚠️ **Braucht noch die Server-Seite.** Der neue Endpunkt `POST
/api/guest-token` und die Quota-Logik in `yt_proxy.py` existieren noch
nicht (separates Vorhaben, siehe
`docs/superpowers/specs/2026-08-26-youtube-guest-quota-design.md`). Bis
die Server-Seite steht, liefert der "Als Gast fortfahren"-Button
zuverlässig einen 404-Fehler.
- 👤 **Echte Gäste (kein Baka-Konto, kein Melo-Server) sehen jetzt zwei
Buttons** statt nur der Anmeldung: "Beim Baka-Konto anmelden" und neu
"Als Gast fortfahren (5 Downloads/Tag)". Der Gast-Button holt sich per
`GastZugang.holeToken()` (aus Task 1-4 dieser Reihe) einen anonymen
Token vom Proxy und schaltet damit den Downloader frei — ganz ohne
Konto. Schlägt das Holen fehl, erscheint der Fehlertext direkt unter
dem Button.
- 🔢 **Im Gast-Modus zeigt eine Statuszeile "Als Gast unterwegs — noch N
von 5 heute"**, sobald der Server den Kontingent-Stand gemeldet hat
(vorher nur der generische Hinweistext "5 Downloads/Tag"). Der
Cookie-Schalter ("YouTube-Cookies des Servers verwenden") ist im
Gast-Modus ausgeblendet — der Server erzwingt für Gast-Zugriffe ohnehin
`cookies=false`, ein sichtbarer Schalter hätte nur eine Wahl vorgetäuscht,
die es nicht gibt.
- 🐛 **Nebenbefund durchs Qualitäts-Gate:** `_YouTubeBereich.build()`
beobachtet jetzt `GastZugang` app-weit über den Provider-Baum. Zwei
Tests (`hauptmenue_test.dart`, `home_shell_test.dart`) bauen ihren
eigenen Provider-Baum nach, statt `main.dart` zu importieren, und
hatten `GastZugang` dort noch nicht — beide entsprechend ergänzt (analog
zum bestehenden Muster für `BakaAuth`/`YtDownloadService`).
- 📺 **YT-Suche-Tab bekommt denselben Gast-Button und -Zähler** wie der
Download-Tab. Das alte "Baka-Anmeldung (siehe Download-Tab)" Hint für
Gäste ist weg — echte Gäste in `lib/downloads/youtube_search_screen.dart`
sehen jetzt "Als Gast fortfahren (5 Downloads/Tag)" und die Status-Zeile
"Als Gast unterwegs — noch N von 5 heute", genauso wie im Download-Tab.
- ✅ **Getestet:** volle Suite grün (600 Tests), `flutter analyze` ohne
Befund. 3 neue Widget-Tests in
`test/downloads/online_screen_test.dart`: beide Buttons sichtbar,
Gast-Token-Erfolg schaltet das Adressfeld frei, Gast-Token-Fehler wird
angezeigt.
### 📺🔑 YouTube-Tab: Server-User brauchen keine eigene Baka-Anmeldung mehr (2026-08-26)
- 🔑 **Server-User (Dustin, Baka, Tinker) sehen den Baka-Anmelde-Schritt nicht