private static IEnumerable <Uri> ExtractDownloadUrls(JObject json)
        {
            string[] splitByUrls            = GetStreamMap(json).Split(',');
            string[] adaptiveFmtSplitByUrls = GetAdaptiveStreamMap(json).Split(',');
            splitByUrls = splitByUrls.Concat(adaptiveFmtSplitByUrls).ToArray();

            foreach (string s in splitByUrls)
            {
                IDictionary <string, string> queries = HttpHelper.ParseQueryString(s);
                string url;

                if (queries.ContainsKey("s") || queries.ContainsKey("sig"))
                {
                    string signature = queries.ContainsKey("s") ? queries["s"] : queries["sig"];

                    url = string.Format("{0}&{1}={2}", queries["url"], SignatureQuery, signature);

                    string fallbackHost = queries.ContainsKey("fallback_host") ? "&fallback_host=" + queries["fallback_host"] : String.Empty;

                    url += fallbackHost;
                }

                else
                {
                    url = queries["url"];
                }

                url = HttpHelper.UrlDecode(url);
                url = HttpHelper.UrlDecode(url);

                yield return(new Uri(url));
            }
        }
        private static YoutubeModel LoadModel(string videoUrl)
        {
            var videoId = videoUrl.Replace("https://youtube.com/watch?v=", "");
            var url     = $"https://www.youtube.com/get_video_info?video_id={videoId}&eurl=https://youtube.googleapis.com/v/{videoId}";

            return(YoutubeModel.FromJson(HttpHelper.UrlDecode(HttpHelper.ParseQueryString(HttpHelper.DownloadString(url))["player_response"])));
        }
Пример #3
0
        private static IEnumerable <Uri> ExtractDownloadUrls(string source)
        {
            string urlMap            = HttpHelper.ParseQueryString(source)["url_encoded_fmt_stream_map"];
            string adaptiveFmtUrlMap = HttpHelper.ParseQueryString(source)["adaptive_fmts"];

            string[] splitByUrls            = urlMap.Split(',');
            string[] adaptiveFmtSplitByUrls = adaptiveFmtUrlMap.Split(',');
            splitByUrls = splitByUrls.Concat(adaptiveFmtSplitByUrls).ToArray();

            foreach (string s in splitByUrls)
            {
                IDictionary <string, string> queries = HttpHelper.ParseQueryString(s);
                string url;

                if (queries.ContainsKey("s") || queries.ContainsKey("sig"))
                {
                    string signature = queries.ContainsKey("s") ? queries["s"] : queries["sig"];

                    url = string.Format("{0}&signature={1}", queries["url"], signature);

                    string fallbackHost = queries.ContainsKey("fallback_host") ? "&fallback_host=" + queries["fallback_host"] : String.Empty;

                    url += fallbackHost;
                }
                else
                {
                    url = queries["url"];
                }

                url = HttpHelper.UrlDecode(url);
                url = HttpHelper.UrlDecode(url);

                yield return(new Uri(url));
            }
        }
        private static YoutubeModel LoadModel(string videoUrl)
        {
            var videoId = videoUrl.Replace("https://youtube.com/watch?v=", "");

            var url = $"https://www.youtube.com/watch?v={videoId}&gl=US&hl=en&has_verified=1&bpctr=9999999999";

            var pageSource      = HttpHelper.DownloadString(url);
            var player_response = string.Empty;

            if (Regex.IsMatch(pageSource, @"[""\']status[""\']\s*:\s*[""\']LOGIN_REQUIRED"))
            {
                url             = $"https://www.youtube.com/get_video_info?video_id={videoId}&eurl=https://youtube.googleapis.com/v/{videoId}";
                pageSource      = HttpHelper.DownloadString(url);
                player_response = HttpHelper.ParseQueryString(pageSource)["player_response"];
                player_response = HttpHelper.UrlDecode(player_response);

                return(YoutubeModel.FromJson(player_response));
            }

            var dataRegex = new Regex(@"ytplayer\.config\s*=\s*(\{.+?\});", RegexOptions.Multiline);
            var dataMatch = dataRegex.Match(pageSource);

            if (dataMatch.Success)
            {
                string extractedJson = dataMatch.Result("$1");
                if (!extractedJson.Contains("raw_player_response:ytInitialPlayerResponse")) //https://www.youtube.com/watch?v=9Y7TRMISkGE
                {
                    player_response = JObject.Parse(extractedJson)["args"]["player_response"].ToString();
                    return(YoutubeModel.FromJson(player_response));
                }
            }

            dataRegex = new Regex(@"ytInitialPlayerResponse\s*=\s*({.+?})\s*;\s*(?:var\s+meta|</script|\n)", RegexOptions.Multiline);
            dataMatch = dataRegex.Match(pageSource);
            if (dataMatch.Success)
            {
                player_response = dataMatch.Result("$1");

                return(YoutubeModel.FromJson(player_response));
            }

            dataRegex = new Regex(@"ytInitialPlayerResponse\s*=\s*({.+?})\s*;", RegexOptions.Multiline);
            dataMatch = dataRegex.Match(pageSource);
            if (dataMatch.Success)
            {
                player_response = dataMatch.Result("$1");

                return(YoutubeModel.FromJson(player_response));
            }

            ThrowYoutubeParseException(new VideoNotAvailableException("Unable to extract video data"), videoUrl);
            return(null);
        }
