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);
}
}
}
}
あなたの "コピー"方法は間違っています - それより小さいものを読んでいても常に* buffer.Lengthバイトを書きます* –
代わりに何を使うことができますか? – user1200226
'Read'を呼び出すと、結果を覚えておく必要があります。そのため、呼び出し中に' while((bytesRead = buffer.Read(buffer、0、buffer.Length))> 0) 'と書くことができます。 .. –