use std::path::Path;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MediaKind {
Video,
Audio,
Unsupported,
}
pub fn detect_kind(path: &Path) -> MediaKind {
match path.extension().and_then(|e| e.to_str()) {
Some(ext) => classify_extension(ext),
None => MediaKind::Unsupported,
}
}
fn classify_extension(ext: &str) -> MediaKind {
match ext.to_ascii_lowercase().as_str() {
"mp4" | "mov" | "mkv" | "webm" | "avi" | "m4v" | "flv" | "wmv" | "mpeg" | "mpg" | "ts"
| "m2ts" | "3gp" => MediaKind::Video,
"mp3" | "aac" | "m4a" | "opus" | "ogg" | "oga" | "wav" | "flac" | "wma" | "aiff"
| "aif" | "alac" => MediaKind::Audio,
_ => MediaKind::Unsupported,
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::path::PathBuf;
fn kind(name: &str) -> MediaKind {
detect_kind(&PathBuf::from(name))
}
#[test]
fn detects_video() {
assert_eq!(kind("clip.mp4"), MediaKind::Video);
assert_eq!(kind("movie.MKV"), MediaKind::Video);
assert_eq!(kind("/a/b/gameplay.mov"), MediaKind::Video);
}
#[test]
fn detects_audio() {
assert_eq!(kind("lecture.wav"), MediaKind::Audio);
assert_eq!(kind("song.MP3"), MediaKind::Audio);
assert_eq!(kind("voice.opus"), MediaKind::Audio);
}
#[test]
fn rejects_out_of_scope() {
assert_eq!(kind("photo.jpg"), MediaKind::Unsupported);
assert_eq!(kind("doc.pdf"), MediaKind::Unsupported);
assert_eq!(kind("anim.gif"), MediaKind::Unsupported);
assert_eq!(kind("README"), MediaKind::Unsupported);
}
}