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, 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]) }) } }