add android/ios client, add cache
This commit is contained in:
parent
edf2252174
commit
d7caceba7a
8 changed files with 4496 additions and 1756 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Reference in a new issue