import 'package:flutter/services.dart'; /// Erste Web-Adresse in [text], oder `null`. /// /// Wer ein Video an Melo teilt, schickt selten nur die Adresse — die /// YouTube-App hängt Titel und „über @YouTube" drumherum. /// /// Bewusst **nicht** auf youtube.com eingeschränkt: der Downloader läuft über /// yt-dlp am Server und kann mehr als YouTube. Was davon geht, entscheidet /// der Server, nicht diese Zeile. String? adresseAus(String? text) { if (text == null || text.isEmpty) return null; final treffer = _adresse.firstMatch(text); if (treffer == null) return null; // Satzzeichen am Ende gehören zum Satz, nicht zur Adresse. return treffer.group(0)!.replaceAll(RegExp(r'[.,;:!?)\]]+$'), ''); } final _adresse = RegExp(r'https?://\S+'); /// Nimmt entgegen, was andere Apps über „Teilen" an Melo schicken. /// /// Eigene Brücke statt eines Zusatzpakets — das Projekt hat für MediaStore /// und Klangeffekte bereits eigene (siehe `MediaStoreBridge`). class GeteilteAdresse { const GeteilteAdresse({this.channel = const MethodChannel(kanalName)}); static const kanalName = 'de.baka.melo/geteilt'; final MethodChannel channel; /// Die Adresse, mit der die App gerade geöffnet wurde, oder `null`. /// /// Wird beim Abholen auf der Android-Seite gelöscht: sonst spränge die App /// bei jedem Wiedereintritt erneut in den Downloader. Future abholen() async { try { final text = await channel.invokeMethod('hole'); return adresseAus(text); } on PlatformException { return null; } on MissingPluginException { // Andere Plattformen kennen die Brücke nicht — dort gibt es kein // Teilen an Melo, und das ist kein Fehler. return null; } } }