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

YouTube Downloader Using C# .NET

, 29 Jan 2015 CPOL
Rate this:
Please Sign up or sign in to vote.
Full C# code to download videos from YouTube in any quality.


YouTube changed again, but don't worry, i updated the downloader, now it's easier to understand the download class Smile | :)


This tip shows how to download YouTube videos using C# code only. The code is very simple to understand and anyone can easily integrate it 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 extension
    /// </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))
        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 string[] ExtractUrls(string html)
            var startIndexOfUrls = html.IndexOf("url_encoded_fmt_stream_map");
            html =  Helper.GetTxtBtwn(html, "url=", "\"", startIndexOfUrls);
            html = Uri.UnescapeDataString(html);
            var urls = Regex.Split(html, "url=");
            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 on your internet connection speed to start download.

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


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


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


About the Author

Software Developer Desktop Team
Palestinian Territory (Occupied) Palestinian Territory (Occupied)
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- 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 (
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#,,Ajax,Jquery)
Please visit my elance URL

Comments and Discussions

GeneralRe: Out of range - BugFix PinmemberDev Enthusiast29-Jan-15 11:06 
GeneralRe: Out of range - BugFix PinmemberakramKamal14hrs 12mins ago 
GeneralRe: Out of range - BugFix PinmemberChrisHellwig10hrs 19mins ago 
GeneralRe: Out of range - BugFix PinmemberDev Enthusiast22hrs 40mins ago 
GeneralRe: Out of range - BugFix PinmemberakramKamal14hrs 13mins ago 
Questioninfo out of range PinmemberMember 1132941128-Jan-15 11:49 
AnswerRe: info out of range PinmemberDev Enthusiast28-Jan-15 14:41 
QuestionIndexOutOfRange PinmemberReinhart Herzog27-Jan-15 20:47 
AnswerRe: IndexOutOfRange PinmemberakramKamal28-Jan-15 0:01 
GeneralRe: IndexOutOfRange PinmemberReinhart Herzog28-Jan-15 4:25 
GeneralRe: IndexOutOfRange PinmemberDev Enthusiast28-Jan-15 7:23 
BugIndex out of range PinmemberMember 1139233021-Jan-15 11:28 
QuestionIndex out of range PinmemberMember 1138763220-Jan-15 0:26 
QuestionCan you please tell me how the link for download the video is generating from Youtube URL? PinmemberMember 1096706418-Jan-15 5:41 
QuestionThank you PinmemberBaoSaka16-Jan-15 5:35 
QuestionERROR: Index was out of range. Pinmembertorontosky9-Jan-15 21:09 
AnswerRe: ERROR: Index was out of range. PinmemberMember 1137285913-Jan-15 12:29 
QuestionGreat job, thanks PinmemberMember 97746429-Jan-15 11:18 
QuestionHow to use this with windows phone 8 PinmemberMember 113470727-Jan-15 23:56 
SuggestionDownload via a proxy server PinmemberRene Vliex6-Jan-15 3:50 
QuestionIndex Out of Range PinmemberTsiDev02-Jan-15 19:53 
AnswerRe: Index Out of Range PinmemberDev Enthusiast7-Jan-15 20:39 
GeneralReally Great Pinmember3DExterior1-Jan-15 1:54 
GeneralRe: Really Great PinmemberakramKamal1-Jan-15 3:57 
QuestionTHIS WORK PinmemberMember 871442130-Dec-14 4:44 

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

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web03 | 2.8.150129.1 | Last Updated 30 Jan 2015
Article Copyright 2014 by akramKamal
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid