fix: Login-Fehlerhandler — 200 ohne Token abfangen, Server-Nachrichten parsen
This commit is contained in:
@@ -3,6 +3,8 @@ import 'dart:io';
|
||||
import 'package:just_audio/just_audio.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'dart:convert';
|
||||
import '../models/song.dart';
|
||||
import '../database/db_helper.dart';
|
||||
import '../utils/audio_validator.dart';
|
||||
@@ -107,6 +109,9 @@ class MusikScanner {
|
||||
_neueSongs = neue.length;
|
||||
}
|
||||
|
||||
// ── YouTube-Quell-URLs für Songs ohne ytUrl nachschlagen ──
|
||||
await _sucheYtUrls();
|
||||
|
||||
return gefunden;
|
||||
}
|
||||
|
||||
@@ -198,4 +203,53 @@ class MusikScanner {
|
||||
final dot = name.lastIndexOf('.');
|
||||
return dot > 0 ? name.substring(0, dot) : name;
|
||||
}
|
||||
|
||||
/// Sucht YouTube-Quell-URLs für Songs ohne ytUrl (max 50 pro Scan, 1/s Rate-Limit)
|
||||
Future<void> _sucheYtUrls() async {
|
||||
const maxSuchanfragen = 50;
|
||||
const suchUrlBasis = 'https://yt.baka-net.de/api/search';
|
||||
|
||||
final songsOhneUrl = await _db.songsOhneYtUrl(limit: maxSuchanfragen);
|
||||
if (songsOhneUrl.isEmpty) return;
|
||||
|
||||
int gefunden = 0;
|
||||
for (final song in songsOhneUrl) {
|
||||
if (gefunden >= maxSuchanfragen) break;
|
||||
|
||||
try {
|
||||
final query = '${song.kuenstler} ${song.titel}';
|
||||
final url = '$suchUrlBasis?q=${Uri.encodeQueryComponent(query)}';
|
||||
|
||||
final antwort = await http.get(Uri.parse(url)).timeout(
|
||||
const Duration(seconds: 10),
|
||||
);
|
||||
|
||||
if (antwort.statusCode == 200) {
|
||||
final daten = jsonDecode(antwort.body);
|
||||
if (daten is List && daten.isNotEmpty) {
|
||||
final erstes = daten[0];
|
||||
final ytUrl = erstes['url'] as String?;
|
||||
if (ytUrl != null && ytUrl.isNotEmpty) {
|
||||
await _db.ytUrlAktualisieren(song.id!, ytUrl);
|
||||
gefunden++;
|
||||
MeloLogger().zustand('yt_suche_treffer', {
|
||||
'song_id': song.id,
|
||||
'titel': song.titel,
|
||||
'yt_url': ytUrl,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
MeloLogger().fehler('yt_suche_fehler', '${song.titel}: $e');
|
||||
}
|
||||
|
||||
// Rate-Limit: 1 Anfrage pro Sekunde
|
||||
await Future.delayed(const Duration(seconds: 1));
|
||||
}
|
||||
|
||||
if (gefunden > 0) {
|
||||
MeloLogger().zustand('yt_suche_abschluss', {'gefunden': gefunden});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user