pub struct VideoDescrambler { /* private fields */ }
Expand description

A descrambler used to decrypt the data fetched by VideoFetcher.

You will probably rarely use this type directly, and use Video instead. There’s no public way of directly constructing a VideoDescrambler. The only way of getting one is by calling VideoFetcher::fetch.

Example

let url = Url::parse("https://youtube.com/watch?iv=5jlI4uzZGjU").unwrap();

let fetcher: VideoFetcher =  VideoFetcher::from_url(&url).unwrap();
let descrambler: VideoDescrambler = fetcher.fetch().await.unwrap();

How it works

(To fully understand descramble, you should first read how VideoFetcher works).

Descrambling, in this case, mainly refers to descrambling the SignatureCipher. After we requested the VideoInfo in fetch, we are left with many RawFormats. A RawFormat is just a bucket full of information about a video. Those formats come in two flavours: pre-signed and encrypted formats. Pre-signed formats are actually a free lunch. Such formats already contain a valid video URL, which can be used to download the video. The encrypted once are a little bit more complicated.

These encrypted RawFormats contain a so called SignatureCipher with a the signature field s in it. This signature is a long string and the YouTube server requires us to include in the URL query or we get a 403 back. Unfortunalty this signature isn’t correct yet! We first need to decrypt it. And that’s where the transform_plan and the transform_map come into play.

The transform_plan is just a list of JavaScript function calls, which take a string (or an array) plus sometimes an integer as input. The called JavaScript functions then transforms the string in a certain way and returns a new string. This new string then represents the new signature. To decrypt the signature we just need to pass it through all of these functions in a row.

But wait! How can we run JavaScript in Rust? And doesn’t that come with a considerable overhead? It actually would come with a vast overhead! That’s why we need the transform_map. The transform_map is a HashMap<String, TransformFn>, which maps JavaScript function names to Rust functions.

To finally decrypt the signature, we just iterate over each function call in the the transform_plan, extract both the function name and the optinal integer argument, and call the corresponding Rust function in transform_map.

The last step descramble performs, is to take all RawFormats, which now contain the correct signature, and convert them to Streams. At the end of the day, Streams are just RawFormats with some extra information.

And that’s it! We can now download a YouTube video like we would download any other video from the internet. The only difference is that the Streams url will eventually expire.

Implementations

Descrambles the data fetched by YouTubeFetcher. For more information have a look at the Video documentation.

Errors
  • When the streaming data of the video is incomplete.
  • When descrambling the videos signatures fails.

The VideoInfo of the video.

The VideoDetails of the video.

The Id of the video.

The title of the video.

Trait Implementations

Returns a copy of the value. Read more
Performs copy-assignment from source. Read more
Formats the value using the given formatter. Read more
Formats the value using the given formatter. Read more
This method tests for self and other values to be equal, and is used by ==. Read more
This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more
Compare self to key and return true if they are equal.

Returns the argument unchanged.

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Instruments this type with the current Span, returning an Instrumented wrapper. Read more

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

The resulting type after obtaining ownership.
Creates owned data from borrowed data, usually by cloning. Read more
Uses borrowed data to replace owned data, usually by cloning. Read more
Converts the given value to a String. Read more
The type returned in the event of a conversion error.
Performs the conversion.
The type returned in the event of a conversion error.
Performs the conversion.
Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more