add android/ios client, add cache

This commit is contained in:
ThetaDev 2022-07-31 10:54:28 +02:00
parent edf2252174
commit d7caceba7a
8 changed files with 4496 additions and 1756 deletions

View file

@ -1,8 +1,8 @@
use anyhow::{anyhow, bail, Context, Result};
use reqwest::Method;
use serde::{Serialize};
use serde::Serialize;
use super::{response, BaseRequest, RustyTube, YTClient};
use super::{response, ContextYT, ClientType, RustyTube, YTClient};
use crate::util;
// REQUEST
@ -10,13 +10,13 @@ use crate::util;
#[derive(Clone, Debug, Serialize)]
#[serde(rename_all = "camelCase")]
struct QPlayer {
#[serde(flatten)]
base: BaseRequest,
context: ContextYT,
/// Website playback context
#[serde(skip_serializing_if = "Option::is_none")]
playback_context: Option<QPlaybackContext>,
/// Content playback nonce (16 random chars)
// cpn: String,
/// Content playback nonce (mobile only, 16 random chars)
#[serde(skip_serializing_if = "Option::is_none")]
cpn: Option<String>,
/// YouTube video ID
video_id: String,
/// Set to true to allow extraction of streams with sensitive content
@ -41,21 +41,37 @@ struct QContentPlaybackContext {
}
impl RustyTube {
pub async fn fetch_player(&self, video_id: &str) -> Result<response::Player> {
let sts = self.desktop_client.deobf.get_sts().await?;
pub async fn fetch_player(
&self,
video_id: &str,
client_type: ClientType,
) -> Result<response::Player> {
let client = self.get_ytclient(client_type);
let context = client.get_context(false).await;
let request_body = QPlayer {
base: self.desktop_client.get_base_request_body(false).await,
playback_context: Some(QPlaybackContext {
content_playback_context: QContentPlaybackContext {
signature_timestamp: sts,
referer: format!("https://www.youtube.com/watch?v={}", video_id),
},
}),
// cpn: util::generate_content_playback_nonce(),
video_id: video_id.to_owned(),
content_check_ok: true,
racy_check_ok: true,
let request_body = if client_type.is_web() {
QPlayer {
context,
playback_context: Some(QPlaybackContext {
content_playback_context: QContentPlaybackContext {
signature_timestamp: self.desktop_client.deobf.get_sts().await?,
referer: format!("https://www.youtube.com/watch?v={}", video_id),
},
}),
cpn: None,
video_id: video_id.to_owned(),
content_check_ok: true,
racy_check_ok: true,
}
} else {
QPlayer {
context,
playback_context: None,
cpn: Some(util::generate_content_playback_nonce()),
video_id: video_id.to_owned(),
content_check_ok: true,
racy_check_ok: true,
}
};
let resp = self
@ -66,6 +82,9 @@ impl RustyTube {
.send()
.await?;
// println!("{}", resp.text().await?);
// todo!();
Ok(resp.json::<response::Player>().await?)
}
}
@ -78,7 +97,7 @@ mod tests {
#[test(tokio::test)]
async fn t_fetch_stream() {
let rt = RustyTube::new();
let stream = rt.fetch_player("ZeerrnuLi5E").await.unwrap();
let stream = rt.fetch_player("ZeerrnuLi5E", ClientType::Desktop).await.unwrap();
dbg!(stream);
}