Skip to main content

deepshrink_core/
detect.rs

1//! File-type detection → which engine to use.
2//!
3//! In v0.1 dispatch is by extension: video and audio go to the ffmpeg engine,
4//! everything else (images/PDF/office) is `Unsupported` (out of scope for v0.1).
5//! A more precise container-based check can be added later.
6
7use std::path::Path;
8
9/// Media class used to pick the processing branch.
10#[derive(Debug, Clone, Copy, PartialEq, Eq)]
11pub enum MediaKind {
12    Video,
13    Audio,
14    /// Out of scope for v0.1 (image, PDF, document, unknown extension).
15    Unsupported,
16}
17
18/// Determine the media class from the path's extension.
19pub 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}