lborgman / YoutubeExplode

The ultimate dirty YouTube library

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

YoutubeExplode

Build Coverage Version Downloads Donate

YoutubeExplode is a library that provides an interface to query metadata of YouTube videos, playlists and channels, as well as to resolve and download video streams and closed caption tracks. Behind a layer of abstraction, the library parses raw page content and uses reverse-engineered AJAX requests to retrieve information. As it doesn't use the official API, there's also no need for an API key and there are no usage quotas.

This library is used in YoutubeDownloader, a desktop application for downloading and converting YouTube videos.

Download

  • NuGet: dotnet add package YoutubeExplode

Features

  • Retrieves information about videos, playlists, channels, media streams and closed caption tracks
  • Handles all types of videos, including legacy, signed, restricted, non-embeddable and unlisted videos
  • Works with media streams of all types -- muxed, embedded adaptive, dash adaptive
  • Downloads videos by exposing their media content as a stream
  • Supports media stream seeking and segmentation to circumvent throttling
  • Parses and downloads closed caption tracks
  • All metadata properties are exposed using strong types and enums
  • Provides static methods to validate IDs and to parse IDs from URLs
  • Fully asynchronous API
  • Works with .NET Standard 2.0+, .NET Core 2.0+, .NET Framework 4.6.1+
  • No need for an API key and no usage quotas

Screenshots

demo

Usage

Getting metadata of a video

The following example shows how you can extract various metadata from a YouTube video:

var youtube = new YoutubeClient();

// You can specify video ID or URL
var video = await youtube.Videos.GetAsync("https://youtube.com/watch?v=bnsUkE8i0tU");

var title = video.Title; // "Infected Mushroom - Spitfire [Monstercat Release]"
var author = video.Author; // "Monstercat"
var duration = video.Duration; // 00:07:14

Downloading a video stream

Every YouTube video has a number of streams available. These streams may have different containers, video quality, bitrate, etc.

On top of that, depending on the content of the stream, the streams are further divided into 3 categories:

  • Muxed streams -- contain both video and audio.
  • Audio-only streams -- contain only audio.
  • Video-only streams -- contain only video.

You can request the stream manifest to get available streams for a particular video:

var youtube = new YoutubeClient();

var streamManifest = await youtube.Videos.Streams.GetManifestAsync("bnsUkE8i0tU");

Once you get the manifest, you can filter through the streams and choose the one you're interested in downloading:

// Get highest quality muxed stream
var streamInfo = streamManifest.GetMuxed().WithHighestVideoQuality();

// ...or highest bitrate audio-only stream
var streamInfo = streamManifest.GetAudioOnly().WithHighestBitrate();

// ...or highest quality MP4 video-only stream
var streamInfo = streamManifest
    .GetVideoOnly()
    .Where(s => s.Container == Container.Mp4)
    .WithHighestVideoQuality()

Finally, you can get the actual Stream object represented by the metadata:

// Get the actual stream
var stream = await youtube.Videos.Streams.GetAsync(streamInfo);

// Download the stream to file
await youtube.Videos.Streams.DownloadAsync(streamInfo, $"video.{streamInfo.Container}");

While it may be tempting to just always use muxed streams, it's important to note that they are limited in quality. Muxed streams don't go beyond 720p30.

If you want to download the video in maximum quality, you need to download the audio-only and video-only streams separately and then mux them together on your own. There are tools like FFmpeg that let you do that. You can also use YoutubeExplode.Converter which wraps FFmpeg and provides an extension point for YoutubeExplode to download videos directly.

Working with playlists

Among other things, YoutubeExplode also supports playlists:

var youtube = new YoutubeClient();

// Get playlist metadata
var playlist = await youtube.Playlists.GetAsync("PLQLqnnnfa_fAkUmMFw5xh8Kv0S5voEjC9");

var title = playlist.Title; // "Igorrr - Hallelujah"
var author = playlist.Author; // "randomusername604"

// Enumerate through playlist videos
await foreach (var video in youtube.Playlists.GetVideosAsync(playlist.Id))
{
    var videoTitle = video.Title;
    var videoAuthor = video.Author;
}

// Get all playlist videos
var playlistVideos = await youtube
    .Playlists
    .GetVideosAsync(playlist.Id)
    .BufferAsync();

// Get first 20 playlist videos
var somePlaylistVideos = await youtube
    .Playlists
    .GetVideosAsync(playlist.Id)
    .BufferAsync(20);

Extracting closed captions

Similarly to streams, you can extract closed captions by getting the manifest and choosing the track you're interested in:

var youtube = new YoutubeClient();

var trackManifest = await youtube.Videos.ClosedCaptions.GetManifestAsync("_QdPW8JrYzQ");

// Select a closed caption track in English
var trackInfo = trackManifest.TryGetByLanguage("en");

if (trackInfo != null)
{
    // Get the actual closed caption track
    var track = await youtube.Videos.ClosedCaptions.GetAsync(trackInfo);

    // Get the caption displayed at 1:01
    var caption = track.TryGetByTime(TimeSpan.FromSeconds(61));
    var text = caption?.Text; // "And the game was afoot."
}

You can also download closed caption tracks as SRT files:

var trackInfo = trackManifest.TryGetByLanguage("en");

if (trackInfo != null)
{
    await youtube.Videos.ClosedCaptions.DownloadAsync(trackInfo, "cc_track.srt");
}

Etymology

The "Explode" in YoutubeExplode comes from the name of a PHP function that splits up strings, explode(). When I was just starting development on this library, most of the reference source code I read was written in PHP, hence the inspiration for the name.

About

The ultimate dirty YouTube library

License:Other


Languages

Language:C# 100.0%