Click here to Skip to main content
Click here to Skip to main content

YouTube Downloader Using C# .NET

By , 18 Feb 2013
 

Thanks again to CircleDock the Downloader works better.

Introduction 

This article shows how to download YouTube videos using C# code only. The code is very simple to understand and anyone can easily integrate it to in their solution or project.

I didn't use any third party library to do this task. All you need is to take two .cs files and integrate them to your project.

Using the code

There are two main classes in this project:

YouTubeVideoQuality Class

This is the entity that describes the video.

public class YouTubeVideoQuality 
{
    /// <summary>
    /// Gets or Sets the file name
    /// </summary>
    public string VideoTitle { get; set; }
    /// <summary>
    /// Gets or Sets the file extention
    /// </summary>
    public string Extention { get; set; }
    /// <summary>
    /// Gets or Sets the file url
    /// </summary>
    public string DownloadUrl { get; set; }
    /// <summary>
    /// Gets or Sets the youtube video url
    /// </summary>
    public string VideoUrl { get; set; }
    /// <summary>
    /// Gets or Sets the file size
    /// </summary>
    public Size Dimension { get; set; }

    public override string ToString()
    {
        return Extention + " File " + Dimension.Width + 
                           "x" + Dimension.Height;
    }

    public void SetQuality(string Extention, Size Dimension)
    {
        this.Extention = Extention;
        this.Dimension = Dimension;
    }
}

YouTubeDownloader Class

This class downloads YouTube videos:

public class YouTubeDownloader
{
    public static List<YouTubeVideoQuality> GetYouTubeVideoUrls(params string[] VideoUrls)
    {
        List<YouTubeVideoQuality> urls = new List<YouTubeVideoQuality>();
        foreach (var VideoUrl in VideoUrls)
        {
            string html = Helper.DownloadWebPage(VideoUrl);
            string title = GetTitle(html);
            foreach (var videoLink in ExtractUrls(html))
            {
                YouTubeVideoQuality q = new YouTubeVideoQuality();
                q.VideoUrl = VideoUrl;
                q.VideoTitle = title;
                q.DownloadUrl = videoLink + "&title=" + title;
                if (getQuality(q))
                    urls.Add(q);
            }
        }
        return urls;
    }

    private static string GetTitle(string RssDoc)
    {
        string str14 = Helper.GetTxtBtwn(RssDoc, "'VIDEO_TITLE': '", "'", 0);
        if (str14 == "") str14 = Helper.GetTxtBtwn(RssDoc, "\"title\" content=\"", "\"", 0);
        if (str14 == "") str14 = Helper.GetTxtBtwn(RssDoc, "&title=", "&", 0);
        str14 = str14.Replace(@"\", "").Replace("'", "&#39;").Replace(
                "\"", "&quot;").Replace("<", "&lt;").Replace(
                ">", "&gt;").Replace("+", " ");
        return str14;
    }


    private static List<string> ExtractUrls(string html)
    {
        html = Uri.UnescapeDataString(Regex.Match(html, "url_encoded_fmt_stream_map=(.+?)&", 
                                      RegexOptions.Singleline).Groups[1].ToString());
        MatchCollection matchs = Regex.Matches(html, 
          "url=(.+?)&quality=(.+?)&fallback_host=(.+?)&type=(.+?)&itag=(.+?),", 
          RegexOptions.Singleline);
        bool firstTry = matchs.Count > 0;
        if (!firstTry)
            matchs = Regex.Matches(html, 
                     "itag=(.+?)&url=(.+?)&type=(.+?)&fallback_host=(.+?)&sig=(.+?)&quality=(.+?),{0,1}", 
                     RegexOptions.Singleline);
        List<string> urls = new List<string>();
        foreach (Match match in matchs)
        {
            if (firstTry)
                urls.Add(Uri.UnescapeDataString(match.Groups[1] + ""));
            else urls.Add(Uri.UnescapeDataString(match.Groups[2] + "") + "&signature=" + match.Groups[5]);
        }
        return urls;
    }

    private static bool getQuality(YouTubeVideoQuality q)
    {
        if (q.DownloadUrl.Contains("itag=5"))
            q.SetQuality("flv", new Size(320, 240));
        else if (q.DownloadUrl.Contains("itag=34"))
            q.SetQuality("flv", new Size(400, 226));
        else if (q.DownloadUrl.Contains("itag=6"))
            q.SetQuality("flv", new Size(480, 360));
        else if (q.DownloadUrl.Contains("itag=35"))
            q.SetQuality("flv", new Size(640, 380));
        else if (q.DownloadUrl.Contains("itag=18"))
            q.SetQuality("mp4", new Size(480, 360));
        else if (q.DownloadUrl.Contains("itag=22"))
            q.SetQuality("mp4", new Size(1280, 720));
        else if (q.DownloadUrl.Contains("itag=37"))
            q.SetQuality("mp4", new Size(1920, 1280));
        else if (q.DownloadUrl.Contains("itag=38"))
            q.SetQuality("mp4", new Size(4096, 72304));
        else return false;
        return true;
    }
}

Points of Interest

Using this code you can select the video quality depending in your internet connection speed to start download.

Many people have slow internet connections and they can not watch videos from YouTube, so I made this code to help those people to download YouTube videos to their PC's so they can watch the videos offline.

Updates

Thanks to Motaz Alnuweiri, the Downloader works again. Added self download videos.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

akramKamal
Software Developer Desktop Team
Palestinian Territory (Occupied) Palestinian Territory (Occupied)
Member
I have advanced skills in desktop apps development, i have built many apps for many corporations.
 
i'm using the follow languages in my work:
1- C# Language.
2- VB6 Language.
3- Asp.net using C#.
4- Crystal Reports.
 
i have more than 7 experience years in coding and programming.
 
