2011-11-30 1419 views
0

我想从YouTube下载视频。我想如何从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; 
    } 

这不是work.ing

它没有找到fmt_url_map=瓦特

所以现在我能做什么里面?

+0

尝试转换[这个问题的回答(http://stackoverflow.com/questions/6015962/how-直接加载流这个解决方案不起作用。C# – Blender

+0

该解决方案不起作用。 – Vero009

+0

您是否已将其转换? – Blender

回答

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()方法,它从Web客户端

HtmlAgilityPack.HtmlDocument hDoc = new HtmlDocument(); 
    hDoc.Load(new WebClient().OpenRead(url)); 
+1

我知道这已经过了一年多了,正如你所说YouTube一直在变化。话虽如此,我认为这种方法不再适用。原因:flashvars变量是通过javascript生成的,“占位符”flashvars被编码的javascript字符串替换。检查一个YT视频的来源,并找到这个:'swf = swf.replace('__ flashvars__',encoded.join('&'));' – Anders