Youtube класс не работает - PullRequest
       4

Youtube класс не работает

1 голос
/ 09 февраля 2012

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

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 Ответ

3 голосов
/ 09 февраля 2012

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

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);
    }
}

(я не проверял, все ли это неправильно, но похоже, что это помогло ...)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...