Youtube Video download

Halfbax

Erfahrenes Mitglied
Guten Tag,

ich versuche mich grad mittels folgenden Tutorial http://www.ecanarys.com/blog-entry/how-download-youtube-videos-using-net . Nun liegt folgendes Problem vor, ich bekomme zwar alle Daten, aber der Download Link ist leider leer, und somit auch meine Datei.

Kann das daran liegen, das Youtube auf HTML5 ungestiegen ist? Außerdem möchte ich das gerne ohne fertige API hinkriegen, da ich die Prozesse dahinter auch verstehe.

Mein Code:
Code:
using System;
using System.Collections.Specialized;
using System.ComponentModel;
using System.IO;
using System.Net;
using System.Text;
using System.Web;
using System.Web.UI.WebControls;
using System.Windows;

namespace YTGrabber
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void getData_Click(object sender, RoutedEventArgs e)
        {
            Uri videoUri = new Uri(videoLink.Text);
            string videoID = HttpUtility.ParseQueryString(videoUri.Query).Get("v");
            string videoInfoUrl = "http://www.youtube.com/get_video_info?video_id=" + videoID;

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(videoInfoUrl);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            Stream responseStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));

            string videoInfo = HttpUtility.HtmlDecode(reader.ReadToEnd());
            NameValueCollection videoParams = HttpUtility.ParseQueryString(videoInfo);

            if (videoParams["reason"] != null)
            {
                MessageBox.Show(videoParams["reason"], "An error has occurred", MessageBoxButton.OK);
                return;
            }

            string[] videoURLs = videoParams["url_encoded_fmt_stream_map"].Split(',');



            foreach (string vURL in videoURLs)
            {
                string sURL = HttpUtility.HtmlDecode(vURL);

                NameValueCollection urlParams = HttpUtility.ParseQueryString(sURL);
                string videoFormat = HttpUtility.HtmlDecode(urlParams["type"]);

                sURL = HttpUtility.HtmlDecode(urlParams["url"]);
                sURL += "&signature=" + HttpUtility.HtmlDecode(urlParams["sig"]);
                sURL += "&type=" + videoFormat;
                sURL += "&title=" + HttpUtility.HtmlDecode(videoParams["title"]);

                videoFormat = urlParams["quality"] + " - " + videoFormat.Split(';')[0].Split('/')[1];


                var item = new ListItem();
                item.Text = videoFormat;
                item.Value = sURL;

                cbTypes.Items.Add(item);
            }
            cbTypes.SelectedIndex = 0;

            getData.IsEnabled = false;
            startDownload.IsEnabled = true;
            cbTypes.Visibility = Visibility.Visible;
        }

        private void startDownload_Click(object sender, RoutedEventArgs e)
        {
            ListItem selecteditem = (ListItem)cbTypes.SelectedItem;
            string sURL = selecteditem.Value;

            if (string.IsNullOrEmpty(sURL))
            {
                MessageBox.Show("Unable to locate the Video.", "An error has occurred", MessageBoxButton.OK);
                return;
            }

            NameValueCollection urlParams = HttpUtility.ParseQueryString(sURL);

            string videoTitle = urlParams["title"] + " " + selecteditem.Text;
            string videoFormt = HttpUtility.HtmlDecode(urlParams["type"]);
            videoFormt = videoFormt.Split(';')[0].Split('/')[1];

            string sFilePath = string.Format(Path.Combine("D:\\{0}.{1}"), videoTitle, videoFormt);

            WebClient webClient = new WebClient();
            webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressChanged);
            webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadProgressCompleted);
            webClient.DownloadFileAsync(new Uri(sURL), @sFilePath);
         }

        private void DownloadProgressCompleted(object sender, AsyncCompletedEventArgs e)
        {
            MessageBox.Show("Video downloaded on: " + DateTime.Now.ToString());
        }

        private void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            pbProgress.Value = e.ProgressPercentage;
        }
    }
}
 
Hi

Seit 2013 ist nicht nur HTML5 mehr geworden, sondern die internen Schutzsachen von Youtube haben sich auch mehrmals geändert.

Was so Kurzlösungen außerdem an Problemen haben, sie funktionieren generell nicht für alle Videos.
Manchmal bekommt man zeitlich nur einen Teil, manchmal keinen Ton, wenn man Untertitel und/oder so Textblasen haben will steht man mit den Sachen sowieso immer an, usw.

Eine komplette und aktuelle Lösung, basierend auf Python, wäre hier: https://rg3.github.io/youtube-dl/
Und bevor man das alles nachprogrammiert, wäre einfach das fertige Programm aufrufen wahrscheinlich besser...
 
Zurück