Пример #1
0
        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);
     }
 }
Пример #3
0
        /// <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());
        }
Пример #4
0
        /// <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();
        }
Пример #5
0
        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);
        }
Пример #6
0
		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);
		}
Пример #7
0
 private async Task<YouTubeUri> ParsingYouTubeUrl(HtmlNode node)
 {
     YouTubeUri uri = new YouTubeUri();
     string linkVideo = node.Descendants("iframe").FirstOrDefault().Attributes["src"].Value;
     return await GetYouTubeYriForControl(linkVideo);
 }