use url::Url; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum MediaKind { Image, Video, Audio, } impl MediaKind { pub const fn embed_type(self) -> &'static str { match self { Self::Image => "image", Self::Video => "video", Self::Audio => "audio", } } } pub fn from_url(url: &Url) -> Option { let path = url.path().to_ascii_lowercase(); let dot = path.rfind('.')?; match &path[dot..] { ".png" | ".jpg" | ".jpeg" | ".gif" | ".webp" | ".avif" | ".svg" | ".bmp" | ".apng" | ".heic" | ".heif" | ".tif" | ".tiff" => Some(MediaKind::Image), ".mp4" | ".webm" | ".mov" | ".avi" | ".mkv" | ".m4v" | ".ogv" | ".mpeg" | ".mpg" | ".3gp" | ".3g2" | ".m3u8" | ".ts" => Some(MediaKind::Video), ".mp3" | ".ogg" | ".wav" | ".flac" | ".m4a" | ".aac" | ".opus" | ".weba" | ".oga" | ".aif" | ".aiff" | ".amr" | ".mid" | ".midi" => Some(MediaKind::Audio), _ => None, } } pub fn from_content_type(content_type: &str) -> Option { let value = content_type .split(';') .next() .unwrap_or_default() .trim() .to_ascii_lowercase(); if value.starts_with("image/") { Some(MediaKind::Image) } else if value.starts_with("video/") { Some(MediaKind::Video) } else if value.starts_with("audio/") { Some(MediaKind::Audio) } else { None } }