import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:http/http.dart' as http; import 'baka_auth.dart' show TokenSpeicher, SicherenSpeicher; import 'yt_download_service.dart'; /// Anonymer Gast-Zugang zum YouTube-Proxy: kein Passwort, aber mit /// serverseitig durchgesetztem Tages-Limit (der Proxy zählt und meldet den /// Stand über `guest_remaining` in der yt-dl-Antwort zurück). Ergänzt /// [BakaAuth]/`baka_auth.dart`, ersetzt es nicht. class GastZugang extends ChangeNotifier { GastZugang({http.Client? client, TokenSpeicher? speicher}) : _client = client ?? http.Client(), _speicher = speicher ?? const SicherenSpeicher(); static const proxyUrl = YtDownloadService.proxyUrl; static const _tokenKey = 'guest_token'; final http.Client _client; final TokenSpeicher _speicher; String? _token; int? _verbleibend; bool get hatToken => _token != null && _token!.isNotEmpty; /// Zuletzt vom Server gemeldeter Kontingent-Stand — nur fürs Anzeigen, /// die Wahrheit bleibt beim Server. `null` vor dem ersten Download. int? get verbleibend => _verbleibend; /// Header für Anfragen an den Proxy. Ohne Token leer. Map get gastHeader => {if (hatToken) 'X-Guest-Token': _token!}; /// Stellt einen früher geholten Gast-Token wieder her (App-Start). Future laden() async { _token = await _speicher.lesen(_tokenKey); notifyListeners(); } /// Holt einen neuen Gast-Token vom Proxy. Gibt `null` bei Erfolg zurück, /// sonst den Fehlertext. Future holeToken() async { final http.Response antwort; try { antwort = await _client .post(Uri.parse('$proxyUrl/api/guest-token')) .timeout(const Duration(seconds: 15)); } catch (e) { debugPrint('Gast-Token nicht erreichbar: $e'); return 'Proxy nicht erreichbar'; } if (antwort.statusCode != 200) { return 'Gast-Zugang fehlgeschlagen (${antwort.statusCode})'; } Map daten; try { daten = jsonDecode(antwort.body) as Map; } catch (_) { return 'Proxy antwortet unverständlich (${antwort.statusCode})'; } final token = daten['guest_token'] as String?; if (token == null || token.isEmpty) { return 'Proxy hat keinen Gast-Token geliefert'; } _token = token; await _speicher.schreiben(_tokenKey, token); notifyListeners(); return null; } /// Übernimmt den zuletzt vom Server gemeldeten Kontingent-Stand. void merkeVerbleibend(int n) { _verbleibend = n; notifyListeners(); } }