2012-02-09 3 views
1

Я изменил класс Youtube Downloader, написанный на C#, чтобы использовать его на телефоне Windows. Мой результат следующий. Но когда я называю dw(); Я получаю исключение File-not-found-out из веб-браузера в строке e.Result.Read (buffer, 0, buffer.Length). Я точно знаю, что это значит, но я не знаю, как это исправить. У меня есть 2 вопроса: почему мой код не работает? Или есть другой способ загрузить видео Youtube на WindowsPhone 7? (Как библиотека или бесплатный фрагмент кода ...) Спасибо.Youtube Класс не работает

class YoutubeDownload 
{ 
    string youtubeurl; 
    string fileext; 

    private WebClient webClient = new WebClient(); 

    public void dw() 
    { 
     youtubeurl = "http://www.youtube.com/watch?v=locIxsfpgp4&feature=related"; 
     webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted); 
     webClient.DownloadStringAsync(new Uri(youtubeurl)); 
    } 

    void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     string rawHtml = e.Result; 
     string getUrl = "http://www.youtube.com/get_video.php?video_id={0}&t={1}"; 
     Regex _titleRegex = new Regex("'VIDEO_TITLE': '(.+)',"); 
     Regex _qualiRegex = new Regex("\"fmt_map\": \"([0-9]{2})"); 
     Regex _idRegex = new Regex("\",\\s*\"t\":\\s*\"([^\"]+)"); 

     Match title = _titleRegex.Match(rawHtml); 
     Match id = _idRegex.Match(rawHtml); 
     Match quali = _qualiRegex.Match(rawHtml); 

     string videotitle = title.Groups[1].Value; 
     string videoid = youtubeurl.Substring(youtubeurl.IndexOf("?v=") + 3); 
     string id2 = id.Groups[1].Value.Replace("%3D", "="); 
     string dlurl = string.Format(getUrl, videoid, id2); 

     fileext = "flv"; 
     if (rawHtml.Contains("'IS_HD_AVAILABLE': true")) // 1080p/720p 
     { 
      dlurl += "&fmt=" + quali.Groups[1].Value; 
      fileext = "mp4"; 
     } 
     else 
     { 
      dlurl += "&fmt=" + quali.Groups[1].Value; 
      if (quali.Groups[1].Value == "18") // Medium 
      fileext = "mp4"; 
      else if (quali.Groups[1].Value == "17") // Mobile 
      fileext = "3gp"; 
     } 
     webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted); 
     webClient.OpenReadAsync(new Uri(dlurl)); 
    } 

    void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
    { 
     var file = IsolatedStorageFile.GetUserStoreForApplication(); 
     file.CreateDirectory("YoutubeDownloader"); 

     using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream("file." + fileext, System.IO.FileMode.Create, file)) 
     { 
      byte[] buffer = new byte[1024]; 
      while (e.Result.Read(buffer, 0, buffer.Length) > 0) 
      { 
       stream.Write(buffer, 0, buffer.Length); 
      } 
     } 
    } 
} 
+1

Помимо всего прочего, ваш метод «копирования» неверен - вы всегда * записываете 'buffer.Length' байты, даже если вы читаете меньше этого ... –

+0

Что я могу использовать вместо этого? – user1200226

+0

Когда вы вызываете 'Read', вы должны помнить результат, поэтому вы можете использовать его в вызове для записи:' while ((bytesRead = stream.Read (buffer, 0, buffer.Length))> 0) '. .. –

ответ

3

При копировании данных из результата изолированного хранения, вы всегда писать все содержимое буфера, сколько бы вы читали. Ваш цикл должен выглядеть следующим образом:

using (var stream = new IsolatedStorageFileStream("file." + fileext, 
                FileMode.Create, file)) 
{ 
    byte[] buffer = new byte[1024]; 
    int bytesRead; 
    while ((bytesRead = e.Result.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     stream.Write(buffer, 0, bytesRead); 
    } 
} 

(я не проверял, действительно ли все это было неправильно, но это звучит, как это помогло ...)

ОТКАЗ: Я работаю в Google, но я не имею понятия о законности любого из того, что вы делаете в отношении лицензии YouTube. Пожалуйста, не рассматривайте этот ответ как любое указание на мнение Google. Этот ответ - это чистое решение для какой-либо общей обработки потоков, насколько я могу судить.

+0

Продолжайте инвестировать в свои 401k. – paislee

Смежные вопросы