26Jan/103
Mit C# YouTube Videos downloaden
YouTube Videos lassen sich recht einfach direkt als .flv oder .mp4 herunterladen und dann in ein belibiges Format umkonvertieren. Dabei möchte man das Ausgangsmaterial natürlich in möglichst hoher Qualität bekommen. Doch wie erkennt man die bestmögliche Qualistufe aus einem C# Programm heraus? Dazu nutzt man einfach die WebClient-Klasse um die entsprechende YouTube-Seite einmal zu requesten. Daraus lassen sich dann mittels einiger Regex-Anweisungen die benötigten Informationen filtern. Erforderlich ist zum einen die normale YouTubeID, sowie eine interne ID und ein Parameter für die gewünschte Qualität. Finden lassen sich diese Daten folgendermaßen:
string youtubeurl = "http://www.youtube.com/watch?v=I1qHVVbYG8Y";
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*\"([^\"]+)");
WebClient client = new WebClient();
string rawHtml = client.DownloadString(youtubeurl);
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);
string 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";
}
byte[] data = client.DownloadData(new Uri(dlurl));
File.WriteAllBytes("C:\\" + videotitle + "." + fileext), data);
Mehr Infos zu den YouTube Codecs gibts hier.
Februar 9th, 2010
Vielen Dank, sowas habe ich seid einem Monat gesucht
Du musst url aber noch mit youtubeurl ersetzten…
Mai 26th, 2010
Hey ,
bei mir gibts einige probleme könntest du mir den sourcecode schicken BITTE ! ^^
an scarvenge@web.de wenns recht ist ! danke
Februar 10th, 2012
Hey, vielen dank
Ich habe schon länger nach einer einfachen und guten Lösung gesucht.
Ich habe noch einen Fehler gefunden:
Es wurde eine Klammer übersehen. bzw zuviel hinzugefügt.
File.WriteAllBytes(“C:\\” + videotitle + “.” + fileext), data);
( ), )
( Zu klammern gehört immer ein Anfang ( und ein Ende ).
Bitte umändern in:
File.WriteAllBytes((“C:\\” + videotitle + “.” + fileext), data);
oder die zweite Klammer weglassen:
File.WriteAllBytes(“C:\\” + videotitle + “.” + fileext, data);