Struct VideoDescrambler

Source
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§

Source§

impl VideoDescrambler

Source

pub fn descramble(self) -> Result<Video>

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.
Source

pub fn video_info(&self) -> &VideoInfo

The VideoInfo of the video.

Source

pub fn video_details(&self) -> &VideoDetails

The VideoDetails of the video.

Source

pub fn video_id(&self) -> &IdBuf

The Id of the video.

Source

pub fn video_title(&self) -> &String

The title of the video.

Trait Implementations§

Source§

impl Clone for VideoDescrambler

Source§

fn clone(&self) -> VideoDescrambler

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for VideoDescrambler

Source§

fn fmt(&self, __f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for VideoDescrambler

Source§

fn fmt(&self, _derive_more_display_formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for VideoDescrambler

Source§

fn eq(&self, other: &Self) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Eq for VideoDescrambler

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

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

fn in_current_span(self) -> Instrumented<Self>

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

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

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

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,