public string GetPlaybackUrl(string fmt) { if (PlaybackUrls.ContainsKey(fmt)) { return(PlaybackUrls[fmt]); } if (PlaybackUrls.Count > 0) { var enumerator = PlaybackUrls.GetEnumerator(); if (enumerator.MoveNext()) { return(enumerator.Current.Value); } } return(""); }
public void Get(string videoId) { //Init(); PlaybackUrls.Clear(); WebClient client = new WebClient(); client.CachePolicy = new System.Net.Cache.RequestCachePolicy(); client.UseDefaultCredentials = true; client.Proxy.Credentials = CredentialCache.DefaultCredentials; try { // string contents = client.DownloadString(string.Format("http://youtube.com/get_video_info?video_id={0}&has_verified=1", videoId)); //string[] elemest = System.Web.HttpUtility.UrlDecode(contents).Split('&'); string[] elemest = (contents).Split('&'); foreach (string s in elemest) { Items.Add(s.Split('=')[0], ReplaceJSon(s.Split('=')[1])); } Date = DateTime.Now; IsInited = true; if (!Items.ContainsKey("token")) { string site = ""; try { site = client.DownloadString(string.Format("http://www.youtube.com/watch?v={0}&has_verified=1", videoId)); } catch (Exception ex) { Log.Error("Error download info for video {0}", videoId); Log.Debug(ex.StackTrace); } //----- //Regex swfJsonArgs = // new Regex( // @"(?:var\s)?(?:swfArgs|'SWF_ARGS')\s*(?:=|\:)\s(?<json>\{.+\})|(?:\<param\sname=\\""flashvars\\""\svalue=\\""(?<params>[^""]+)\\""\>)|(flashvars=""(?<params>[^""]+)"")", // RegexOptions.Compiled | RegexOptions.CultureInvariant); Regex swfJsonArgs = new Regex( @"var swf = ""(?<vars>.*?)\}", RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.CultureInvariant); // Match m = swfJsonArgs.Match(site); if (m.Success) { if (m.Groups["vars"].Success) { string result = System.Web.HttpUtility.HtmlDecode(m.Groups["vars"].Value); Regex rx = new Regex(@"\\[uU]([0-9A-F]{4})"); result = rx.Replace(result, match => ((char)Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString()); NameValueCollection qscoll = HttpUtility.ParseQueryString(HttpUtility.HtmlDecode(result)); foreach (string s in qscoll.AllKeys) { if (Items.ContainsKey(s)) { } else { Items.Add(s, qscoll[s]); } } } else if (m.Groups["json"].Success) { //Items.Clear(); //foreach (var z in Newtonsoft.Json.Linq.JObject.Parse(m.Groups["json"].Value)) //{ // Items.Add(z.Key, z.Value.Value<string>(z.Key)); //} } } ArtistItem artistItem = ArtistManager.Instance.Grabber.GetFromVideoSite(site); ArtistManager.Instance.SitesCache.Add(new SiteContent { SIte = site, ArtistId = artistItem.Id, VideoId = videoId }); ArtistManager.Instance.AddArtist(artistItem); Regex regexObj = new Regex(", \"t\": \"(?<token>.*?)\"", RegexOptions.Singleline); Match matchResult = regexObj.Match(site); if (matchResult.Success) { Items.Add("token", matchResult.Groups["token"].Value); if (Items.ContainsKey("reason")) { Items.Remove("reason"); } } Regex regexObj1 = new Regex(", \"fmt_map\": \"(?<fmt_map>.*?)\", \"", RegexOptions.Singleline); Match matchResult1 = regexObj1.Match(site); if (matchResult1.Success) { Items.Add("fmt_map", matchResult1.Groups["fmt_map"].Value); } Regex regexObj2 = new Regex(", \"fmt_url_map\": \"(?<fmt_url_map>.*?)\", \"", RegexOptions.Singleline); Match matchResult2 = regexObj2.Match(site); if (matchResult2.Success) { Items.Add("fmt_url_map", matchResult2.Groups["fmt_url_map"].Value); } //fmt_url_map } else { if (ArtistManager.Instance.SitesCache.GetByVideoId(videoId) == null) { string site = client.DownloadString(string.Format("http://www.youtube.com/watch?v={0}", videoId)); ArtistItem artistItem = ArtistManager.Instance.Grabber.GetFromVideoSite(site); ArtistManager.Instance.SitesCache.Add(new SiteContent() { SIte = site, ArtistId = artistItem.Id, VideoId = videoId }); ArtistManager.Instance.AddArtist(artistItem); } } } catch (Exception ex) { Log.Error(ex); Init(); } //------------- if (Items.ContainsKey("url_encoded_fmt_stream_map") && Items.ContainsKey("fmt_list")) { string[] FmtUrlMap = Items["url_encoded_fmt_stream_map"].Split(','); string[] FmtList = Items["fmt_list"].Split(','); for (int i = 0; i < FmtUrlMap.Length; i++) { var urlOptions = HttpUtility.ParseQueryString(FmtUrlMap[i]); string type = urlOptions.Get("type"); if (!string.IsNullOrEmpty(type)) { type = Regex.Replace(type, @"; codecs=""[^""]*""", ""); type = type.Substring(type.LastIndexOfAny(new char[] { '/', '-' }) + 1); } string finalUrl = urlOptions.Get("url"); PlaybackUrls.Add(FmtList[i].Split('/')[0], finalUrl + "&ext=." + type.Replace("webm", "mkv")); } } }