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