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"]))); }
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); }
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) }); } }
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)); } }
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); } }