2012-02-09 5 views
1

Windows Phoneで使用するためにC#で書かれたYoutube Downloaderクラスを変更しました。私の結果は次のとおりです。しかし、私がdw()を呼び出すと、 Webブラウザからe.Result.Read(buffer、0、buffer.Length)という行にFile-not-found-exceptionを取得します。私は確かにこれが意味することを知っているが、私はそれを修正する方法を知らない。だから私は2つの質問がある:なぜ私のコードは動作しませんか?または、WindowsPhone 7でYoutubeビデオをダウンロードする別の方法はありますか? (ライブラリや無料のコードスニペットのように...)ありがとう。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 = buffer.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

関連する問題