YoutubeExplode alternatives and similar packages
Based on the "Misc" category.
Alternatively, view YoutubeExplode alternatives based on common mentions on social networks and blogs.
-
Polly
Polly is a .NET resilience and transient-fault-handling library that allows developers to express policies such as Retry, Circuit Breaker, Timeout, Bulkhead Isolation, and Fallback in a fluent and thread-safe manner. From version 6.0.1, Polly targets .NET Standard 1.1 and 2.0+. -
FluentValidation
A popular .NET validation library for building strongly-typed validation rules. -
Humanizer
Humanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities -
Edge.js
Run .NET and Node.js code in-process on Windows, MacOS, and Linux -
ReactJS.NET
.NET library for JSX compilation and server-side rendering of React components -
Rant
The Rant Procedural Text Generation DSL http://berkin.me/rant/ -
ScriptCS
Write C# apps with a text editor, nuget and the power of Roslyn! -
Hashids.net
A small .NET package to generate YouTube-like hashes from one or many numbers. Use hashids when you do not want to expose your database ids to the user. -
Coravel
Near-zero config .NET Core micro-framework that makes advanced application features like Task Scheduling, Caching, Queuing, Event Broadcasting, and more a breeze! -
Scientist.NET
A .NET library for carefully refactoring critical paths. It's a port of GitHub's Ruby Scientist library -
Enums.NET
Enums.NET is a high-performance type-safe .NET enum utility library -
WorkflowEngine
WorkflowEngine.NET - component that adds workflow in your application. It can be fully integrated into your application, or be in the form of a specific service (such as a web service). -
HidLibrary
This library enables you to enumerate and communicate with Hid compatible USB devices in .NET. -
Warden
Define "health checks" for your applications, resources and infrastructure. Keep your Warden on the watch. -
Jot
Jot is a library for persisting and applying .NET application state. -
Aeron.NET
Efficient reliable UDP unicast, UDP multicast, and IPC message transport - .NET port of Aeron -
DeviceId
A simple library providing functionality to generate a 'device ID' that can be used to uniquely identify a computer. -
Streams
A lightweight F#/C# library for efficient functional-style pipelines on streams of data. -
ByteSize
ByteSize is a utility class that makes byte size representation in code easier by removing ambiguity of the value being represented. ByteSize is to bytes what System.TimeSpan is to time. -
Mediator.Net
A simple mediator for .Net for sending command, publishing event and request response with pipelines supported -
Jering.Javascript.NodeJS
Invoke Javascript in NodeJS, from C# -
Valit
Valit is dead simple validation for .NET Core. No more if-statements all around your code. Write nice and clean fluent validators instead! -
LINQPad.QueryPlanVisualizer
SQL Server and PostgreSQL query execution plan visualizer for LINQPad -
SolidSoils4Arduino
C# .NET - Arduino library supporting simultaneous serial ASCII, Firmata and I2C communication -
FormHelper
ASP.NET Core - Transform server-side validations to client-side without writing any javascript code. (Compatible with Fluent Validation) -
https://github.com/minhhungit/ConsoleTableExt
A fluent library to print out a nicely formatted table in a console application C# -
Shielded
A strict and mostly lock-free Software Transactional Memory (STM) for .NET -
SystemWrapper
.NET library for easier testing of system APIs. -
DeviceDetector.NET
The Universal Device Detection library will parse any User Agent and detect the browser, operating system, device used (desktop, tablet, mobile, tv, cars, console, etc.), brand and model. -
Validot
Validot is a performance-first, compact library for advanced model validation. Using a simple declarative fluent interface, it efficiently handles classes, structs, nested members, collections, nullables, plus any relation or combination of them. It also supports translations, custom logic extensions with tests, and DI containers. -
Outcome.NET
Never write a result wrapper again! Outcome.NET is a simple, powerful helper for methods that return a value, but sometimes also need to return validation messages, warnings, or a success bit. -
RecordParser
Zero Allocation Writer/Reader Parser for .NET Core -
FlatMapper
FlatMapper is a library to import and export data from and to plain text files. -
NIdenticon
NIdenticon is a library for creating simple Identicons -
NaturalSort.Extension
π Extension method for StringComparison that adds support for natural sorting (e.g. "abc1", "abc2", "abc10" instead of "abc1", "abc10", "abc2"). -
AzureCrawler
Take HTML Snapshots for your Angular, Ember, Durandal or any JavaScript applications -
BerTlv.NET
A library for parsing BER TLV data (like EMV credit cards). -
trybot
A transient fault handling framework including such resiliency solutions as Retry, Timeout, Fallback, Rate Limit and Circuit Breaker. -
AdaskoTheBeAsT.FluentValidation.MediatR
FluentValidation behavior for MediatR
Deliver Cleaner and Safer Code - Right in Your IDE of Choice!
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of YoutubeExplode or a related project?
README
YoutubeExplode
π‘ Project status: maintenance mode[?]
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 requests to retrieve information. As it doesn't rely on 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 YouTube videos.
Terms of use
By using this project or its source code, for any purpose and in any shape or form, you grant your implicit agreement to all the following statements:
- You condemn Russia and its military aggression against Ukraine
- You recognize that Russia is an occupant that unlawfully invaded a sovereign state
- You support Ukraine's territorial integrity, including its claims over temporarily occupied territories of Crimea and Donbas
- You reject false narratives perpetuated by Russian state propaganda
To learn more about the war and how you can help, click here. Glory to Ukraine! πΊπ¦
Install
- π¦ NuGet:
dotnet add package YoutubeExplode
(main package) - π¦ NuGet:
dotnet add package YoutubeExplode.Converter
(FFmpeg integration)
Screenshots
[demo](.assets/demo.png)
Usage
YoutubeExplode exposes its functionality through a single entry point β the YoutubeClient
class.
Create an instance of this class and use the provided operations on Videos
, Playlists
, Channels
, and Search
properties to send requests.
Videos
Retrieving video metadata
To retrieve metadata associated with a YouTube video, call Videos.GetAsync(...)
:
using YoutubeExplode;
var youtube = new YoutubeClient();
// You can specify both video ID or URL
var video = await youtube.Videos.GetAsync("https://youtube.com/watch?v=u_yIGGhubZs");
var title = video.Title; // "Collections - Blender 2.80 Fundamentals"
var author = video.Author.ChannelTitle; // "Blender"
var duration = video.Duration; // 00:07:20
Downloading video streams
Every YouTube video has a number of streams available, differing in containers, video quality, bit rate, frame rate, and other properties. Additionally, 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 manifest that lists all available streams for a particular video by calling Videos.Streams.GetManifestAsync(...)
:
using YoutubeExplode;
var youtube = new YoutubeClient();
var streamManifest = await youtube.Videos.Streams.GetManifestAsync("u_yIGGhubZs");
Once you get the manifest, you can filter through the streams and select the ones you're interested in:
using YoutubeExplode;
using YoutubeExplode.Videos.Streams;
// ...
// Get highest quality muxed stream
var streamInfo = streamManifest.GetMuxedStreams().GetWithHighestVideoQuality();
// ...or highest bitrate audio-only stream
var streamInfo = streamManifest.GetAudioOnlyStreams().GetWithHighestBitrate();
// ...or highest quality MP4 video-only stream
var streamInfo = streamManifest
.GetVideoOnlyStreams()
.Where(s => s.Container == Container.Mp4)
.GetWithHighestVideoQuality()
Finally, you can resolve the actual stream represented by the specified metadata using Videos.Streams.GetAsync(...)
or download it directly to a file with Videos.Streams.DownloadAsync(...)
:
// ...
// Get the actual stream
var stream = await youtube.Videos.Streams.GetAsync(streamInfo);
// Download the stream to a file
await youtube.Videos.Streams.DownloadAsync(streamInfo, $"video.{streamInfo.Container}");
β οΈ Muxed streams contain both audio and video, but these streams are very limited in quality (up to 720p30). To download video in the highest available quality, you need to resolve the best audio-only and video-only streams separately and then mux them together. This can be accomplished by using the YoutubeExplode.Converter package (see below).
Downloading video with muxing or conversion
β οΈ Downloading with muxing or conversion requires YoutubeExplode.Converter.
β οΈ This package also relies on FFmpeg CLI, which can be downloaded here. Ensure that the FFmpeg binary is located in your application's probe directory or on the system's
PATH
, or use one of the overloads to provide a custom location directly.
You can download a video with muxing or conversion through one of the extension methods provided on VideoClient
.
For example, to download a video in the specified format using the highest quality streams, simply call DownloadAsync(...)
with the video ID and the destination file path:
using YoutubeExplode;
using YoutubeExplode.Converter;
var youtube = new YoutubeClient();
await youtube.Videos.DownloadAsync("https://youtube.com/watch?v=u_yIGGhubZs", "video.mp4");
Under the hood, this resolves the video's media streams and selects the best candidates based on format, bit rate, quality, and frame rate.
If the specified output format is a known audio-only container (e.g. mp3
or ogg
) then only the audio stream is downloaded.
β οΈ Stream muxing is a CPU-heavy process. You can reduce resource usage and execution time by using streams that don't require transcoding to the output format (e.g.
mp4
audio/video streams formp4
output format). Currently, YouTube only provides adaptive streams inmp4
orwebm
containers, with the highest quality video streams (e.g. 4K) only available inwebm
.
To configure various aspects related to the conversion process, use one of the overloads of DownloadAsync(...)
:
using YoutubeExplode;
using YoutubeExplode.Converter;
var youtube = new YoutubeClient();
await youtube.Videos.DownloadAsync("https://youtube.com/watch?v=u_yIGGhubZs", "video.mp4", o => o
.SetContainer("webm") // override format
.SetPreset(ConversionPreset.UltraFast) // change preset
.SetFFmpegPath("path/to/ffmpeg") // custom FFmpeg location
);
If you need precise control over which streams are used for muxing, you can also provide them yourself:
using YoutubeExplode;
using YoutubeExplode.Videos.Streams;
using YoutubeExplode.Converter;
var youtube = new YoutubeClient();
// Get stream manifest
var streamManifest = await youtube.Videos.Streams.GetManifestAsync("u_yIGGhubZs");
// Select streams (1080p60 / highest bitrate audio)
var audioStreamInfo = streamManifest.GetAudioStreams().GetWithHighestBitrate();
var videoStreamInfo = streamManifest.GetVideoStreams().First(s => s.VideoQuality.Label == "1080p60");
var streamInfos = new IStreamInfo[] { audioStreamInfo, videoStreamInfo };
// Download and process them into one file
await youtube.Videos.DownloadAsync(streamInfos, new ConversionRequestBuilder("video.mp4").Build());
Downloading closed captions
Closed captions can be downloaded in a similar way to media streams.
To get the list of available closed caption tracks, call Videos.ClosedCaptions.GetManifestAsync(...)
:
using YoutubeExplode;
var youtube = new YoutubeClient();
var trackManifest = await youtube.Videos.ClosedCaptions.GetManifestAsync("u_yIGGhubZs");
Then retrieve metadata for a particular track:
// ...
// Find closed caption track in English
var trackInfo = trackManifest.GetByLanguage("en");
Finally, use Videos.ClosedCaptions.GetAsync(...)
to get the actual content of the track:
// ...
var track = await youtube.Videos.ClosedCaptions.GetAsync(trackInfo);
// Get the caption displayed at 0:35
var caption = track.GetByTime(TimeSpan.FromSeconds(35));
var text = caption.Text; // "collection acts as the parent collection"
You can also download the closed caption track in SRT file format with Videos.ClosedCaptions.DownloadAsync(...)
:
// ...
await youtube.Videos.ClosedCaptions.DownloadAsync(trackInfo, "cc_track.srt");
Playlists
Retrieving playlist metadata
You can get metadata associated with a YouTube playlist by calling Playlists.GetAsync(...)
method:
using YoutubeExplode;
var youtube = new YoutubeClient();
var playlist = await youtube.Playlists.GetAsync("PLa1F2ddGya_-UvuAqHAksYnB0qL9yWDO6");
var title = playlist.Title; // "First Steps - Blender 2.80 Fundamentals"
var author = playlist.Author.ChannelTitle; // "Blender"
Getting videos included in a playlist
To get the videos included in a playlist, call Playlists.GetVideosAsync(...)
:
using YoutubeExplode;
using YoutubeExplode.Common;
var youtube = new YoutubeClient();
// Get all playlist videos
var videos = await youtube.Playlists.GetVideosAsync("PLa1F2ddGya_-UvuAqHAksYnB0qL9yWDO6");
// Get only the first 20 playlist videos
var videosSubset = await youtube.Playlists
.GetVideosAsync(playlist.Id)
.CollectAsync(20);
You can also enumerate videos lazily without waiting for the whole list to load:
using YoutubeExplode;
var youtube = new YoutubeClient();
await foreach (var video in youtube.Playlists.GetVideosAsync("PLa1F2ddGya_-UvuAqHAksYnB0qL9yWDO6"))
{
var title = video.Title;
var author = video.Author;
}
If you need precise control over how many requests you send to YouTube, use Playlists.GetVideoBatchesAsync(...)
which returns videos wrapped in batches:
using YoutubeExplode;
var youtube = new YoutubeClient();
// Each batch corresponds to one request
await foreach (var batch in youtube.Playlists.GetVideoBatchesAsync("PLa1F2ddGya_-UvuAqHAksYnB0qL9yWDO6"))
{
foreach (var video in batch.Items)
{
var title = video.Title;
var author = video.Author;
}
}
Channels
Retrieving channel metadata
You can get metadata associated with a YouTube channel by calling Channels.GetAsync(...)
method:
using YoutubeExplode;
var youtube = new YoutubeClient();
var channel = await youtube.Channels.GetAsync("UCSMOQeBJ2RAnuFungnQOxLg");
var title = channel.Title; // "Blender"
You can also get channel metadata by username with Channels.GetByUserAsync(...)
:
using YoutubeExplode;
var youtube = new YoutubeClient();
var channel = await youtube.Channels.GetByUserAsync("Blender");
var id = channel.Id; // "UCSMOQeBJ2RAnuFungnQOxLg"
Getting channel uploads
To get a list of videos uploaded by a channel, call Channels.GetUploadsAsync(...)
:
using YoutubeExplode;
using YoutubeExplode.Common;
var youtube = new YoutubeClient();
var videos = await youtube.Channels.GetUploadsAsync("UCSMOQeBJ2RAnuFungnQOxLg");
Searching
You can execute a search query and get its results by calling Search.GetResultsAsync(...)
.
Each result may represent either a video, a playlist, or a channel, so you need to apply pattern matching to handle the corresponding cases:
using YoutubeExplode;
var youtube = new YoutubeClient();
await foreach (var result in youtube.Search.GetResultsAsync("blender tutorials"))
{
// Use pattern matching to handle different results (videos, playlists, channels)
switch (result)
{
case VideoSearchResult video:
{
var id = video.Id;
var title = video.Title;
var duration = video.Duration;
break;
}
case PlaylistSearchResult playlist:
{
var id = playlist.Id;
var title = playlist.Title;
break;
}
case ChannelSearchResult channel:
{
var id = channel.Id;
var title = channel.Title;
break;
}
}
}
To limit results to a specific type, use Search.GetVideosAsync(...)
, Search.GetPlaylistsAsync(...)
, or Search.GetChannelsAsync(...)
:
using YoutubeExplode;
using YoutubeExplode.Common;
var youtube = new YoutubeClient();
var videos = await youtube.Search.GetVideosAsync("blender tutorials");
var playlists = await youtube.Search.GetPlaylistsAsync("blender tutorials");
var channels = await youtube.Search.GetChannelsAsync("blender tutorials");
Similarly to playlists, you can also enumerate results in batches by calling Search.GetResultBatchesAsync(...)
:
using YoutubeExplode;
var youtube = new YoutubeClient();
// Each batch corresponds to one request
await foreach (var batch in youtube.Search.GetResultBatchesAsync("blender tutorials"))
{
foreach (var result in batch.Items)
{
switch (result)
{
case VideoSearchResult videoResult:
{
// ...
}
case PlaylistSearchResult playlistResult:
{
// ...
}
case ChannelSearchResult channelResult:
{
// ...
}
}
}
}
Etymology
The "Explode" in YoutubeExplode comes from the name of a PHP function that splits up strings, explode()
. When I was starting the development of this library, most of the reference source code I read was written in PHP, hence the inspiration for the name.