Пример #5
0
        public static IDictionary <string, string> ParseQueryString(string s)
        {
            if (((string)s).Contains("?"))
            {
                s = ((string)s).Substring(((string)s).IndexOf('?') + 1);
            }
            Dictionary <string, string> dictionary = new Dictionary <string, string>();

            foreach (string input in Regex.Split(s, "&"))
            {
                string[] strArray = Regex.Split(input, "=");
                dictionary.Add(strArray[0], strArray.Length == 2 ? HttpHelper.UrlDecode(strArray[1]) : string.Empty);
            }
            return((IDictionary <string, string>)dictionary);
        }
        private static IEnumerable <ExtractionInfo> ExtractDownloadUrls(JObject json)
        {
            string[] splitByUrls            = GetStreamMap(json).Split(',');
            string[] adaptiveFmtSplitByUrls = GetAdaptiveStreamMap(json).Split(',');
            if (!string.IsNullOrWhiteSpace(adaptiveFmtSplitByUrls[0]))
            {
                splitByUrls = splitByUrls.Concat(adaptiveFmtSplitByUrls).Distinct().ToArray();
            }

            foreach (string s in splitByUrls)
            {
                IDictionary <string, string> queries = HttpHelper.ParseQueryString(s);
                string url;

                bool requiresDecryption = false;

                if (queries.ContainsKey("s") || queries.ContainsKey("sig"))
                {
                    requiresDecryption = queries.ContainsKey("s");
                    string signature = queries.ContainsKey("s") ? queries["s"] : queries["sig"];

                    url = string.Format("{0}&{1}={2}", queries["url"], SignatureQuery, signature);

                    string fallbackHost = queries.ContainsKey("fallback_host") ? "&fallback_host=" + queries["fallback_host"] : String.Empty;

                    url += fallbackHost;
                }

                else
                {
                    url = queries["url"];
                }

                url = HttpHelper.UrlDecode(url);
                url = HttpHelper.UrlDecode(url);

                IDictionary <string, string> parameters = HttpHelper.ParseQueryString(url);
                if (!parameters.ContainsKey(RateBypassFlag))
                {
                    url += string.Format("&{0}={1}", RateBypassFlag, "yes");
                }

                yield return(new ExtractionInfo {
                    RequiresDecryption = requiresDecryption, Uri = new Uri(url)
                });
            }
        }
Пример #7
0
        private static IEnumerable <Uri> ExtractDownloadUrls(string source)
        {
            string urlMap = HttpHelper.ParseQueryString(source)["url_encoded_fmt_stream_map"];

            string[] splitByUrls = urlMap.Split(',');

            foreach (string s in splitByUrls)
            {
                IDictionary <string, string> queries = HttpHelper.ParseQueryString(s);
                string signature = queries.ContainsKey("s") ? DecryptSignature(queries["s"]) : queries["sig"];

                string url = string.Format("{0}&fallback_host={1}&signature={2}", queries["url"], queries["fallback_host"], signature);

                url = HttpHelper.UrlDecode(url);
                url = HttpHelper.UrlDecode(url);

                yield return(new Uri(url));
            }
        }
