pub fn is_tenor_url(url: &str) -> bool {
url.starts_with("https://tenor.com/view/")
|| url.starts_with("https://tenor.com/embed/")
|| url.starts_with("https://media.tenor.com/")
}
pub fn extract_tenor_id(url: &str) -> Option<String> {
let trimmed = url.trim_end_matches('/');
if let Some(path) = trimmed.strip_prefix("https://tenor.com/view/") {
return path.rsplit('-').next().and_then(|s| {
if s.chars().all(|c| c.is_ascii_digit()) && !s.is_empty() {
Some(s.to_string())
} else {
None
}
});
}
if let Some(id) = trimmed.strip_prefix("https://tenor.com/embed/")
&& !id.is_empty()
&& id.chars().all(|c| c.is_ascii_digit())
{
return Some(id.to_string());
}
None
}
pub fn tenor_media_url(gif_id: &str) -> String {
format!("https://media.tenor.com/images/{gif_id}/tenor.gif")
}
pub fn resolve_tenor_to_image_url(url: &str) -> Option<String> {
extract_tenor_id(url).map(|id| tenor_media_url(&id))
}