YouTube-Tab: Server-User brauchen keine eigene Baka-Anmeldung mehr

Server-User (Dustin, Baka, Tinker) melden sich beim Öffnen des
YouTube-Bereichs automatisch im Hintergrund mit ihren Navidrome-
Zugangsdaten beim Baka-Konto an (BakaAuth.autoAnmelden) — die
manuelle Anmeldung bleibt nur für Gäste sichtbar. Schlägt die
Auto-Anmeldung fehl, gibt es einen Rückfallweg zur manuellen
Anmeldung, statt den User auszusperren. Login-Buttons vergrößert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CcDiyJdVRqh1TtJk5JiabX
This commit is contained in:
Hermes (Server)
2026-08-26 00:18:49 +02:00
co-authored by Claude Sonnet 5
parent f0313724d4
commit f604dc7635
8 changed files with 346 additions and 29 deletions
+68 -26
View File
@@ -606,11 +606,32 @@ class _YouTubeBereichState extends State<_YouTubeBereich> {
/// Gewählter Datenträger; `null` = Android entscheidet (nur ein Ort da).
String? _volume;
/// Wer am Melo-Server angemeldet ist, braucht keine eigene
/// Baka-Anmeldung mehr — nur Gäste (kein Server-Account) sehen sie.
bool _serverUser = false;
/// Die automatische Anmeldung ist fehlgeschlagen (z. B. abweichendes
/// Baka-Passwort) — dann bleibt der manuelle Anmelde-Weg als Rückfalloption
/// sichtbar, sonst käme so ein User nie mehr an den Dialog heran.
bool _autoLoginFehlgeschlagen = false;
@override
void initState() {
super.initState();
_ladeEinstellungen();
_uebernimmAdresse();
_pruefeServerUser();
}
Future<void> _pruefeServerUser() async {
final nav = context.read<DownloadService>().navidrome;
final auth = context.read<BakaAuth>();
final ergebnis = await pruefeServerUser(nav, auth);
if (!mounted) return;
setState(() {
_serverUser = ergebnis.serverUser;
_autoLoginFehlgeschlagen = ergebnis.autoLoginFehlgeschlagen;
});
}
@override
@@ -716,38 +737,54 @@ class _YouTubeBereichState extends State<_YouTubeBereich> {
Widget build(BuildContext context) {
final auth = context.watch<BakaAuth>();
final dienst = context.watch<YtDownloadService>();
// Server-User gelten sofort als berechtigt — die Anmeldung passiert für
// sie im Hintergrund (_pruefeServerUser). Nur wenn die automatische
// Anmeldung nachweislich fehlgeschlagen ist, bleibt der manuelle Weg
// als Rückfalloption sichtbar — sonst gäbe es keinen Weg mehr zurück.
final zugriffOk =
auth.istAngemeldet || (_serverUser && !_autoLoginFehlgeschlagen);
return ListView(
padding: const EdgeInsets.fromLTRB(16, 12, 16, 24),
children: [
if (!auth.istAngemeldet) ...[
const Text(
'Der Downloader läuft über den Baka-Server. Dafür brauchst du '
'deine Baka-Anmeldung.',
style: TextStyle(color: MeloTheme.text2, fontSize: 13),
if (!zugriffOk) ...[
Text(
_autoLoginFehlgeschlagen
? 'Die automatische Anmeldung hat nicht geklappt. Bitte '
'manuell beim Baka-Konto anmelden.'
: 'Der Downloader läuft über den Baka-Server. Dafür brauchst '
'du deine Baka-Anmeldung.',
style: const TextStyle(color: MeloTheme.text2, fontSize: 13),
),
const SizedBox(height: 12),
FilledButton.icon(
icon: const Icon(Icons.login),
label: const Text('Beim Baka-Konto anmelden'),
onPressed: _anmelden,
SizedBox(
width: double.infinity,
height: MeloTheme.minTouchTarget + 4,
child: FilledButton.icon(
icon: const Icon(Icons.login),
label: const Text('Beim Baka-Konto anmelden',
style: TextStyle(fontSize: 16)),
onPressed: _anmelden,
),
),
] else ...[
Row(
children: [
const Icon(Icons.verified_user, size: 18, color: MeloTheme.text3),
const SizedBox(width: 8),
Expanded(
child: Text('Angemeldet als ${auth.benutzer}',
style: const TextStyle(color: MeloTheme.text2, fontSize: 13)),
),
TextButton(
onPressed: auth.abmelden,
child: const Text('Abmelden'),
),
],
),
const SizedBox(height: 8),
if (!_serverUser) ...[
Row(
children: [
const Icon(Icons.verified_user, size: 18, color: MeloTheme.text3),
const SizedBox(width: 8),
Expanded(
child: Text('Angemeldet als ${auth.benutzer}',
style: const TextStyle(color: MeloTheme.text2, fontSize: 13)),
),
TextButton(
onPressed: auth.abmelden,
child: const Text('Abmelden'),
),
],
),
const SizedBox(height: 8),
],
TextField(
controller: _url,
enabled: !dienst.laeuft,
@@ -909,14 +946,19 @@ class _AnmeldeDialogState extends State<_AnmeldeDialog> {
),
],
),
actionsPadding: const EdgeInsets.fromLTRB(16, 0, 16, 16),
actions: [
TextButton(
style: TextButton.styleFrom(
minimumSize: const Size(88, MeloTheme.minTouchTarget)),
onPressed: _verbindet ? null : () => Navigator.pop(context),
child: const Text('Abbrechen'),
child: const Text('Abbrechen', style: TextStyle(fontSize: 16)),
),
FilledButton(
style: FilledButton.styleFrom(
minimumSize: const Size(120, MeloTheme.minTouchTarget)),
onPressed: _verbindet ? null : _anmelden,
child: const Text('Anmelden'),
child: const Text('Anmelden', style: TextStyle(fontSize: 16)),
),
],
);