mirror of
https://github.com/TeamPiped/piped-rust-sdk.git
synced 2024-08-14 23:56:06 +00:00
General Cleanup (#1)
- Split large lib-file into smaller files - Renamed getters to follow rust naming convention - Pretty debug print in examples - No hardcoded dependency versions in lib
This commit is contained in:
parent
125fdee6c2
commit
412a8ffa52
10 changed files with 310 additions and 314 deletions
|
@ -1,4 +1,4 @@
|
||||||
use piped::piped::PipedClient;
|
use piped::PipedClient;
|
||||||
use reqwest::ClientBuilder;
|
use reqwest::ClientBuilder;
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
|
@ -13,9 +13,9 @@ async fn main() {
|
||||||
let client = PipedClient::new(httpclient, instance);
|
let client = PipedClient::new(httpclient, instance);
|
||||||
|
|
||||||
let channel = client
|
let channel = client
|
||||||
.get_channel_from_id("UCXuqSBlHAE6Xw-yeJA0Tunw".to_string())
|
.channel_from_id("UCXuqSBlHAE6Xw-yeJA0Tunw".to_string())
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
println!("{:?}", channel);
|
println!("{:#?}", channel);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use piped::piped::PipedClient;
|
use piped::PipedClient;
|
||||||
use reqwest::ClientBuilder;
|
use reqwest::ClientBuilder;
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
|
@ -13,9 +13,9 @@ async fn main() {
|
||||||
let client = PipedClient::new(httpclient, instance);
|
let client = PipedClient::new(httpclient, instance);
|
||||||
|
|
||||||
let comments = client
|
let comments = client
|
||||||
.get_comments_from_id("__hYx6ZzFbQ".to_string())
|
.comments_from_id("__hYx6ZzFbQ".to_string())
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
println!("{:?}", comments);
|
println!("{:#?}", comments);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use piped::piped::PipedClient;
|
use piped::PipedClient;
|
||||||
use reqwest::ClientBuilder;
|
use reqwest::ClientBuilder;
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
|
@ -13,9 +13,9 @@ async fn main() {
|
||||||
let client = PipedClient::new(httpclient, instance);
|
let client = PipedClient::new(httpclient, instance);
|
||||||
|
|
||||||
let playlist = client
|
let playlist = client
|
||||||
.get_playlist_from_id("PLQSoWXSpjA38FIQCvwnVNPlGPVA63WTD8".to_string())
|
.playlist_from_id("PLQSoWXSpjA38FIQCvwnVNPlGPVA63WTD8".to_string())
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
println!("{:?}", playlist);
|
println!("{:#?}", playlist);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use piped::piped::PipedClient;
|
use piped::PipedClient;
|
||||||
use reqwest::ClientBuilder;
|
use reqwest::ClientBuilder;
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
|
@ -13,9 +13,9 @@ async fn main() {
|
||||||
let client = PipedClient::new(httpclient, instance);
|
let client = PipedClient::new(httpclient, instance);
|
||||||
|
|
||||||
let suggestions = client
|
let suggestions = client
|
||||||
.get_search_suggestions("techlore".to_string())
|
.search_suggestions("techlore".to_string())
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
println!("{:?}", suggestions);
|
println!("{:#?}", suggestions);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use piped::piped::PipedClient;
|
use piped::PipedClient;
|
||||||
use reqwest::ClientBuilder;
|
use reqwest::ClientBuilder;
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
|
@ -12,7 +12,7 @@ async fn main() {
|
||||||
|
|
||||||
let client = PipedClient::new(httpclient, instance);
|
let client = PipedClient::new(httpclient, instance);
|
||||||
|
|
||||||
let streams = client.get_trending("US".to_string()).await.unwrap();
|
let streams = client.trending("US".to_string()).await.unwrap();
|
||||||
|
|
||||||
println!("{:?}", streams);
|
println!("{:#?}", streams);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use piped::piped::PipedClient;
|
use piped::PipedClient;
|
||||||
use reqwest::ClientBuilder;
|
use reqwest::ClientBuilder;
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
|
@ -13,9 +13,9 @@ async fn main() {
|
||||||
let client = PipedClient::new(httpclient, instance);
|
let client = PipedClient::new(httpclient, instance);
|
||||||
|
|
||||||
let video = client
|
let video = client
|
||||||
.get_video_from_id("__hYx6ZzFbQ".to_string())
|
.video_from_id("__hYx6ZzFbQ".to_string())
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
println!("{:?}", video);
|
println!("{:#?}", video);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,6 @@ version = "0.0.0"
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
reqwest = "0.11.4"
|
reqwest = "^0.11"
|
||||||
serde = {version = "1.0.130", features = ["derive"]}
|
serde = {version = "^1.0", features = ["derive"]}
|
||||||
serde_json = "1.0.68"
|
serde_json = "^1.0"
|
||||||
|
|
158
piped/src/client.rs
Normal file
158
piped/src/client.rs
Normal file
|
@ -0,0 +1,158 @@
|
||||||
|
use reqwest::{Client, Url};
|
||||||
|
|
||||||
|
use crate::{Channel, CommentsInfo, Playlist, RelatedStream, StreamsPage, VideoInfo};
|
||||||
|
|
||||||
|
pub struct PipedClient {
|
||||||
|
pub httpclient: Client,
|
||||||
|
pub instance: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PipedClient {
|
||||||
|
pub fn new(httpclient: Client, instance: String) -> PipedClient {
|
||||||
|
PipedClient {
|
||||||
|
httpclient,
|
||||||
|
instance,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn trending(
|
||||||
|
&self,
|
||||||
|
region: String,
|
||||||
|
) -> Result<Vec<RelatedStream>, Box<dyn std::error::Error>> {
|
||||||
|
let mut url = Url::parse(format!("{}/trending", &self.instance).as_str())?;
|
||||||
|
url.query_pairs_mut().append_pair("region", region.as_str());
|
||||||
|
|
||||||
|
let resp = &self.httpclient.get(url).send().await?.text().await?;
|
||||||
|
|
||||||
|
let streams: Vec<RelatedStream> = serde_json::from_str(resp.as_str())?;
|
||||||
|
|
||||||
|
Ok(streams)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn channel_from_id(&self, id: String) -> Result<Channel, Box<dyn std::error::Error>> {
|
||||||
|
let resp = &self
|
||||||
|
.httpclient
|
||||||
|
.get(format!("{}/channel/{}", &self.instance, id))
|
||||||
|
.send()
|
||||||
|
.await?
|
||||||
|
.text()
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
let channel: Channel = serde_json::from_str(resp.as_str())?;
|
||||||
|
|
||||||
|
Ok(channel)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn channel_continuation(
|
||||||
|
&self,
|
||||||
|
id: String,
|
||||||
|
nexturl: String,
|
||||||
|
nextbody: String,
|
||||||
|
) -> Result<StreamsPage, Box<dyn std::error::Error>> {
|
||||||
|
let mut url = Url::parse(format!("{}/nextpage/channels/{}", &self.instance, id).as_str())?;
|
||||||
|
url.query_pairs_mut()
|
||||||
|
.append_pair("url", nexturl.as_str())
|
||||||
|
.append_pair("id", nextbody.as_str());
|
||||||
|
|
||||||
|
let resp = &self.httpclient.get(url).send().await?.text().await?;
|
||||||
|
|
||||||
|
let streams: StreamsPage = serde_json::from_str(resp.as_str())?;
|
||||||
|
|
||||||
|
Ok(streams)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn playlist_from_id(
|
||||||
|
&self,
|
||||||
|
id: String,
|
||||||
|
) -> Result<Playlist, Box<dyn std::error::Error>> {
|
||||||
|
let resp = &self
|
||||||
|
.httpclient
|
||||||
|
.get(format!("{}/playlists/{}", &self.instance, id))
|
||||||
|
.send()
|
||||||
|
.await?
|
||||||
|
.text()
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
let playlist: Playlist = serde_json::from_str(resp.as_str())?;
|
||||||
|
|
||||||
|
Ok(playlist)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn playlist_continuation(
|
||||||
|
&self,
|
||||||
|
id: String,
|
||||||
|
nexturl: String,
|
||||||
|
nextbody: String,
|
||||||
|
) -> Result<StreamsPage, Box<dyn std::error::Error>> {
|
||||||
|
let mut url = Url::parse(format!("{}/nextpage/playlists/{}", &self.instance, id).as_str())?;
|
||||||
|
url.query_pairs_mut()
|
||||||
|
.append_pair("url", nexturl.as_str())
|
||||||
|
.append_pair("id", nextbody.as_str());
|
||||||
|
|
||||||
|
let resp = &self.httpclient.get(url).send().await?.text().await?;
|
||||||
|
|
||||||
|
let streams: StreamsPage = serde_json::from_str(resp.as_str())?;
|
||||||
|
|
||||||
|
Ok(streams)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn video_from_id(&self, id: String) -> Result<VideoInfo, Box<dyn std::error::Error>> {
|
||||||
|
let resp = &self
|
||||||
|
.httpclient
|
||||||
|
.get(format!("{}/streams/{}", &self.instance, id))
|
||||||
|
.send()
|
||||||
|
.await?
|
||||||
|
.text()
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
let video: VideoInfo = serde_json::from_str(resp.as_str())?;
|
||||||
|
|
||||||
|
Ok(video)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn search_suggestions(
|
||||||
|
&self,
|
||||||
|
q: String,
|
||||||
|
) -> Result<Vec<String>, Box<dyn std::error::Error>> {
|
||||||
|
let mut url = Url::parse(format!("{}/suggestions", &self.instance).as_str())?;
|
||||||
|
url.query_pairs_mut().append_pair("query", q.as_str());
|
||||||
|
|
||||||
|
let resp = &self.httpclient.get(url).send().await?.text().await?;
|
||||||
|
|
||||||
|
let suggestions: Vec<String> = serde_json::from_str(resp.as_str())?;
|
||||||
|
|
||||||
|
Ok(suggestions)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn comments_from_id(
|
||||||
|
&self,
|
||||||
|
id: String,
|
||||||
|
) -> Result<CommentsInfo, Box<dyn std::error::Error>> {
|
||||||
|
let resp = &self
|
||||||
|
.httpclient
|
||||||
|
.get(format!("{}/comments/{}", &self.instance, id))
|
||||||
|
.send()
|
||||||
|
.await?
|
||||||
|
.text()
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
let comments: CommentsInfo = serde_json::from_str(resp.as_str())?;
|
||||||
|
|
||||||
|
Ok(comments)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn comments_continuation(
|
||||||
|
&self,
|
||||||
|
id: String,
|
||||||
|
nexturl: String,
|
||||||
|
) -> Result<CommentsInfo, Box<dyn std::error::Error>> {
|
||||||
|
let mut url = Url::parse(format!("{}/nextpage/comments/{}", &self.instance, id).as_str())?;
|
||||||
|
url.query_pairs_mut().append_pair("url", nexturl.as_str());
|
||||||
|
|
||||||
|
let resp = &self.httpclient.get(url).send().await?.text().await?;
|
||||||
|
|
||||||
|
let comments: CommentsInfo = serde_json::from_str(resp.as_str())?;
|
||||||
|
|
||||||
|
Ok(comments)
|
||||||
|
}
|
||||||
|
}
|
297
piped/src/lib.rs
297
piped/src/lib.rs
|
@ -1,294 +1,5 @@
|
||||||
pub mod piped {
|
mod client;
|
||||||
use reqwest::{Client, Url};
|
mod structure;
|
||||||
use serde::Deserialize;
|
|
||||||
|
|
||||||
pub struct PipedClient {
|
pub use client::PipedClient;
|
||||||
pub httpclient: Client,
|
pub use structure::*;
|
||||||
pub instance: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl PipedClient {
|
|
||||||
pub fn new(httpclient: Client, instance: String) -> PipedClient {
|
|
||||||
PipedClient {
|
|
||||||
httpclient: httpclient,
|
|
||||||
instance: instance,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn get_trending(
|
|
||||||
&self,
|
|
||||||
region: String,
|
|
||||||
) -> Result<Vec<RelatedStream>, Box<dyn std::error::Error>> {
|
|
||||||
let mut url = Url::parse(format!("{}/trending", &self.instance).as_str())?;
|
|
||||||
url.query_pairs_mut().append_pair("region", region.as_str());
|
|
||||||
|
|
||||||
let resp = &self.httpclient.get(url).send().await?.text().await?;
|
|
||||||
|
|
||||||
let streams: Vec<RelatedStream> = serde_json::from_str(resp.as_str())?;
|
|
||||||
|
|
||||||
Ok(streams)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn get_channel_from_id(
|
|
||||||
&self,
|
|
||||||
id: String,
|
|
||||||
) -> Result<Channel, Box<dyn std::error::Error>> {
|
|
||||||
let resp = &self
|
|
||||||
.httpclient
|
|
||||||
.get(format!("{}/channel/{}", &self.instance, id))
|
|
||||||
.send()
|
|
||||||
.await?
|
|
||||||
.text()
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
let channel: Channel = serde_json::from_str(resp.as_str())?;
|
|
||||||
|
|
||||||
Ok(channel)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn get_channel_continuation(
|
|
||||||
&self,
|
|
||||||
id: String,
|
|
||||||
nexturl: String,
|
|
||||||
nextbody: String,
|
|
||||||
) -> Result<StreamsPage, Box<dyn std::error::Error>> {
|
|
||||||
let mut url =
|
|
||||||
Url::parse(format!("{}/nextpage/channels/{}", &self.instance, id).as_str())?;
|
|
||||||
url.query_pairs_mut()
|
|
||||||
.append_pair("url", nexturl.as_str())
|
|
||||||
.append_pair("id", nextbody.as_str());
|
|
||||||
|
|
||||||
let resp = &self.httpclient.get(url).send().await?.text().await?;
|
|
||||||
|
|
||||||
let streams: StreamsPage = serde_json::from_str(resp.as_str())?;
|
|
||||||
|
|
||||||
Ok(streams)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn get_playlist_from_id(
|
|
||||||
&self,
|
|
||||||
id: String,
|
|
||||||
) -> Result<Playlist, Box<dyn std::error::Error>> {
|
|
||||||
let resp = &self
|
|
||||||
.httpclient
|
|
||||||
.get(format!("{}/playlists/{}", &self.instance, id))
|
|
||||||
.send()
|
|
||||||
.await?
|
|
||||||
.text()
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
let playlist: Playlist = serde_json::from_str(resp.as_str())?;
|
|
||||||
|
|
||||||
Ok(playlist)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn get_playlist_continuation(
|
|
||||||
&self,
|
|
||||||
id: String,
|
|
||||||
nexturl: String,
|
|
||||||
nextbody: String,
|
|
||||||
) -> Result<StreamsPage, Box<dyn std::error::Error>> {
|
|
||||||
let mut url =
|
|
||||||
Url::parse(format!("{}/nextpage/playlists/{}", &self.instance, id).as_str())?;
|
|
||||||
url.query_pairs_mut()
|
|
||||||
.append_pair("url", nexturl.as_str())
|
|
||||||
.append_pair("id", nextbody.as_str());
|
|
||||||
|
|
||||||
let resp = &self.httpclient.get(url).send().await?.text().await?;
|
|
||||||
|
|
||||||
let streams: StreamsPage = serde_json::from_str(resp.as_str())?;
|
|
||||||
|
|
||||||
Ok(streams)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn get_video_from_id(
|
|
||||||
&self,
|
|
||||||
id: String,
|
|
||||||
) -> Result<VideoInfo, Box<dyn std::error::Error>> {
|
|
||||||
let resp = &self
|
|
||||||
.httpclient
|
|
||||||
.get(format!("{}/streams/{}", &self.instance, id))
|
|
||||||
.send()
|
|
||||||
.await?
|
|
||||||
.text()
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
let video: VideoInfo = serde_json::from_str(resp.as_str())?;
|
|
||||||
|
|
||||||
Ok(video)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn get_search_suggestions(
|
|
||||||
&self,
|
|
||||||
q: String,
|
|
||||||
) -> Result<Vec<String>, Box<dyn std::error::Error>> {
|
|
||||||
let mut url = Url::parse(format!("{}/suggestions", &self.instance).as_str())?;
|
|
||||||
url.query_pairs_mut().append_pair("query", q.as_str());
|
|
||||||
|
|
||||||
let resp = &self.httpclient.get(url).send().await?.text().await?;
|
|
||||||
|
|
||||||
let suggestions: Vec<String> = serde_json::from_str(resp.as_str())?;
|
|
||||||
|
|
||||||
Ok(suggestions)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn get_comments_from_id(
|
|
||||||
&self,
|
|
||||||
id: String,
|
|
||||||
) -> Result<CommentsInfo, Box<dyn std::error::Error>> {
|
|
||||||
let resp = &self
|
|
||||||
.httpclient
|
|
||||||
.get(format!("{}/comments/{}", &self.instance, id))
|
|
||||||
.send()
|
|
||||||
.await?
|
|
||||||
.text()
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
let comments: CommentsInfo = serde_json::from_str(resp.as_str())?;
|
|
||||||
|
|
||||||
Ok(comments)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn get_comments_continuation(
|
|
||||||
&self,
|
|
||||||
id: String,
|
|
||||||
nexturl: String,
|
|
||||||
) -> Result<CommentsInfo, Box<dyn std::error::Error>> {
|
|
||||||
let mut url =
|
|
||||||
Url::parse(format!("{}/nextpage/comments/{}", &self.instance, id).as_str())?;
|
|
||||||
url.query_pairs_mut().append_pair("url", nexturl.as_str());
|
|
||||||
|
|
||||||
let resp = &self.httpclient.get(url).send().await?.text().await?;
|
|
||||||
|
|
||||||
let comments: CommentsInfo = serde_json::from_str(resp.as_str())?;
|
|
||||||
|
|
||||||
Ok(comments)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Deserialize, Debug)]
|
|
||||||
#[serde(rename_all = "camelCase")]
|
|
||||||
pub struct Channel {
|
|
||||||
pub id: String,
|
|
||||||
pub name: String,
|
|
||||||
pub avatar_url: String,
|
|
||||||
pub banner_url: String,
|
|
||||||
pub description: String,
|
|
||||||
pub nextpage: Option<String>,
|
|
||||||
pub nextbody: Option<String>,
|
|
||||||
pub related_streams: Vec<RelatedStream>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Deserialize, Debug)]
|
|
||||||
#[serde(rename_all = "camelCase")]
|
|
||||||
pub struct Playlist {
|
|
||||||
pub name: String,
|
|
||||||
pub thumbnail_url: String,
|
|
||||||
pub banner_url: Option<String>,
|
|
||||||
pub uploader: String,
|
|
||||||
pub uploader_url: String,
|
|
||||||
pub uploader_avatar: String,
|
|
||||||
pub videos: i32,
|
|
||||||
pub nextpage: Option<String>,
|
|
||||||
pub nextbody: Option<String>,
|
|
||||||
pub related_streams: Vec<RelatedStream>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Deserialize, Debug)]
|
|
||||||
#[serde(rename_all = "camelCase")]
|
|
||||||
pub struct StreamsPage {
|
|
||||||
pub nextpage: Option<String>,
|
|
||||||
pub nextbody: Option<String>,
|
|
||||||
pub related_streams: Vec<RelatedStream>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Deserialize, Debug)]
|
|
||||||
#[serde(rename_all = "camelCase")]
|
|
||||||
pub struct RelatedStream {
|
|
||||||
pub url: String,
|
|
||||||
pub title: String,
|
|
||||||
pub thumbnail: String,
|
|
||||||
pub uploader_avatar: Option<String>,
|
|
||||||
pub uploader_name: String,
|
|
||||||
pub uploader_url: String,
|
|
||||||
pub uploaded_date: Option<String>,
|
|
||||||
pub uploader_verified: bool,
|
|
||||||
pub duration: i32,
|
|
||||||
pub views: i64,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
|
||||||
#[serde(rename_all = "camelCase")]
|
|
||||||
pub struct VideoInfo {
|
|
||||||
pub title: String,
|
|
||||||
pub description: String,
|
|
||||||
pub dash: Option<String>,
|
|
||||||
pub upload_date: String,
|
|
||||||
pub uploader: String,
|
|
||||||
pub uploader_url: String,
|
|
||||||
pub uploader_avatar: String,
|
|
||||||
pub thumbnail_url: String,
|
|
||||||
pub hls: String,
|
|
||||||
pub duration: i32,
|
|
||||||
pub views: i64,
|
|
||||||
pub likes: i64,
|
|
||||||
pub lbry_id: Option<String>,
|
|
||||||
pub dislikes: i64,
|
|
||||||
pub audio_streams: Vec<Stream>,
|
|
||||||
pub video_streams: Vec<Stream>,
|
|
||||||
pub related_streams: Vec<RelatedStream>,
|
|
||||||
pub subtitles: Vec<Subtitle>,
|
|
||||||
pub livestream: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
|
||||||
#[serde(rename_all = "camelCase")]
|
|
||||||
pub struct Stream {
|
|
||||||
pub url: String,
|
|
||||||
pub format: String,
|
|
||||||
pub quality: String,
|
|
||||||
pub mime_type: String,
|
|
||||||
pub codec: Option<String>,
|
|
||||||
pub video_only: bool,
|
|
||||||
pub bitrate: i32,
|
|
||||||
pub init_start: i32,
|
|
||||||
pub init_end: i32,
|
|
||||||
pub index_start: i32,
|
|
||||||
pub index_end: i32,
|
|
||||||
pub width: i32,
|
|
||||||
pub height: i32,
|
|
||||||
pub fps: i32,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
|
||||||
#[serde(rename_all = "camelCase")]
|
|
||||||
pub struct Subtitle {
|
|
||||||
pub url: String,
|
|
||||||
pub mime_type: String,
|
|
||||||
pub name: String,
|
|
||||||
pub code: String,
|
|
||||||
pub auto_generated: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
|
||||||
#[serde(rename_all = "camelCase")]
|
|
||||||
pub struct CommentsInfo {
|
|
||||||
pub comments: Vec<Comment>,
|
|
||||||
pub nextpage: Option<String>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
|
||||||
#[serde(rename_all = "camelCase")]
|
|
||||||
pub struct Comment {
|
|
||||||
pub author: String,
|
|
||||||
pub thumbnail: String,
|
|
||||||
pub comment_id: String,
|
|
||||||
pub comment_text: String,
|
|
||||||
pub commented_time: String,
|
|
||||||
pub commentor_url: String,
|
|
||||||
pub like_count: i64,
|
|
||||||
pub hearted: bool,
|
|
||||||
pub pinned: bool,
|
|
||||||
pub verified: bool,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
127
piped/src/structure.rs
Normal file
127
piped/src/structure.rs
Normal file
|
@ -0,0 +1,127 @@
|
||||||
|
use serde::Deserialize;
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct Channel {
|
||||||
|
pub id: String,
|
||||||
|
pub name: String,
|
||||||
|
pub avatar_url: String,
|
||||||
|
pub banner_url: String,
|
||||||
|
pub description: String,
|
||||||
|
pub nextpage: Option<String>,
|
||||||
|
pub nextbody: Option<String>,
|
||||||
|
pub related_streams: Vec<RelatedStream>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct Playlist {
|
||||||
|
pub name: String,
|
||||||
|
pub thumbnail_url: String,
|
||||||
|
pub banner_url: Option<String>,
|
||||||
|
pub uploader: String,
|
||||||
|
pub uploader_url: String,
|
||||||
|
pub uploader_avatar: String,
|
||||||
|
pub videos: i32,
|
||||||
|
pub nextpage: Option<String>,
|
||||||
|
pub nextbody: Option<String>,
|
||||||
|
pub related_streams: Vec<RelatedStream>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct StreamsPage {
|
||||||
|
pub nextpage: Option<String>,
|
||||||
|
pub nextbody: Option<String>,
|
||||||
|
pub related_streams: Vec<RelatedStream>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct RelatedStream {
|
||||||
|
pub url: String,
|
||||||
|
pub title: String,
|
||||||
|
pub thumbnail: String,
|
||||||
|
pub uploader_avatar: Option<String>,
|
||||||
|
pub uploader_name: String,
|
||||||
|
pub uploader_url: String,
|
||||||
|
pub uploaded_date: Option<String>,
|
||||||
|
pub uploader_verified: bool,
|
||||||
|
pub duration: i32,
|
||||||
|
pub views: i64,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct VideoInfo {
|
||||||
|
pub title: String,
|
||||||
|
pub description: String,
|
||||||
|
pub dash: Option<String>,
|
||||||
|
pub upload_date: String,
|
||||||
|
pub uploader: String,
|
||||||
|
pub uploader_url: String,
|
||||||
|
pub uploader_avatar: String,
|
||||||
|
pub thumbnail_url: String,
|
||||||
|
pub hls: String,
|
||||||
|
pub duration: i32,
|
||||||
|
pub views: i64,
|
||||||
|
pub likes: i64,
|
||||||
|
pub lbry_id: Option<String>,
|
||||||
|
pub dislikes: i64,
|
||||||
|
pub audio_streams: Vec<Stream>,
|
||||||
|
pub video_streams: Vec<Stream>,
|
||||||
|
pub related_streams: Vec<RelatedStream>,
|
||||||
|
pub subtitles: Vec<Subtitle>,
|
||||||
|
pub livestream: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct Stream {
|
||||||
|
pub url: String,
|
||||||
|
pub format: String,
|
||||||
|
pub quality: String,
|
||||||
|
pub mime_type: String,
|
||||||
|
pub codec: Option<String>,
|
||||||
|
pub video_only: bool,
|
||||||
|
pub bitrate: i32,
|
||||||
|
pub init_start: i32,
|
||||||
|
pub init_end: i32,
|
||||||
|
pub index_start: i32,
|
||||||
|
pub index_end: i32,
|
||||||
|
pub width: i32,
|
||||||
|
pub height: i32,
|
||||||
|
pub fps: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct Subtitle {
|
||||||
|
pub url: String,
|
||||||
|
pub mime_type: String,
|
||||||
|
pub name: String,
|
||||||
|
pub code: String,
|
||||||
|
pub auto_generated: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct CommentsInfo {
|
||||||
|
pub comments: Vec<Comment>,
|
||||||
|
pub nextpage: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct Comment {
|
||||||
|
pub author: String,
|
||||||
|
pub thumbnail: String,
|
||||||
|
pub comment_id: String,
|
||||||
|
pub comment_text: String,
|
||||||
|
pub commented_time: String,
|
||||||
|
pub commentor_url: String,
|
||||||
|
pub like_count: i64,
|
||||||
|
pub hearted: bool,
|
||||||
|
pub pinned: bool,
|
||||||
|
pub verified: bool,
|
||||||
|
}
|
Loading…
Reference in a new issue