我想从YouTube下载视频。我想得到
http://www.youtube.com/watch?v=Fwa_GvIBH38&feature=feedrec_grec_index
要
http://o-o.preferred.btcl-dac1.v6.lscache4.c.youtube.com/videoplayback?sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Csource%2Calgorithm%2Cburst%2Cfactor%2Ccp&fexp=914016%2C904443&algorithm=throttle-factor&itag=34&ip=58.0.0.0&burst=40&sver=3&signature=82D07EBDBED8BC79D08AEE3F90B1473E44D4065E.88AB21BBB9E2D252B65FE6C419CD7867CDE8815C&source=youtube&expire=1322694000&key=yt1&ipbits=8&factor=1.25&cp=U0hRR1ZUUl9FSkNOMV9OTlZBOmRXLUt2VHYwWVY2&id=1706bf1af2011f7f&ptchn=collegehumor&ptk=collegehumor
我从IDM获得了上述链接。
我从网站上获得了两种方法来获得上述链接。
//this methods get's the download link for youtube videos in mp4 format.
public string url(string url)
{
string html = getYoutubeHtml(url);
HtmlAgilityPack.HtmlDocument hDoc = new HtmlDocument();
hDoc.LoadHtml(html);
HtmlNode node = hDoc.GetElementbyId("movie_player");
string flashvars = node.Attributes[5].Value;
string _url = Uri.UnescapeDataString(flashvars);
string[] w = _url.Split('&');
string link = "";
bool foundUrlMap = false;
for (int i = 0; i < w.Length; i++)
{
if (w[i].Contains("fmt_url_map="))
{
foundUrlMap = true;
link += w[i].Split('|')[1];
}
if (foundUrlMap)
{
//add the parameters to the url
link += "&" + w[i];
if (w[i].Contains("id="))
{
link = link.Split(',')[0];
//change the array index for different formats
break;
}
}
}
link = link.Split('|')[1] + "&title=out";
System.Windows.MessageBox.Show(link);
return link;
}
//this method downloads the html code from the youtube page.
private string getYoutubeHtml(string url)
{
string html = "";
WebRequest request = WebRequest.Create(url);
WebResponse response = request.GetResponse();
TextReader reader = new StreamReader(response.GetResponseStream());
string line = "";
while ((line = reader.ReadLine()) != null)
{
html += line;
}
return html;
}
这不起作用。
在 w
中找不到fmt_url_map=
现在我该怎么办?
答案 0 :(得分:2)
字符串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));