Пример #8
0
 private static IEnumerable <DownloadUrlResolver.ExtractionInfo> ExtractDownloadUrls(JObject json)
 {
     string[] strArray = (string[])Enumerable.ToArray <string>(Enumerable.Concat <string>(((string)DownloadUrlResolver.GetStreamMap(json)).Split((char[])new char[1]
     {
         ','
     }), ((string)DownloadUrlResolver.GetAdaptiveStreamMap(json)).Split((char[])new char[1]
     {
         ','
     })));
     for (int index = 0; index < strArray.Length; ++index)
     {
         IDictionary <string, string> queryString = HttpHelper.ParseQueryString(strArray[index]);
         bool   flag = false;
         string url;
         if (queryString.ContainsKey("s") || queryString.ContainsKey("sig"))
         {
             flag = queryString.ContainsKey("s");
             string str = queryString.ContainsKey("s") ? queryString["s"] : queryString["sig"];
             url = string.Concat(string.Format("{0}&{1}={2}", queryString["url"], "signature", str), queryString.ContainsKey("fallback_host") ? string.Concat("&fallback_host=", queryString["fallback_host"]) : string.Empty);
         }
         else
         {
             url = queryString["url"];
         }
         string str1 = HttpHelper.UrlDecode(HttpHelper.UrlDecode(url));
         if (!HttpHelper.ParseQueryString(str1).ContainsKey("ratebypass"))
         {
             str1 = string.Concat(str1, string.Format("&{0}={1}", "ratebypass", "yes"));
         }
         DownloadUrlResolver.ExtractionInfo extractionInfo = new DownloadUrlResolver.ExtractionInfo();
         extractionInfo.RequiresDecryption = flag;
         Uri uri = new Uri(str1);
         extractionInfo.Uri = uri;
         yield return(extractionInfo);
     }
     strArray = (string[])null;
 }
        private static IEnumerable <VideoInfo> GetVideoInfos(YoutubeModel model)
        {
            var streamingFormats = GetStreamMap(model);

            if (streamingFormats == null)
            {
                streamingFormats = new List <Format>();
            }

            var adaptiveStream = GetAdaptiveStreamMap(model);

            if (adaptiveStream != null)
            {
                streamingFormats.AddRange(adaptiveStream);
            }

            foreach (var fmt in streamingFormats)
            {
                if (!fmt.Itag.HasValue)
                {
                    continue;
                }

                var itag = (int)fmt.Itag.Value;

                VideoInfo videoInfo = VideoInfo.Defaults.SingleOrDefault(info => info.FormatCode == itag);

                videoInfo = videoInfo ?? new VideoInfo(itag);

                if (!string.IsNullOrEmpty(fmt.Url))
                {
                    videoInfo.DownloadUrl = HttpHelper.UrlDecode(HttpHelper.UrlDecode(fmt.Url));
                }
                else if (!string.IsNullOrEmpty(fmt.Cipher) || !string.IsNullOrEmpty(fmt.SignatureCipher))
                {
                    IDictionary <string, string> cipher = null;

                    if (!string.IsNullOrEmpty(fmt.Cipher))
                    {
                        cipher = HttpHelper.ParseQueryString(fmt.Cipher);
                    }
                    if (!string.IsNullOrEmpty(fmt.SignatureCipher))
                    {
                        cipher = HttpHelper.ParseQueryString(fmt.SignatureCipher);
                    }

                    if (!cipher.ContainsKey("url"))
                    {
                        continue;
                    }
                    if (!cipher.ContainsKey("s"))
                    {
                        continue;
                    }

                    var url = cipher["url"];
                    var sig = cipher["s"];

                    url = HttpHelper.UrlDecode(url);
                    url = HttpHelper.UrlDecode(url);

                    sig = HttpHelper.UrlDecode(sig);
                    sig = HttpHelper.UrlDecode(sig);

                    url = url.Replace("&s=", "&sig=");
                    videoInfo.DownloadUrl        = HttpHelper.ReplaceQueryStringParameter(url, SignatureQuery, sig);
                    videoInfo.RequiresDecryption = true;
                }
                else
                {
                    continue;
                }

                if (!HttpHelper.ParseQueryString(videoInfo.DownloadUrl).ContainsKey(RateBypassFlag))
                {
                    videoInfo.DownloadUrl = string.Concat(videoInfo.DownloadUrl, string.Format("&{0}={1}", "ratebypass", "yes"));
                }

                if (fmt.AudioSampleRate.HasValue)
                {
                    videoInfo.AudioBitrate = (int)fmt.AudioSampleRate.Value;
                }

                if (fmt.ContentLength.HasValue)
                {
                    videoInfo.FileSize = (int)fmt.ContentLength.Value;
                }

                if (!string.IsNullOrEmpty(fmt.QualityLabel))
                {
                    videoInfo.FormatNote = fmt.QualityLabel;
                }
                else
                {
                    videoInfo.FormatNote = fmt.Quality;
                }

                if (fmt.Fps.HasValue)
                {
                    videoInfo.FPS = (int)fmt.Fps.Value;
                }

                if (fmt.Height.HasValue)
                {
                    videoInfo.Height = (int)fmt.Height.Value;
                }

                if (fmt.Width.HasValue)
                {
                    videoInfo.Width = (int)fmt.Width.Value;
                }

                // bitrate for itag 43 is always 2147483647
                if (itag != 43)
                {
                    if (fmt.AverageBitrate.HasValue)
                    {
                        videoInfo.AverageBitrate = fmt.AverageBitrate.Value / 1000f;
                    }
                    else if (fmt.Bitrate.HasValue)
                    {
                        videoInfo.AverageBitrate = fmt.Bitrate.Value / 1000f;
                    }
                }

                if (fmt.Height.HasValue)
                {
                    videoInfo.Height = (int)fmt.Height.Value;
                }

                if (fmt.Width.HasValue)
                {
                    videoInfo.Width = (int)fmt.Width.Value;
                }

                yield return(videoInfo);
            }
        }