private async Task LoadPage() { progressRing.IsActive = true; try { mainVideo = await MyToolkit.Multimedia.YouTube.GetVideoUriAsync(video.Id, selectedQuality); mediaPlayer.Source = mainVideo.Uri; mediaPlayer.Play(); progressRing.IsActive = false; } catch (Exception ex) { if (ex.HResult == -2146233088) { MessageDialog m = new MessageDialog("Quality Not Supported, try something else", "WinBeta Videos Error"); await m.ShowAsync(); } else { MessageDialog m = new MessageDialog("Could play video: " + ex.Message, "WinBeta Videos Error"); await m.ShowAsync(); } progressRing.IsActive = false; } }
public void PlaySong(YouTubeUri videoUri) { videoPlayer.Ctlcontrols.stop(); if (videoUri != null) { //myVlcControl.Play(videoUri.Uri); PlayVideo(videoUri.Uri.AbsoluteUri); } }
/// <summary>Returns all available URIs (audio-only and video) for the given YouTube ID. </summary> /// <returns>The <see cref="YouTubeUri"/>s of the video. </returns> /// <exception cref="WebException">An error occurred while downloading the resource. </exception> public static async Task <YouTubeUri[]> GetUrisAsync(string youTubeId, CancellationToken token) { var Urls = new List <YouTubeUri>(); string javaScriptCode = null; var response = await HttpGetAsync("https://www.youtube.com/watch?v=" + youTubeId + "&nomobile=1"); var match = Regex.Match(response, "url_encoded_fmt_stream_map\": ?\"(.*?)\""); var data = Uri.UnescapeDataString(match.Groups[1].Value); match = Regex.Match(response, "adaptive_fmts\": ?\"(.*?)\""); var data2 = Uri.UnescapeDataString(match.Groups[1].Value); var arr = Regex.Split(data + "," + data2, ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"); // split by comma but outside quotes foreach (var d in arr) { var url = ""; var signature = ""; var tuple = new YouTubeUri(); foreach (var p in d.Replace("\\u0026", "\t").Split('\t')) { var index = p.IndexOf('='); if (index != -1 && index < p.Length) { try { var key = p.Substring(0, index); var value = Uri.UnescapeDataString(p.Substring(index + 1)); if (key == "url") { url = value; } else if (key == "itag") { tuple.Itag = int.Parse(value); } else if (key == "type" && (value.Contains("video/mp4") || value.Contains("audio/mp4"))) { tuple.Type = value; } else if (key == "sig") { signature = value; } else if (key == "s") { if (javaScriptCode == null) { string javaScriptUri; var urlMatch = Regex.Match(response, "\"\\\\/\\\\/s.ytimg.com\\\\/yts\\\\/jsbin\\\\/html5player-(.+?)\\.js\""); if (urlMatch.Success) { javaScriptUri = "http://s.ytimg.com/yts/jsbin/html5player-" + urlMatch.Groups[1] + ".js"; } else { // new format javaScriptUri = "https://s.ytimg.com/yts/jsbin/player-" + Regex.Match(response, "\"\\\\/\\\\/s.ytimg.com\\\\/yts\\\\/jsbin\\\\/player-(.+?)\\.js\"").Groups[1] + ".js"; } javaScriptCode = await HttpGetAsync(javaScriptUri); } signature = YouTubeDecipherer.Decipher(value, javaScriptCode); } } catch (Exception exception) { Debug.WriteLine("YouTube parse exception: " + exception.Message); } } } if (!string.IsNullOrEmpty(url)) { if (url.Contains("&signature=") || url.Contains("?signature=")) { tuple.Uri = new Uri(url, UriKind.Absolute); } else { tuple.Uri = new Uri(url + "&signature=" + signature, UriKind.Absolute); } if (tuple.IsValid) { Urls.Add(tuple); } } } return(Urls.ToArray()); }
/// <summary>Returns all available URIs (audio-only and video) for the given YouTube ID. </summary> /// <returns>The <see cref="YouTubeUri"/>s of the video. </returns> /// <exception cref="WebException">An error occurred while downloading the resource. </exception> public static async Task<YouTubeUri[]> GetUrisAsync(string youTubeId, CancellationToken token) { var urls = new List<YouTubeUri>(); string javaScriptCode = null; var response = await HttpGetAsync("https://www.youtube.com/watch?v=" + youTubeId + "&nomobile=1"); var match = Regex.Match(response, "url_encoded_fmt_stream_map\": ?\"(.*?)\""); var data = Uri.UnescapeDataString(match.Groups[1].Value); match = Regex.Match(response, "adaptive_fmts\": ?\"(.*?)\""); var data2 = Uri.UnescapeDataString(match.Groups[1].Value); var arr = Regex.Split(data + "," + data2, ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"); // split by comma but outside quotes foreach (var d in arr) { var url = ""; var signature = ""; var tuple = new YouTubeUri(); foreach (var p in d.Replace("\\u0026", "\t").Split('\t')) { var index = p.IndexOf('='); if (index != -1 && index < p.Length) { try { var key = p.Substring(0, index); var value = Uri.UnescapeDataString(p.Substring(index + 1)); if (key == "url") url = value; else if (key == "itag") tuple.Itag = int.Parse(value); else if (key == "type" && (value.Contains("video/mp4") || value.Contains("audio/mp4"))) tuple.Type = value; else if (key == "sig") signature = value; else if (key == "s") { if (javaScriptCode == null) { var javaScriptUri = "http://s.ytimg.com/yts/jsbin/html5player-" + Regex.Match(response, "\"\\\\/\\\\/s.ytimg.com\\\\/yts\\\\/jsbin\\\\/html5player-(.+?)\\.js\"").Groups[1] + ".js"; javaScriptCode = await HttpGetAsync(javaScriptUri); } signature = GenerateSignature(value, javaScriptCode); } } catch (Exception exception) { Debug.WriteLine("YouTube parse exception: " + exception.Message); } } } if (url.Contains("&signature=") || url.Contains("?signature=")) tuple.Uri = new Uri(url, UriKind.Absolute); else tuple.Uri = new Uri(url + "&signature=" + signature, UriKind.Absolute); if (tuple.IsValid) urls.Add(tuple); } return urls.ToArray(); }
private static void OnHtmlDownloaded(HttpResponse response, YouTubeQuality quality, Action<YouTubeUri, Exception> completed) { if (response.Successful) { var urls = new List<YouTubeUri>(); try { //Debug.WriteLine("match = " + response.Response.ToString()); //var match = Regex.Match(response.Response, "url_encoded_fmt_stream_map=(.*?)(&|\")"); //var data = Uri.UnescapeDataString(match.Groups[1].Value); var match = Regex.Match(response.Response, @"url_encoded_fmt_stream_map\"":(.*)\"""); String a = match.Groups[1].Value; var data = a.Replace("\\u0026", "&"); var arr = data.Split(','); foreach (var d in arr) { var url = ""; var signature = ""; var tuple = new YouTubeUri(); foreach (var p in d.Split('&')) { var index = p.IndexOf('='); if (index != -1 && index < p.Length) { try { var key = p.Substring(0, index); var value = Uri.UnescapeDataString(p.Substring(index + 1)); if (key == "url") url = value; else if (key == "itag") tuple.Itag = int.Parse(value); else if (key == "type" && value.Contains("video/mp4")) tuple.Type = value; else if (key == "sig") signature = value; } catch { } } } tuple.url = url + "&signature=" + signature; if (tuple.IsValid) urls.Add(tuple); } var itag = GetQualityIdentifier(quality); foreach (var u in urls.Where(u => u.Itag > itag).ToArray()) urls.Remove(u); } catch (Exception ex) { if (completed != null) completed(null, ex); return; } Debug.WriteLine("entry = " + urls.OrderByDescending(u => u.Itag).FirstOrDefault().ToString()); var entry = urls.OrderByDescending(u => u.Itag).FirstOrDefault(); if (entry != null) { if (completed != null) completed(entry, null); } else if (completed != null) completed(null, new Exception("no_video_urls_found")); } else if (completed != null) completed(null, response.Exception); }
private static void OnHtmlDownloaded(HttpResponse response, YouTubeQuality minQuality, YouTubeQuality maxQuality, Action<YouTubeUri, Exception> completed) { if (response.Successful) { var urls = new List<YouTubeUri>(); try { var match = Regex.Match(response.Response, "url_encoded_fmt_stream_map\": \"(.*?)\""); var data = Uri.UnescapeDataString(match.Groups[1].Value); var arr = Regex.Split(data, ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"); // split by comma but outside quotes foreach (var d in arr) { var url = ""; var signature = ""; var tuple = new YouTubeUri(); foreach (var p in d.Replace("\\u0026", "\t").Split('\t')) { var index = p.IndexOf('='); if (index != -1 && index < p.Length) { try { var key = p.Substring(0, index); var value = Uri.UnescapeDataString(p.Substring(index + 1)); if (key == "url") url = value; else if (key == "itag") tuple.Itag = int.Parse(value); else if (key == "type" && value.Contains("video/mp4")) tuple.Type = value; else if (key == "sig") signature = value; } catch { } } } tuple.url = url + "&signature=" + signature; if (tuple.IsValid) urls.Add(tuple); } var minTag = GetQualityIdentifier(minQuality); var maxTag = GetQualityIdentifier(maxQuality); foreach (var u in urls.Where(u => u.Itag < minTag || u.Itag > maxTag).ToArray()) urls.Remove(u); } catch (Exception ex) { if (completed != null) completed(null, ex); return; } var entry = urls.OrderByDescending(u => u.Itag).FirstOrDefault(); if (entry != null) { if (completed != null) completed(entry, null); } else if (completed != null) completed(null, new Exception("no_video_urls_found")); } else if (completed != null) completed(null, response.Exception); }
private async Task<YouTubeUri> ParsingYouTubeUrl(HtmlNode node) { YouTubeUri uri = new YouTubeUri(); string linkVideo = node.Descendants("iframe").FirstOrDefault().Attributes["src"].Value; return await GetYouTubeYriForControl(linkVideo); }