Struct rustube::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 RawFormat
s. 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 RawFormat
s 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 RawFormat
s, which now contain the
correct signature, and convert them to Stream
s. At the end of the day, Stream
s are just
RawFormat
s 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 Stream
s url
will eventually expire.
Implementations
sourceimpl VideoDescrambler
impl VideoDescrambler
sourcepub fn descramble(self) -> Result<Video>
pub fn descramble(self) -> Result<Video>
sourcepub fn video_info(&self) -> &VideoInfo
pub fn video_info(&self) -> &VideoInfo
The VideoInfo
of the video.
sourcepub fn video_details(&self) -> &VideoDetails
pub fn video_details(&self) -> &VideoDetails
The VideoDetails
of the video.
sourcepub fn video_title(&self) -> &String
pub fn video_title(&self) -> &String
The title of the video.
Trait Implementations
sourceimpl Clone for VideoDescrambler
impl Clone for VideoDescrambler
sourcefn clone(&self) -> VideoDescrambler
fn clone(&self) -> VideoDescrambler
1.0.0 · sourceconst fn clone_from(&mut self, source: &Self)
const fn clone_from(&mut self, source: &Self)
source
. Read moresourceimpl Debug for VideoDescrambler
impl Debug for VideoDescrambler
sourceimpl Display for VideoDescrambler
impl Display for VideoDescrambler
sourceimpl PartialEq<VideoDescrambler> for VideoDescrambler
impl PartialEq<VideoDescrambler> for VideoDescrambler
impl Eq for VideoDescrambler
Auto Trait Implementations
impl !RefUnwindSafe for VideoDescrambler
impl Send for VideoDescrambler
impl Sync for VideoDescrambler
impl Unpin for VideoDescrambler
impl !UnwindSafe for VideoDescrambler
Blanket Implementations
sourceimpl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
sourceimpl<Q, K> Equivalent<K> for Qwhere
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
impl<Q, K> Equivalent<K> for Qwhere
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
sourcefn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.