Строка fmt_url_map больше не существует на youtube, и проблема в том, что youtube - постоянно развивающийся зверь. Тем не менее, в настоящее время это будет работать.
Строка, которую вы сейчас ищете, - это "url_encoded_fmt_stream_map", однако проще снова разделить на "url =".
Я потратил пару часов на тестирование этого сегодня, самая странная вещь - заставить строку flashvars корректно декодироваться.
string _url = string.Empty;
//Crazy string!
_url = Uri.UnescapeDataString(flashvars);
_url = HttpUtility.HtmlDecode(_url);
_url = HttpUtility.UrlDecode(_url);
_url = Uri.UnescapeDataString(_url);
Для чего требовалось дважды Uri.UnescapeDataString ()!
public string url(string url, string videoFormat)
{
HtmlAgilityPack.HtmlDocument hDoc = new HtmlDocument();
hDoc.Load(new WebClient().OpenRead(url));
HtmlNode node = hDoc.GetElementbyId("movie_player");
string flashvars = node.Attributes[5].Value;
string _url = string.Empty;
//Crazy string!
_url = Uri.UnescapeDataString(flashvars);
_url = HttpUtility.HtmlDecode(_url);
_url = HttpUtility.UrlDecode(_url);
_url = Uri.UnescapeDataString(_url);
string[] w = _url.Split(new[] {"url="}, StringSplitOptions.None);
string link = "";
if(!string.IsNullOrEmpty(videoFormat))
{
foreach (string t in w)
{
if(t.Contains("type=") && t.Contains(videoFormat))
{
link = t;
break;
}
}
}
else
{
link = w[1];
}
link += "&title=out";
System.Windows.MessageBox.Show(link);
Process.Start(link);
return link;
}
Таким образом, для некоторых бонусных баллов метод теперь принимает строку, в которой вы передаете требуемый формат видео: «mp4», «x-flv» или «webm».
И он больше не требует вашего метода getYoutubeHtml (), он загружает поток непосредственно из WebClient
HtmlAgilityPack.HtmlDocument hDoc = new HtmlDocument();
hDoc.Load(new WebClient().OpenRead(url));