class YoutubePlayer extends StatelessWidget { final divId = math.Random().nextInt(300); String url; YoutubePlayer({ required this.url, }); var showedViewDelay = false; late String? tempUrl; WebViewXController? controller; @override Widget build(BuildContext context) { // if (!showedViewDelay || tempUrl == null) // return Card( // color: Colors.white.withOpacity(0.1), // ); log('get youtube: get link'); tempUrl = _getYoutubeId(url); return LayoutBuilder(builder: (BuildContext ctx, BoxConstraints constraints) { log('get youtube: build youtube'); Size playerSize = Size( constraints.maxWidth, constraints.maxHeight, ); log('sizes; ${playerSize}'); final resUrl = 'https://www.youtube.com/embed/' + tempUrl! + "?enablejsapi=1&origin=https://nemesis.wtf"; var loadData = """
"""; if (controller != null) { controller!.reload(); controller!.loadContent(loadData, SourceType.html); } // child: WebViewX( // onWebViewCreated: (controller) { // log("loaded web view"); // this.controller = controller; // }, // ), // ); return Container( constraints: BoxConstraints(maxHeight: playerSize.height.round() - 20), child: IframeView( htmlSource: loadData, ), ); }); } String? _getYoutubeId(String link) { RegExp regExp = new RegExp( r'.*(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|\&v(?:i)?=))([^#\&\?]*).*', caseSensitive: false, multiLine: false, ); final match = regExp.firstMatch(link)?.group(1); // <- This is the fix // print('$link -> $match'); return match; } }