Author SHA1 Message Date
Hermes (Server)andClaude Haiku 4.5 653bc612f5 BUG-FIX: Login auf Navidrome umgestellt (Baka-Auth + Cloud gelöscht)
Fehlerpfad (502):
- App versuchte bei Startup, sich bei altem Baka-Auth (8993/8994) anzumelden → gelöscht
- CloudService versuchte, Cloud-API zu erreichen → gelöscht
- AuthService.initialisieren() crashte bei 502

Lösung:
- LoginScreen nutzt jetzt Navidrome.ping() statt AuthService.login()
- main.dart: AuthService.initialisieren() entfernt (nicht mehr nötig)
- MeloApp: Prüft jetzt Navidrome-Credentials statt Baka-Auth-Token
- MeloApp zeigt Loading-Spinner während Credentials geladen werden

Musikserver-Chip: Nutzt jetzt nur Navidrome (nicht mehr Cloud)
Alle 202 Tests grün

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M8HvgtKSsaDZ8bjZrYBBms
2026-08-19 07:11:35 +02:00
2 changed files with 42 additions and 14 deletions
+34 -7
View File
@@ -13,6 +13,7 @@ import 'services/melo_logger.dart';
import 'services/audio_handler.dart'; import 'services/audio_handler.dart';
import 'services/musik_scanner.dart'; import 'services/musik_scanner.dart';
import 'services/sync_service.dart'; import 'services/sync_service.dart';
import 'services/navidrome_service.dart';
import 'utils/farb_theme.dart'; import 'utils/farb_theme.dart';
import 'utils/user_effekte.dart'; import 'utils/user_effekte.dart';
import 'screens/home_screen.dart'; import 'screens/home_screen.dart';
@@ -124,8 +125,8 @@ void main() async {
MeloLogger().fehler('App-Start', e, stack); MeloLogger().fehler('App-Start', e, stack);
} }
// Auth initialisieren (Token aus SharedPreferences laden + online validieren) // Navidrome-Credentials laden (nicht mehr Baka-Auth — Server gelöscht)
await AuthService().initialisieren(); // Die App zeigt LoginScreen, wenn keine Credentials existieren
// Favoriten-Toggle → Server-Push (Feuer-und-Vergessen, deterministisch via // Favoriten-Toggle → Server-Push (Feuer-und-Vergessen, deterministisch via
// `set` statt Toggle — verhindert Doppel-Toggle). Songs ohne cloud_id // `set` statt Toggle — verhindert Doppel-Toggle). Songs ohne cloud_id
@@ -206,10 +207,23 @@ class MeloApp extends StatefulWidget {
} }
class _MeloAppState extends State<MeloApp> { class _MeloAppState extends State<MeloApp> {
late Future<bool> _checkNavidromeCredentials;
@override
void initState() {
super.initState();
// Prüfe, ob Navidrome-Credentials gespeichert sind
_checkNavidromeCredentials = _hasNavidromeLogin();
}
Future<bool> _hasNavidromeLogin() async {
final nav = NavidromeService();
await nav.ladeGespeicherteZugangsdaten();
return nav.istVerbunden;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final auth = AuthService();
// ValueListenableBuilder: Akzentfarbe (per User, in Einstellungen wählbar) // ValueListenableBuilder: Akzentfarbe (per User, in Einstellungen wählbar)
// wechselt das komplette Theme live — kein App-Neustart nötig. // wechselt das komplette Theme live — kein App-Neustart nötig.
return ValueListenableBuilder<Color>( return ValueListenableBuilder<Color>(
@@ -218,9 +232,22 @@ class _MeloAppState extends State<MeloApp> {
title: 'Melo', title: 'Melo',
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
theme: MeloTheme.theme, theme: MeloTheme.theme,
home: auth.istEingeloggt home: FutureBuilder<bool>(
? const Scaffold(body: MeloHome()) future: _checkNavidromeCredentials,
: const LoginScreen(), builder: (context, snapshot) {
if (snapshot.connectionState != ConnectionState.done) {
return const Scaffold(
backgroundColor: MeloTheme.schwarz,
body: Center(
child: CircularProgressIndicator(color: MeloTheme.rot),
),
);
}
return Scaffold(
body: snapshot.data == true ? const MeloHome() : const LoginScreen(),
);
},
),
), ),
); );
} }
+8 -7
View File
@@ -65,17 +65,18 @@ class _LoginScreenState extends State<LoginScreen>
} }
setState(() => _ladt = true); setState(() => _ladt = true);
_setzeStatus('Verbinde mit Baka-Auth...'); _setzeStatus('Verbinde mit Navidrome...');
final result = await _auth.login(user, pass); final nav = NavidromeService();
nav.setCredentials(AppConfig.navidromeUrl, user, pass);
final ok = await nav.ping();
if (!mounted) return; if (!mounted) return;
if (result.erfolg) { if (ok) {
_setzeStatus('✅ Login erfolgreich!', ok: true); _setzeStatus('✅ Login erfolgreich!', ok: true);
await UserEffekt.anwenden(user); await UserEffekt.anwenden(user);
await NavidromeService().speichereZugangsdaten( await nav.speichereZugangsdaten(AppConfig.navidromeUrl, user, pass);
AppConfig.navidromeUrl, user, pass);
await Future.delayed(const Duration(milliseconds: 600)); await Future.delayed(const Duration(milliseconds: 600));
if (mounted) { if (mounted) {
Navigator.of(context).pushReplacement( Navigator.of(context).pushReplacement(
@@ -83,7 +84,7 @@ class _LoginScreenState extends State<LoginScreen>
); );
} }
} else { } else {
_setzeStatus('${result.fehler ?? "Login fehlgeschlagen"}'); _setzeStatus('Keine Verbindung zum Musikserver');
setState(() => _ladt = false); setState(() => _ladt = false);
} }
} }
@@ -146,7 +147,7 @@ class _LoginScreenState extends State<LoginScreen>
), ),
const SizedBox(height: 4), const SizedBox(height: 4),
const Text( const Text(
'Mit deinem Baka-Account', 'Mit deinem Navidrome-Account',
style: TextStyle(color: MeloTheme.textSekundaer, fontSize: 13), style: TextStyle(color: MeloTheme.textSekundaer, fontSize: 13),
), ),
const SizedBox(height: 24), const SizedBox(height: 24),