wulkau.de another useless blog…

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.

veröffentlicht unter: C# Kommentar schreiben
Kommentare (3) Trackbacks (0)
  1. Vielen Dank, sowas habe ich seid einem Monat gesucht ;)
    Du musst url aber noch mit youtubeurl ersetzten…

  2. Hey ,
    bei mir gibts einige probleme könntest du mir den sourcecode schicken BITTE ! ^^
    an scarvenge@web.de wenns recht ist ! danke

  3. 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);


Leave a comment

(required)

Noch keine Trackbacks.