Skip to content
Clone
main
50 lines 1.4 KB Rust
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<MediaKind> {
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<MediaKind> {
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
}
}