Systems and apps Developed by Us:
1-E-Archive System (VB6,Supports multi DataBase Engins).
2-SMS System (Multi languages such VB6,C#,Asp.Net and Gizmox).
3-Multi Camera Monitor System-Motion Detection and record(C#).
4-Administrative Evaluation System (Asp.net).
5-E-Clinic System (C#-using my business layer generator,Supports multi DataBase Engines).
6-Data Access Layer Generator Framework(C#).
7-Sip Provider -VOIP- Softphone (C#- for Italian company).
8-Training course Manager System(C#-for UCAS).
9-Computer Exam System (VB6,Oracle DataBase).
10-Dialer System (VB6).
11-Implement Google API using C# (Translation and web Search).
12-Print Management Enterprise(C#)
13-Elections System (C#- using my business layer generator).
14-Advanced English competition (VB6).
15-Remote USB Sharing (C/C++,VB6).
16-Watch Attendance (C/C++,VB6).
17-Tube Spy (C#).
18-AdminYourTube (C#)
19- Transport Reservation System (C#,Asp.net,Ajax,Jquery)
 
Please visit my elance URL http://ashrafnet.elance.com

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
QuestionPermissionmemberJason Newland1 May '13 - 17:28 
AnswerRe: PermissionmemberakramKamal3 May '13 - 2:27 
QuestionYouTube frequent changesmembermarcus9230 Mar '13 - 23:31 
AnswerRe: YouTube frequent changesmemberakramKamal31 Mar '13 - 2:41 
GeneralRe: YouTube frequent changesmemberMember 87254597 May '13 - 15:11 
Questiondoes it support multi file download simultaneouslymemberTridip Bhattacharjee27 Mar '13 - 7:29 
AnswerRe: does it support multi file download simultaneouslymemberakramKamal27 Mar '13 - 10:20 
QuestionHow to Stop the Download, without closing the form?memberH4R024 Mar '13 - 7:35 
GeneralMy vote of 5membersource.compiler3 Mar '13 - 10:20 
GeneralMy vote of 3memberJasmine250125 Feb '13 - 7:41 
GeneralRe: My vote of 3membertomexxus25 Feb '13 - 8:20 
GeneralRe: My vote of 3memberakramKamal25 Feb '13 - 8:37 
GeneralRe: My vote of 3memberJasmine250125 Feb '13 - 9:52 
GeneralRe: My vote of 3memberakramKamal25 Feb '13 - 10:32 
GeneralRe: My vote of 3memberJasmine250125 Feb '13 - 11:18 
GeneralRe: My vote of 3memberRiz Thon25 Feb '13 - 17:10 
GeneralRe: My vote of 3memberJasmine250126 Feb '13 - 5:13 
GeneralRe: My vote of 3membersource.compiler3 Mar '13 - 10:21 
GeneralRe: My vote of 3memberJasmine25014 Mar '13 - 5:14 
GeneralRe: My vote of 3memberJason Newland2 May '13 - 19:31 
GeneralRe: My vote of 3memberJasmine25013 May '13 - 5:10 
GeneralRe: My vote of 3memberCircleDock26 Feb '13 - 6:11 
GeneralRe: My vote of 3memberJasmine250126 Feb '13 - 6:43 
GeneralRe: My vote of 3memberCircleDock26 Feb '13 - 19:09 
GeneralRe: My vote of 3memberJasmine250127 Feb '13 - 5:17 
GeneralRe: My vote of 3memberCircleDock28 Feb '13 - 20:20 
GeneralMy vote of 5memberJose David Pujo25 Feb '13 - 1:08 
GeneralMy vote of 5memberSruthiR24 Feb '13 - 23:49 
GeneralMy vote of 5memberĐinh Công Thắng20 Feb '13 - 15:31 
GeneralMy vote of 5memberRoss Kyle rawlins19 Feb '13 - 19:38 
Questionaprriciationmembermrk vishal19 Feb '13 - 6:56 
GeneralMy vote of 5mvpMichael Haephrati מיכאל האפרתי19 Feb '13 - 6:20 
Questioncan't download the source codememberitronen18 Feb '13 - 10:47 
BugReplacement getQuality() function [modified]memberCircleDock17 Feb '13 - 21:47 
SuggestionA codes for clicking download button...memberlllqqq16 Feb '13 - 15:05 
QuestionMy vote of 5memberNoel Buenaventura16 Feb '13 - 14:54 
BugResolution displayed incorectly in Quality settingmemberLogi Guna16 Feb '13 - 10:56 
GeneralRe: Resolution displayed incorectly in Quality settingmemberCircleDock17 Feb '13 - 21:33 
GeneralRe: Resolution displayed incorectly in Quality settingmemberLogi Guna17 Feb '13 - 23:40 
GeneralRe: Resolution displayed incorectly in Quality settingmemberCircleDock18 Feb '13 - 3:29 
GeneralMy vote of 5memberJohann Krenn15 Feb '13 - 23:08 
QuestionMy vote of 5memberbandi.ramesh15 Feb '13 - 20:46 
QuestionMy solution for the constant YouTube changes.memberTheFigmo15 Feb '13 - 5:20 
AnswerRe: My solution for the constant YouTube changes.memberCircleDock15 Feb '13 - 7:12 
GeneralRe: My solution for the constant YouTube changes.memberTheFigmo15 Feb '13 - 7:42 
GeneralRe: My solution for the constant YouTube changes.memberCircleDock15 Feb '13 - 22:37 
GeneralRe: My solution for the constant YouTube changes.memberTheFigmo16 Feb '13 - 3:20 
GeneralRe: My solution for the constant YouTube changes.memberRiz Thon25 Feb '13 - 17:02 
QuestionYouTubes' new changes break this codememberCircleDock14 Feb '13 - 7:47 
AnswerRe: YouTubes' new changes break this codememberakramKamal14 Feb '13 - 9:10 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130516.1 | Last Updated 18 Feb 2013
Article Copyright 2012 by akramKamal
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid