Neuer YouTube-Bereich im Online-Tab: Adresse einfuegen, herunterladen, der Titel landet in Meine Musik. - BakaAuth: Anmeldung gegen baka-net.de/auth, Token verschluesselt auf dem Geraet. Der Server meldet Fehler mit HTTP 200 und Text im Rumpf, deshalb wird der Inhalt geprueft statt nur der Statuscode. - YtDownloadService: Proxy fragen, MP3 abholen, halbe Dateien aufraeumen. Kuenstler nur aus "Kuenstler - Lied", sonst leer statt geraten. - MediaStoreBridge (Kotlin): legt die Datei in Music/Melo ab und meldet sie dem MediaStore. Noetig, weil der Android-Scan sonst beim naechsten Lauf alles wieder als verschwunden markiert. - SubTabs nach shared/ gezogen (jetzt in Meine Musik und Online genutzt). 177 Tests gruen, flutter analyze ohne Befund, Release-APK baut. Der Weg ueber den echten Proxy ist noch nicht auf dem Geraet erprobt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018NLW1q1hzEC9goDQ1dJ98d
38 lines
1.3 KiB
Dart
38 lines
1.3 KiB
Dart
import 'package:flutter/foundation.dart';
|
|
import 'package:flutter/services.dart';
|
|
|
|
/// Trägt fertige Musikdateien in den öffentlichen Musikordner von Android ein.
|
|
///
|
|
/// Nötig, weil der Bibliotheks-Scan auf Android über den MediaStore läuft:
|
|
/// Songs, die dort nicht stehen, werden beim nächsten Scan als verschwunden
|
|
/// markiert. Nebeneffekt: heruntergeladene Musik ist auch in anderen Apps da.
|
|
class MediaStore {
|
|
const MediaStore({this.channel = _standardKanal});
|
|
|
|
static const _standardKanal = MethodChannel('de.baka.melo/media_store');
|
|
|
|
final MethodChannel channel;
|
|
|
|
/// Verschiebt [quellPfad] nach `Music/Melo` und meldet die Datei dem
|
|
/// MediaStore. Gibt den neuen Pfad zurück, oder `null` wenn es nicht klappt.
|
|
Future<String?> veroeffentliche({
|
|
required String quellPfad,
|
|
required String titel,
|
|
String? kuenstler,
|
|
}) async {
|
|
try {
|
|
return await channel.invokeMethod<String>('publishAudio', {
|
|
'sourcePath': quellPfad,
|
|
'title': titel,
|
|
'artist': kuenstler,
|
|
});
|
|
} on PlatformException catch (e) {
|
|
debugPrint('MediaStore-Eintrag fehlgeschlagen: ${e.message}');
|
|
return null;
|
|
} on MissingPluginException {
|
|
// Desktop/Tests: dort gibt es keinen MediaStore.
|
|
return null;
|
|
}
|
|
}
|
|
}
|