как получить ссылку на скачивание видео с YouTube? - PullRequest
0 голосов
/ 30 ноября 2011

Я хочу скачать видео с 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; 
    }

Это не работает.

Не находит fmt_url_map= внутри ш

Так что теперь я могу сделать?

1 Ответ

2 голосов
/ 06 января 2012

Строка 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...