public static async Task <string> DownloadVideo(ChromiumWebBrowser youtubePlayer) { #if USE_YOUTUBE_EXTRACTOR string link = "https://www.youtube.com/watch?v=" + Music.VideoId; IEnumerable <VideoInfo> videoInfos = DownloadUrlResolver.GetDownloadUrls(link); VideoInfo video = videoInfos .First(info => info.VideoType == VideoType.WebM && info.Resolution == 360); if (video.RequiresDecryption) { DownloadUrlResolver.DecryptDownloadUrl(video); } var fullName = video.Title; var saveName = fullName.Replace("- YouTube", ""); var videoDownloader = new VideoDownloader(video, Path.Combine(FilePaths.SaveLocation(), FilePaths.RemoveIllegalPathCharacters(saveName))); videoDownloader.DownloadProgressChanged += (sender, args) => Console.WriteLine(args.ProgressPercentage); videoDownloader.Execute(); #endif #if USE_LIBVIDEO /*// Other youtube library libvideo * var uri = "https://www.youtube.com/watch?v=" + Music.VideoId; * var youTube = YouTube.Default; * var video = youTube.GetVideo(uri);*///youtubePlayer.Address = "http://33232463.nhd.weebly.com/"; /*var fullName = video.FullName; // same thing as title + fileExtension * var saveName = FilePaths.RemoveIllegalPathCharacters(fullName.Replace("- YouTube", "")); * saveName = saveName.Replace("_", ""); * var bytes = await video.GetBytesAsync(); * //var stream = video.Stream();*/ #endif #if USE_YOUTUBEEXPLODE // Client var client = new YoutubeClient(); var videoInfo = await client.GetVideoAsync(VideoId); // Print metadata Console.WriteLine($"Id: {videoInfo.Id} | Title: {videoInfo.Title} | Author: {videoInfo.Author.Title}"); #endif try { //var streamInfo = videoInfo.MixedStreams // .OrderBy(s => s.VideoEncoding == VideoEncoding.Vp8) // .ThenBy(s => s.VideoQuality == VideoQuality.High720).Last(); //youtubePlayer.LoadHtml( // $"<html><body scroll=\"no\" style=\"overflow: hidden\"><iframe id = \"youtubePlayer\" src=\"http://youtube.com/embed/{videoInfo.Id}?autoplay=1&controls=0&disablekb=1&enablejsapi=1&rel=0&showinfo=0&showsearch=0\" width=\"480\" height=\"270\" frameborder=\"0\" allowfullscreen=\"\" Style =\"pointer-events:none;\"></iframe>", // "Music Player"); youtubePlayer.LoadHtml($"<html>\r\n\r\n<body scroll=\"no\" style=\"overflow: hidden\">\r\n <div id=\"youtubePlayer\"></div>\r\n <script>\r\n var tag = document.createElement(\'script\');\r\n tag.src = \"https://www.youtube.com/iframe_api\";\r\n var firstScriptTag = document.getElementsByTagName(\'script\')[0];\r\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\r\n var youtubePlayer;\r\n\r\n var playBackEnded;\r\n\r\n function onYouTubeIframeAPIReady() {{\r\n youtubePlayer = new YT.Player(\'youtubePlayer\', {{\r\n height: \'270\'\r\n , width: \'480\'\r\n , videoId: \'{VideoId}\'\r\n , playerVars: {{\r\n controls: \'0\'\r\n , disablekb: \'1\'\r\n , autoplay: \'1\'\r\n , showinfo: \'0\'\r\n , modestbranding: \'1\'\r\n , rel: \'0\'\r\n , showsearch: \'0\'\r\n }}, events: {{\r\n \'onStateChange\': onPlayerStateChange\r\n }}\r\n }});\r\n }}\r\n function onPlayerStateChange(event){{\r\n if( event.data == YT.PlayerState.ENDED) playBackEnded = true; else playBackEnded = false;\r\n }} </script>\r\n</body>\r\n\r\n</html>", "http://youtube.com"); Console.WriteLine("Player loaded? " + youtubePlayer.IsLoaded); } catch { // var streamInfo = videoInfo.MixedStreams // .OrderBy(s => s.VideoEncoding == VideoEncoding.Vp8) // .ThenBy(s => s.VideoQuality == VideoQuality.Medium480).Last(); youtubePlayer.LoadHtml($"<html>\r\n\r\n<body scroll=\"no\" style=\"overflow: hidden\">\r\n <div id=\"youtubePlayer\"></div>\r\n <script>\r\n var tag = document.createElement(\'script\');\r\n tag.src = \"https://www.youtube.com/iframe_api\";\r\n var firstScriptTag = document.getElementsByTagName(\'script\')[0];\r\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\r\n var youtubePlayer;\r\n\r\n var playBackEnded;\r\n\r\n function onYouTubeIframeAPIReady() {{\r\n youtubePlayer = new YT.Player(\'youtubePlayer\', {{\r\n height: \'270\'\r\n , width: \'480\'\r\n , videoId: \'{VideoId}\'\r\n , playerVars: {{\r\n controls: \'0\'\r\n , disablekb: \'1\'\r\n , autoplay: \'1\'\r\n , showinfo: \'0\'\r\n , modestbranding: \'1\'\r\n , rel: \'0\'\r\n , showsearch: \'0\'\r\n }}, events: {{\r\n \'onStateChange\': onPlayerStateChange\r\n }}\r\n }});\r\n }}\r\n function onPlayerStateChange(event){{\r\n if( event.data == YT.PlayerState.ENDED) playBackEnded = true; else playBackEnded = false;\r\n }} </script>\r\n</body>\r\n\r\n</html>", "http://youtube.com"); Console.WriteLine("Player loaded? " + youtubePlayer.IsLoaded); } //Console.WriteLine("Can execute JS: "+ youtubePlayer.CanExecuteJavascriptInMainFrame); #if OFFLINE_IMPLEMENTED streamInfo = videoInfo.MixedStreams .OrderBy(s => s.VideoEncoding == YoutubeExplode.Models.mediaStreams.VideoEncoding.H264) .Last(); // Compose file name, based on metadata string fileExtension = streamInfo.Container.GetFileExtension(); string saveName = $"{videoInfo.Title}.{fileExtension}"; // Remove illegal characters from file name saveName = FilePaths.RemoveIllegalPathCharacters(saveName); // Download video Console.WriteLine($"Downloading to [{saveName}]..."); string savePath = Path.Combine(FilePaths.SaveLocation(), saveName); await client.DownloadmediaStreamAsync(streamInfo, savePath); //File.WriteAllBytes(savePath, bytes); SongTitle = savePath; Console.WriteLine("Done downloading " + SongTitle); return(savePath); #endif return(VideoId); }