use log::debug;
use serde::Deserialize;
use urlencoding::encode;
#[derive(Deserialize, Debug)]
pub struct OembedResponse {
pub version: Option<String>,
pub provider_name: Option<String>,
pub provider_url: Option<String>,
pub width: Option<u64>,
pub html: Option<String>,
}
pub async fn get_oembed_html(
post_url: &str,
token: &str,
) -> Result<OembedResponse, reqwest::Error> {
let the_post_url = encode(post_url);
let url = format!("https://graph.threads.net/v1.0/oembed?url={the_post_url}");
debug!("requesting oembed for: {:?}", &url);
let res = reqwest::Client::new()
.get(&url)
.bearer_auth(token)
.send()
.await? .json::<OembedResponse>()
.await?;
Ok(res)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::utils::read_dot_env;
use log::debug;
#[tokio::test]
async fn test_get_oembed_html() {
let should_log_verbose = true;
let _ = env_logger::builder()
.is_test(!should_log_verbose)
.try_init();
let env = read_dot_env();
let token = env.get("ACCESS_TOKEN").unwrap();
let res = get_oembed_html("https://www.threads.net/@threads/post/DHvtwr8g63f", token).await;
debug!("oembed response fetched: {:?}", res);
assert_eq!(true, res.is_ok());
let resp_data = res.unwrap();
assert_eq!(true, resp_data.provider_url.is_some());
assert_eq!(resp_data.provider_url.unwrap(), "https://www.threads.com/");
}
}