use crate::client::MaxClient;
use crate::error::Result;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VideoInfo {
pub token: String,
pub urls: HashMap<String, String>,
pub thumbnail: VideoThumbnail,
pub width: i32,
pub height: i32,
pub duration: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VideoThumbnail {
pub url: String,
}
impl MaxClient {
pub async fn get_video_info(&self, token: &str) -> Result<VideoInfo> {
let encoded_token = token.replace('/', "%2F");
let path = format!("/videos/{}", encoded_token);
self.request_with_rate_limit(
reqwest::Method::GET,
&path,
&[],
None,
)
.await
}
pub async fn download_video(&self, token: &str) -> Result<Vec<u8>> {
let info = self.get_video_info(token).await?;
let url = info
.urls
.values()
.next()
.ok_or_else(|| crate::error::Error::InvalidInput("No video URL found".into()))?;
let resp = self
.http
.get(url)
.header("Authorization", &self.token)
.send()
.await?;
let bytes = resp.bytes().await?;
Ok(bytes.to_vec())
}
}