deepshrink_core/
detect.rs1use std::path::Path;
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq)]
11pub enum MediaKind {
12 Video,
13 Audio,
14 Unsupported,
16}
17
18pub fn detect_kind(path: &Path) -> MediaKind {
20 match path.extension().and_then(|e| e.to_str()) {
21 Some(ext) => classify_extension(ext),
22 None => MediaKind::Unsupported,
23 }
24}
25
26fn classify_extension(ext: &str) -> MediaKind {
27 match ext.to_ascii_lowercase().as_str() {
28 "mp4" | "mov" | "mkv" | "webm" | "avi" | "m4v" | "flv" | "wmv" | "mpeg" | "mpg" | "ts"
29 | "m2ts" | "3gp" => MediaKind::Video,
30 "mp3" | "aac" | "m4a" | "opus" | "ogg" | "oga" | "wav" | "flac" | "wma" | "aiff"
31 | "aif" | "alac" => MediaKind::Audio,
32 _ => MediaKind::Unsupported,
33 }
34}
35
36#[cfg(test)]
37mod tests {
38 use super::*;
39 use std::path::PathBuf;
40
41 fn kind(name: &str) -> MediaKind {
42 detect_kind(&PathBuf::from(name))
43 }
44
45 #[test]
46 fn detects_video() {
47 assert_eq!(kind("clip.mp4"), MediaKind::Video);
48 assert_eq!(kind("movie.MKV"), MediaKind::Video);
49 assert_eq!(kind("/a/b/gameplay.mov"), MediaKind::Video);
50 }
51
52 #[test]
53 fn detects_audio() {
54 assert_eq!(kind("lecture.wav"), MediaKind::Audio);
55 assert_eq!(kind("song.MP3"), MediaKind::Audio);
56 assert_eq!(kind("voice.opus"), MediaKind::Audio);
57 }
58
59 #[test]
60 fn rejects_out_of_scope() {
61 assert_eq!(kind("photo.jpg"), MediaKind::Unsupported);
62 assert_eq!(kind("doc.pdf"), MediaKind::Unsupported);
63 assert_eq!(kind("anim.gif"), MediaKind::Unsupported);
64 assert_eq!(kind("README"), MediaKind::Unsupported);
65 }
66}