mime_type/
audio.rs

1use crate::MimeFormat;
2use std::fmt::{self, Display, Formatter};
3
4/// Audio file formats.
5///
6/// Supports common audio formats including lossy and lossless codecs.
7#[derive(Debug, Clone, PartialEq, Eq)]
8pub enum Audio {
9    /// MIDI audio format
10    Midi,
11    /// MPEG audio (MP3)
12    Mpeg,
13    /// MPEG-4 audio format
14    M4a,
15    /// OGG Vorbis audio format
16    Ogg,
17    /// FLAC lossless audio format
18    Flac,
19    /// WAV audio format
20    Wav,
21    /// AMR audio format
22    Amr,
23    /// AAC audio format
24    Aac,
25    /// AIFF audio format
26    Aiff,
27    /// DSF audio format
28    Dsf,
29    /// APE audio format
30    Ape,
31}
32
33impl Display for Audio {
34    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
35        let mime_str = match self {
36            Audio::Midi => "audio/midi",
37            Audio::Mpeg => "audio/mpeg",
38            Audio::M4a => "audio/m4a",
39            Audio::Ogg => "audio/ogg",
40            Audio::Flac => "audio/x-flac",
41            Audio::Wav => "audio/x-wav",
42            Audio::Amr => "audio/amr",
43            Audio::Aac => "audio/aac",
44            Audio::Aiff => "audio/x-aiff",
45            Audio::Dsf => "audio/x-dsf",
46            Audio::Ape => "audio/x-ape",
47        };
48        write!(f, "{}", mime_str)
49    }
50}
51
52impl MimeFormat for Audio {
53    fn from_ext(ext: &str) -> Option<crate::MimeType> {
54        match ext {
55            "midi" | "mid" => Some(crate::MimeType::Audio(Audio::Midi)),
56            "mp3" => Some(crate::MimeType::Audio(Audio::Mpeg)),
57            "m4a" => Some(crate::MimeType::Audio(Audio::M4a)),
58            "ogg" => Some(crate::MimeType::Audio(Audio::Ogg)),
59            "flac" => Some(crate::MimeType::Audio(Audio::Flac)),
60            "wav" => Some(crate::MimeType::Audio(Audio::Wav)),
61            "amr" => Some(crate::MimeType::Audio(Audio::Amr)),
62            "aac" => Some(crate::MimeType::Audio(Audio::Aac)),
63            "aiff" | "aif" => Some(crate::MimeType::Audio(Audio::Aiff)),
64            "dsf" => Some(crate::MimeType::Audio(Audio::Dsf)),
65            "ape" => Some(crate::MimeType::Audio(Audio::Ape)),
66            _ => None,
67        }
68    }
69
70    fn from_mime(mime: &str) -> Option<crate::MimeType> {
71        match mime {
72            "audio/midi" => Some(crate::MimeType::Audio(Audio::Midi)),
73            "audio/mpeg" => Some(crate::MimeType::Audio(Audio::Mpeg)),
74            "audio/m4a" => Some(crate::MimeType::Audio(Audio::M4a)),
75            "audio/ogg" => Some(crate::MimeType::Audio(Audio::Ogg)),
76            "audio/x-flac" => Some(crate::MimeType::Audio(Audio::Flac)),
77            "audio/x-wav" => Some(crate::MimeType::Audio(Audio::Wav)),
78            "audio/amr" => Some(crate::MimeType::Audio(Audio::Amr)),
79            "audio/aac" => Some(crate::MimeType::Audio(Audio::Aac)),
80            "audio/x-aiff" => Some(crate::MimeType::Audio(Audio::Aiff)),
81            "audio/x-dsf" => Some(crate::MimeType::Audio(Audio::Dsf)),
82            "audio/x-ape" => Some(crate::MimeType::Audio(Audio::Ape)),
83            _ => None,
84        }
85    }
86}