如何从YouTube获取视频下载链接?

时间:2011-11-30 18:04:02

标签: c# .net url 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; 
    }

这不起作用。

w

中找不到fmt_url_map=

现在我该怎么办?

1 个答案:

答案 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));