Struct rustube::VideoDescrambler [−][src]
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
impl VideoDescrambler
[src]
pub fn descramble(self) -> Result<Video>
[src]
descramble
only.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.
pub fn video_info(&self) -> &VideoInfo
[src]
descramble
only.The VideoInfo
of the video.
pub fn video_details(&self) -> &VideoDetails
[src]
descramble
only.The VideoDetails
of the video.
pub fn video_id(&self) -> &IdBuf
[src]
descramble
only.The Id
of the video.
pub fn video_title(&self) -> &String
[src]
descramble
only.The title of the video.
Trait Implementations
impl Clone for VideoDescrambler
[src]
descramble
only.fn clone(&self) -> VideoDescrambler
[src]
pub fn clone_from(&mut self, source: &Self)
1.0.0[src]
impl Debug for VideoDescrambler
[src]
descramble
only.impl Display for VideoDescrambler
[src]
descramble
only.impl Eq for VideoDescrambler
[src]
descramble
only.impl PartialEq<VideoDescrambler> for VideoDescrambler
[src]
descramble
only.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
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T
[src]
impl<Q, K> Equivalent<K> for Q where
K: Borrow<Q> + ?Sized,
Q: Eq + ?Sized,
[src]
K: Borrow<Q> + ?Sized,
Q: Eq + ?Sized,
pub fn equivalent(&self, key: &K) -> bool
[src]
impl<T> From<T> for T
[src]
impl<T> Instrument for T
[src]
pub fn instrument(self, span: Span) -> Instrumented<Self>
[src]
pub fn in_current_span(self) -> Instrumented<Self>
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
pub fn to_owned(&self) -> T
[src]
pub fn clone_into(&self, target: &mut T)
[src]
impl<T> ToString for T where
T: Display + ?Sized,
[src]
T: Display + ?Sized,
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
pub fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
V: MultiLane<T>,