YoutubeExplode attaches political terms to the word use
Abstraction layer over YouTube's internal API
At a glance
- What is it?
- A .NET abstraction over YouTube's internal endpoints whose page opens with four political statements that using it is said to imply agreement with, where YouTube has already withdrawn one stream category and the docs then warn about it twice, the raw stream URL is explicitly not the way in, and FFmpeg lives in a separate package.
- Who is it for?
- YoutubeExplode is a reasonable library to read if you are building .NET tooling over YouTube metadata, because the surface is one client class, closed captions are modelled as timed data, and the conversion concern is split into a separate package instead of being forced on you. Two things to weigh first.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 1 day ago.
- What is it written in?
- Mainly C#, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.
Star history
- Tyrrrz/YoutubeExplode3,753 ★ · +22
| Repository | 2026-09-24 | 2026-11-14 |
|---|---|---|
| Tyrrrz/YoutubeExplode | 3.7k | 3.8k |
22 Stars in the last 51 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
Use of the library carries a four-part political statement
The page states that by using this project or its source code, for any purpose and in any shape or form, you grant your implicit agreement to four statements. They are that you condemn Russia and its military aggression against Ukraine, that you recognize Russia is an occupant that unlawfully invaded a sovereign state, that you support Ukraine's territorial integrity including its claims over temporarily occupied territories of Crimea and Donbas, and that you reject false narratives perpetuated by Russian state propaganda. A footnote marker links to a document explaining why the clause exists, hosted in the author's shared profile repository, and the page's badge row carries a second link to a page about the war. None of this is technical. All of it is attached to the word use, which is the condition an adopting organisation has to accept or decline.
The mechanism is scraping and reverse-engineered endpoints
The library describes itself as an interface to query metadata of YouTube videos, playlists and channels, and to resolve and download video streams and closed caption tracks. Then it says how, in one sentence: behind a layer of abstraction, this library works by scraping raw page data and exploiting reverse-engineered internal endpoints. That is the project's own account of its method, and it is also the durability story. There is no public API being wrapped and no version negotiation to fall back on, so a change on YouTube's side is a breaking change on the library's side. A badge links to a project status document in the author's shared profile repository, which is where a reader would go to find out whether it still works this month.
YouTube withdrew a stream category and the page warns about it twice
Streams are grouped into three categories, and the first one is struck through on the page with a note that YouTube no longer provides it. What remains is audio-only streams and video-only streams. That withdrawal has a concrete consequence, and the page spells it out: muxed streams contain both audio and video but are limited in quality, up to 720p30, so to get the highest available quality you have to resolve the best audio-only and video-only streams separately and then mux them, which the companion package does with FFmpeg. A second warning then says the same thing again from the other side, that muxed streams are deprecated by YouTube, are not guaranteed to be available for every video, and should not be relied on. So a category is documented as removed and then warned about twice, which is a small but telling artefact of depending on internals.
The raw stream URL is explicitly not the way in
Stream metadata carries a `Url` property, and the page is careful about it. Using that property to reach the underlying content requires a series of carefully crafted HTTP requests, and the recommendation is to use the library's own resolve and download methods instead, because they perform the heavy lifting. That is an unusual warning to find in a library's own documentation, and it is a good one, because the metadata URL is exactly the shortcut a new user would take and exactly the thing that stops working when the platform changes its delivery. The retrieval calls themselves are not reproduced in this article: the point of the API is the shape, which is request a manifest, filter it, then ask the library to resolve or write what you picked.
One client class, four groups of operations
The surface is small and the page says so: functionality is exposed through a single entry point, the `YoutubeClient` class, and you use the operations on its `Videos`, `Playlists`, `Channels` and `Search` properties to send requests. Streams are handled per video. You request the manifest that lists every available stream, and then filter it, and the filtering is ordinary client-side selection over an object you already hold rather than another network call.
var streamInfo = streamManifest
.GetVideoOnlyStreams()
.Where(s => s.Container == Container.Mp4)
.GetWithHighestVideoQuality()Every example on the page targets the same single video, so the snippets read as illustrations of shape rather than as a program you would run as written.
Closed captions are modelled as timed data
Subtitles get the same manifest treatment as media, and the payoff is that they are queryable rather than merely downloadable. You request the manifest of available closed caption tracks for a video, pick a track by language code, and read the individual caption at a timestamp, with the page showing a lookup at thirty-five seconds and the text it returns. There is also a download that writes a track in SRT format. For a developer this is the part that survives a platform change more readily, because it depends on the metadata layer rather than on stream delivery, and it is the part of the library with the least to do with the contested half of the feature set.
FFmpeg is a separate package and the tree ships two demos
The conversion concern is split out. One extension package is named, YoutubeExplode.Converter, whose stated job is to provide an interface to download and convert videos using FFmpeg, so the core library itself carries no external process dependency. The repository is laid out as a solution with the core, the converter, a test project for each, and two demo applications, one command line and one graphical. Alongside them are the usual .NET scaffolding for a project of that shape: central package version management, a NuGet configuration, a global JSON file pinning the SDK, and a solution file using the newer format with the `slnx` extension rather than the classic one. Icons for the package listing are committed too.
There is an explicit way to stop taking the dependency
The install section offers one route, the NuGet package, and then a tip naming a tool called Binternal, which can internalize the library if you would rather not take an external dependency. That is the author's own vendoring tool, and for a library this dependent on platform internals it is a sensible adoption pattern: you copy the source once and then own the maintenance. Two more facts about the project itself. The default branch is `prime`, which is also the branch used in the profile repository links on the page, so it is load-bearing rather than cosmetic. And the release line is 6.6, with patches 6.6.1 and 6.6.2 following, the last of them in August 2026.
Editorial conclusion
YoutubeExplode is a reasonable library to read if you are building .NET tooling over YouTube metadata, because the surface is one client class, closed captions are modelled as timed data, and the conversion concern is split into a separate package instead of being forced on you. Two things to weigh first. It works by scraping page data and using reverse-engineered endpoints, so it can break without notice, and the page already records one stream category disappearing. And using it carries a political terms-of-use clause, which is not a technical objection but a real adoption question, so read that section before you take the dependency. As a routine tool for archiving your own library it is the wrong shape.
Frequently asked questions
How do I export my YouTube videos?
The library exposes a single client class with Videos, Playlists, Channels and Search operations, resolves a stream manifest per video, and can download audio-only or video-only streams and closed caption tracks, the latter in SRT format. Converting needs the separate YoutubeExplode.Converter package, which wraps FFmpeg, because YouTube no longer provides streams that contain both audio and video.
Is it legal to convert YouTube to MP4?
The page does not discuss legality. What it does is attach its own terms of use to the library, four statements about the war in Ukraine that use of the code, for any purpose and in any shape or form, is said to imply agreement with.
Is YouTube blocking downloads now?
The page does not answer that. What it records is a specific platform change, that YouTube no longer provides muxed streams, so the best audio-only and video-only streams have to be resolved separately and muxed, and that the previously available combined streams were limited to 720p30.
Which YouTube downloader is best?
The page compares nothing. It presents a library that works by scraping raw page data and exploiting reverse-engineered internal endpoints, with a companion package for downloading and converting through FFmpeg, and a link to a write-up on reverse-engineering YouTube.
youtube explode vs newpipe
The page does not compare itself to any other tool. It names one extension package of its own, for downloading and converting through FFmpeg, and describes the stream categories it works with after YouTube removed combined streams.
What is the YoutubeExplode API surface?
A single YoutubeClient class, with operations grouped on its Videos, Playlists, Channels and Search properties. Streams go through a manifest requested per video and then filtered, for example by container and highest quality, and closed captions through a track manifest picked by language code and read by timestamp.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/tyrrrz-youtubeexplode)Star history chart for your README
[](https://hysenlabs.com/projects/tyrrrz-youtubeexplode)Was this useful?