public bool TryNormalizeUrl(string url, out string normalizedUrl) { url = url.Trim(); url = url.Replace(_parserUrlSignatures[0], "youtube.com/watch?v="); url = url.Replace(_parserUrlSignatures[1], "youtube"); url = url.Replace(_parserUrlSignatures[2], "youtube.com/watch?v="); if (url.Contains("/v/")) { url = "http://youtube.com" + new Uri(url).AbsolutePath.Replace("/v/", "/watch?v="); } url = url.Replace("/watch#", "/watch?"); IDictionary <string, string> query = VideoHostingHelper.ParseQueryString(url); string v; if (!query.TryGetValue("v", out v)) { normalizedUrl = null; return(false); } normalizedUrl = "http://youtube.com/watch?v=" + v; return(true); }
private static IEnumerable <VideoHostingInfo> GetVideoInfos(IEnumerable <ExtractionInfo> extractionInfos, string videoTitle) { var downLoadInfos = new List <VideoHostingInfo>(); foreach (ExtractionInfo extractionInfo in extractionInfos) { string itag = VideoHostingHelper.ParseQueryString(extractionInfo.Uri.Query)["itag"]; int formatCode = int.Parse(itag); VideoHostingInfo info = VideoHostingInfo.Defaults.SingleOrDefault(videoInfo => videoInfo.FormatCode == formatCode); if (info != null) { info = new VideoHostingInfo(info) { DownloadUrl = extractionInfo.Uri.ToString(), Title = videoTitle, RequiresDecryption = extractionInfo.RequiresDecryption }; } else { info = new VideoHostingInfo(formatCode) { DownloadUrl = extractionInfo.Uri.ToString() }; } downLoadInfos.Add(info); } return(downLoadInfos); }
public IEnumerator DecryptDownloadUrl(VideoHostingInfo videoInfo, Action <VideoHostingInfo> completeCallback) { IDictionary <string, string> queries = VideoHostingHelper.ParseQueryString(videoInfo.DownloadUrl); if (queries.ContainsKey(SIGNATURE_QUERY)) { string encryptedSignature = queries[SIGNATURE_QUERY]; string decrypted; string jsUrl = string.Format("http://s.ytimg.com/yts/jsbin/player{0}.js", videoInfo.HtmlPlayerVersion); WWW www = new WWW(jsUrl); yield return(www); try { decrypted = DeciphererYoutube.DecipherWithVersion(www.text, encryptedSignature, videoInfo.HtmlPlayerVersion); } catch (Exception ex) { throw new Exception("Could not decipher signature", ex); } videoInfo.DownloadUrl = VideoHostingHelper.ReplaceQueryStringParameter(videoInfo.DownloadUrl, SIGNATURE_QUERY, decrypted); videoInfo.RequiresDecryption = false; if (completeCallback != null) { completeCallback(videoInfo); } } }
private static IEnumerable <ExtractionInfo> ExtractDownloadUrls(VideoHostingJson json) { string[] splitByUrls = (GetStreamMap(json) + ',' + GetAdaptiveStreamMap(json)).Split(','); foreach (string s in splitByUrls) { IDictionary <string, string> queries = VideoHostingHelper.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"], SIGNATURE_QUERY, signature); string fallbackHost = queries.ContainsKey("fallback_host") ? "&fallback_host=" + queries["fallback_host"] : String.Empty; url += fallbackHost; } else { url = queries["url"]; } url = VideoHostingHelper.UrlDecode(url); IDictionary <string, string> parameters = VideoHostingHelper.ParseQueryString(url); if (!parameters.ContainsKey(RATE_BYPASS_FLAG)) { url += string.Format("&{0}={1}", RATE_BYPASS_FLAG, "yes"); } yield return(new ExtractionInfo { RequiresDecryption = requiresDecryption, Uri = new Uri(url) }); } }