import 'package:http/http.dart' as http; import 'package:youtube_explode_dart/youtube_explode_dart.dart'; var regex = r''' (?(DEFINE) # Note that everything is atomic, JSON does not need backtracking if it's valid # and this prevents catastrophic backtracking (?(?>\s*(?&object)\s*|\s*(?&array)\s*)) (?(?>\{\s*(?>(?&pair)(?>\s*,\s*(?&pair))*)?\s*\})) (?(?>(?&STRING)\s*:\s*(?&value))) (?(?>\[\s*(?>(?&value)(?>\s*,\s*(?&value))*)?\s*\])) (?(?>true|false|null|(?&STRING)|(?&NUMBER)|(?&object)|(?&array))) (?(?>"(?>\\(?>["\\\/bfnrt]|u[a-fA-F0-9]{4})|[^"\\\0-\x1F\x7F]+)*")) (?(?>-?(?>0|[1-9][0-9]*)(?>\.[0-9]+)?(?>[eE][+-]?[0-9]+)?)) ) \A(?&json)\z '''; var sep = 'ytplayer.config = '; Future main() async { var yt = YoutubeExplode(); var m = await yt.videos.streamsClient.getManifest(VideoId('382BTxLNrow')); await yt.videos.streamsClient.get(m.streams.first); yt.close(); print('Done!'); } String matchJson(String str) { var bracketCount = 0; for (var i = 0; i < str.length; i++) { if (str[i] == '{') { bracketCount++; } else if (str[i] == '}') { bracketCount--; } else if (str[i] == ';') { if (bracketCount == 0) { return str.substring(0, i); } } } throw FormatException('Failed to extract json'); } var data = r''' ''';