Skip to content
Clone
main
60 lines 2.6 KB Rust
use url::Url;
use crate::resolver::{BoxFuture, ResolveContext, Resolver};
use crate::types::MessageEmbed;
use crate::{EmbedKind, UnfurlError};
pub struct RegistryResolver;
impl Resolver for RegistryResolver {
fn matches(&self, url: &Url) -> bool {
crate::resolve::parse(url.as_str()).is_some()
}
fn resolve<'a>(
&'a self,
context: &'a ResolveContext<'_>,
) -> BoxFuture<'a, Result<Vec<MessageEmbed>, UnfurlError>> {
Box::pin(async move {
let resolved = crate::resolve::parse(context.url.as_str())
.ok_or_else(|| UnfurlError::InvalidUrl("unknown platform".into()))?;
let mut embed = MessageEmbed::from_resolved(&resolved);
if resolved.kind == EmbedKind::Link
&& let Ok((final_url, page)) = super::page::resolve_page_final(context).await
{
// 短链落地页命中可直接内嵌的平台时,升级成播放器但保留原始 URL。
if final_url != context.url
&& let Some(landing) = crate::resolve::parse(final_url.as_str())
&& landing.kind != EmbedKind::Link
{
let mut upgraded = MessageEmbed::from_resolved(&landing);
upgraded.url = Some(context.original_url.to_string());
crate::normalize::normalize(&mut upgraded);
return Ok(vec![upgraded]);
}
if let Some(page) = page {
embed.title = page.title.or(embed.title);
embed.description = page.description.or(embed.description);
if embed.image.is_none() {
embed.image = page.image;
embed.image_url = page.image_url;
}
embed.author = page.author.or(embed.author);
embed.provider = page.provider.or(embed.provider);
embed.site_name = page.site_name.or(embed.site_name);
if page.html.is_some() {
embed.html = page.html;
embed.embed_type = page.embed_type;
embed.html_width = page.html_width;
embed.html_height = page.html_height;
embed.src = page.src;
embed.height = page.height;
embed.kind = page.kind;
}
}
}
crate::normalize::normalize(&mut embed);
Ok(vec![embed])
})
}
}