mp3_metadata/
enums.rs

1use std::convert::From;
2use std::default::Default;
3use std::fmt;
4
5#[derive(Copy, Clone, Debug, Eq, PartialEq)]
6pub enum Error {
7    FileError,
8    NotMP3,
9    NoHeader,
10    DuplicatedIDV3,
11    InvalidData,
12}
13
14impl fmt::Display for Error {
15    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
16        let err = match *self {
17            Error::FileError => "An I/O error occurred",
18            Error::NotMP3 => "The file is not a valid MP3 file",
19            Error::NoHeader => "The file is missing an MP3 header",
20            Error::DuplicatedIDV3 => "The MP3 file contains a duplicate IDv3 frame",
21            Error::InvalidData => "The MP3 metadata is invalid",
22        };
23        err.fmt(f)
24    }
25}
26
27#[allow(non_camel_case_types)]
28#[derive(Copy, Clone, Debug, Eq, PartialEq)]
29pub enum Version {
30    Reserved,
31    MPEG1,
32    MPEG2,
33    MPEG2_5,
34    Unknown,
35}
36
37impl Default for Version {
38    fn default() -> Version {
39        Version::Unknown
40    }
41}
42
43impl From<u32> for Version {
44    fn from(c: u32) -> Version {
45        match c {
46            0x00 => Version::MPEG2_5,
47            0x01 => Version::Reserved,
48            0x02 => Version::MPEG2,
49            0x03 => Version::MPEG1,
50            _ => unreachable!(),
51        }
52    }
53}
54
55#[derive(Copy, Clone, Debug, Eq, PartialEq)]
56pub enum Layer {
57    Reserved,
58    Layer1,
59    Layer2,
60    Layer3,
61    Unknown,
62}
63
64impl Default for Layer {
65    fn default() -> Layer {
66        Layer::Unknown
67    }
68}
69
70impl From<u32> for Layer {
71    fn from(c: u32) -> Layer {
72        match c {
73            0x0 => Layer::Reserved,
74            0x1 => Layer::Layer3,
75            0x2 => Layer::Layer2,
76            0x3 => Layer::Layer1,
77            _ => unreachable!(),
78        }
79    }
80}
81
82#[derive(Copy, Clone, Debug, Eq, PartialEq)]
83pub enum CRC {
84    /// Redundancy added.
85    Added,
86    /// Redundancy not added.
87    NotAdded,
88}
89
90impl Default for CRC {
91    fn default() -> CRC {
92        CRC::NotAdded
93    }
94}
95
96impl From<u32> for CRC {
97    fn from(c: u32) -> CRC {
98        match c {
99            0x00 => CRC::Added,
100            0x01 => CRC::NotAdded,
101            _ => unreachable!(),
102        }
103    }
104}
105
106#[derive(Copy, Clone, Debug, Eq, PartialEq)]
107pub enum ChannelType {
108    Stereo,
109    JointStereo,
110    DualChannel,
111    SingleChannel,
112    Unknown,
113}
114
115impl Default for ChannelType {
116    fn default() -> ChannelType {
117        ChannelType::Unknown
118    }
119}
120
121impl From<u32> for ChannelType {
122    fn from(c: u32) -> ChannelType {
123        match c {
124            0x0 => ChannelType::Stereo,
125            0x1 => ChannelType::JointStereo,
126            0x2 => ChannelType::DualChannel,
127            0x3 => ChannelType::SingleChannel,
128            _ => unreachable!(),
129        }
130    }
131}
132
133#[derive(Copy, Clone, Debug, Eq, PartialEq)]
134pub enum Copyright {
135    None,
136    Some,
137}
138
139impl Default for Copyright {
140    fn default() -> Copyright {
141        Copyright::Some
142    }
143}
144
145impl From<u32> for Copyright {
146    fn from(c: u32) -> Copyright {
147        match c {
148            0x0 => Copyright::None,
149            0x1 => Copyright::Some,
150            _ => unreachable!(),
151        }
152    }
153}
154
155#[derive(Copy, Clone, Debug, Eq, PartialEq)]
156pub enum Status {
157    Copy,
158    Original,
159    Unknown,
160}
161
162impl Default for Status {
163    fn default() -> Status {
164        Status::Unknown
165    }
166}
167
168impl From<u32> for Status {
169    fn from(c: u32) -> Status {
170        match c {
171            0x0 => Status::Copy,
172            0x1 => Status::Original,
173            _ => unreachable!(),
174        }
175    }
176}
177
178#[derive(Copy, Clone, Debug, Eq, PartialEq)]
179pub enum Emphasis {
180    /// No emphasis
181    None,
182    /// 50/15 Micro seconds
183    MicroSeconds,
184    /// Reserved
185    Reserved,
186    /// CCIT J.17
187    CCITT,
188    Unknown,
189}
190
191impl Default for Emphasis {
192    fn default() -> Emphasis {
193        Emphasis::Unknown
194    }
195}
196
197impl From<u32> for Emphasis {
198    fn from(c: u32) -> Emphasis {
199        match c {
200            0x0 => Emphasis::None,
201            0x1 => Emphasis::MicroSeconds,
202            0x2 => Emphasis::Reserved,
203            0x3 => Emphasis::CCITT,
204            _ => unreachable!(),
205        }
206    }
207}
208
209#[derive(Clone, Debug, Eq, PartialEq)]
210pub enum Genre {
211    Blues,
212    ClassicRock,
213    Country,
214    Dance,
215    Disco,
216    Funk,
217    Grunge,
218    HipHop,
219    Jazz,
220    Metal,
221    NewAge,
222    Oldies,
223    Other,
224    Pop,
225    RAndB,
226    Rap,
227    Reggae,
228    Rock,
229    Techno,
230    Industrial,
231    Alternative,
232    Ska,
233    DeathMetal,
234    Pranks,
235    Soundtrack,
236    EuroTechno,
237    Ambient,
238    TripHop,
239    Vocal,
240    JazzFunk,
241    Fusion,
242    Trance,
243    Classical,
244    Instrumental,
245    Acid,
246    House,
247    Game,
248    SoundClip,
249    Gospel,
250    Noise,
251    AlternRock,
252    Bass,
253    Soul,
254    Punk,
255    Space,
256    Meditative,
257    InstrumentalPop,
258    InstrumentalRock,
259    Ethnic,
260    Gothic,
261    Darkwave,
262    TechnoIndustrial,
263    Electronic,
264    PopFolk,
265    Eurodance,
266    Dream,
267    SouthernRock,
268    Comedy,
269    Cult,
270    Gangsta,
271    Top40,
272    ChristianRap,
273    PopFunk,
274    Jungle,
275    NativeAmerican,
276    Cabaret,
277    NewWave,
278    Psychadelic,
279    Rave,
280    Showtunes,
281    Trailer,
282    LoFi,
283    Tribal,
284    AcidPunk,
285    AcidJazz,
286    Polka,
287    Retro,
288    Musical,
289    RockAndRoll,
290    HardRock,
291    // Extension from here
292    Folk,
293    FolkRock,
294    NationalFolk,
295    Swing,
296    FastFusion,
297    Bebob,
298    Latin,
299    Revival,
300    Celtic,
301    Bluegrass,
302    Avantgarde,
303    GothicRock,
304    ProgressiveRock,
305    PsychedelicRock,
306    SymphonicRock,
307    SlowRock,
308    BigBand,
309    Chorus,
310    EasyListening,
311    Acoustic,
312    Humour,
313    Speech,
314    Chanson,
315    Opera,
316    ChamberMusic,
317    Sonata,
318    Symphony,
319    BootyBrass,
320    Primus,
321    PornGroove,
322    Satire,
323    SlowJam,
324    Club,
325    Tango,
326    Samba,
327    Folklore,
328    Ballad,
329    PowerBallad,
330    RhytmicSoul,
331    Freestyle,
332    Duet,
333    PunkRock,
334    DrumSolo,
335    ACapela,
336    EuroHouse,
337    DanceHall,
338    Something(String),
339    Unknown,
340}
341
342impl Default for Genre {
343    fn default() -> Genre {
344        Genre::Unknown
345    }
346}
347
348impl<'a> From<&'a str> for Genre {
349    fn from(c: &'a str) -> Genre {
350        match c.parse::<u8>() {
351            Ok(nb) => Genre::from(nb),
352            Err(_) => Genre::Something(c.to_owned()),
353        }
354    }
355}
356
357impl From<u8> for Genre {
358    fn from(c: u8) -> Genre {
359        match c {
360            0 => Genre::Blues,
361            1 => Genre::ClassicRock,
362            2 => Genre::Country,
363            3 => Genre::Dance,
364            4 => Genre::Disco,
365            5 => Genre::Funk,
366            6 => Genre::Grunge,
367            7 => Genre::HipHop,
368            8 => Genre::Jazz,
369            9 => Genre::Metal,
370            10 => Genre::NewAge,
371            11 => Genre::Oldies,
372            12 => Genre::Other,
373            13 => Genre::Pop,
374            14 => Genre::RAndB,
375            15 => Genre::Rap,
376            16 => Genre::Reggae,
377            17 => Genre::Rock,
378            18 => Genre::Techno,
379            19 => Genre::Industrial,
380            20 => Genre::Alternative,
381            21 => Genre::Ska,
382            22 => Genre::DeathMetal,
383            23 => Genre::Pranks,
384            24 => Genre::Soundtrack,
385            25 => Genre::EuroTechno,
386            26 => Genre::Ambient,
387            27 => Genre::TripHop,
388            28 => Genre::Vocal,
389            29 => Genre::JazzFunk,
390            30 => Genre::Fusion,
391            31 => Genre::Trance,
392            32 => Genre::Classical,
393            33 => Genre::Instrumental,
394            34 => Genre::Acid,
395            35 => Genre::House,
396            36 => Genre::Game,
397            37 => Genre::SoundClip,
398            38 => Genre::Gospel,
399            39 => Genre::Noise,
400            40 => Genre::AlternRock,
401            41 => Genre::Bass,
402            42 => Genre::Soul,
403            43 => Genre::Punk,
404            44 => Genre::Space,
405            45 => Genre::Meditative,
406            46 => Genre::InstrumentalPop,
407            47 => Genre::InstrumentalRock,
408            48 => Genre::Ethnic,
409            49 => Genre::Gothic,
410            50 => Genre::Darkwave,
411            51 => Genre::TechnoIndustrial,
412            52 => Genre::Electronic,
413            53 => Genre::PopFolk,
414            54 => Genre::Eurodance,
415            55 => Genre::Dream,
416            56 => Genre::SouthernRock,
417            57 => Genre::Comedy,
418            58 => Genre::Cult,
419            59 => Genre::Gangsta,
420            60 => Genre::Top40,
421            61 => Genre::ChristianRap,
422            62 => Genre::PopFunk,
423            63 => Genre::Jungle,
424            64 => Genre::NativeAmerican,
425            65 => Genre::Cabaret,
426            66 => Genre::NewWave,
427            67 => Genre::Psychadelic,
428            68 => Genre::Rave,
429            69 => Genre::Showtunes,
430            70 => Genre::Trailer,
431            71 => Genre::LoFi,
432            72 => Genre::Tribal,
433            73 => Genre::AcidPunk,
434            74 => Genre::AcidJazz,
435            75 => Genre::Polka,
436            76 => Genre::Retro,
437            77 => Genre::Musical,
438            78 => Genre::RockAndRoll,
439            79 => Genre::HardRock,
440            80 => Genre::Folk,
441            81 => Genre::FolkRock,
442            82 => Genre::NationalFolk,
443            83 => Genre::Swing,
444            84 => Genre::FastFusion,
445            85 => Genre::Bebob,
446            86 => Genre::Latin,
447            87 => Genre::Revival,
448            88 => Genre::Celtic,
449            89 => Genre::Bluegrass,
450            90 => Genre::Avantgarde,
451            91 => Genre::GothicRock,
452            92 => Genre::ProgressiveRock,
453            93 => Genre::PsychedelicRock,
454            94 => Genre::SymphonicRock,
455            95 => Genre::SlowRock,
456            96 => Genre::BigBand,
457            97 => Genre::Chorus,
458            98 => Genre::EasyListening,
459            99 => Genre::Acoustic,
460            100 => Genre::Humour,
461            101 => Genre::Speech,
462            102 => Genre::Chanson,
463            103 => Genre::Opera,
464            104 => Genre::ChamberMusic,
465            105 => Genre::Sonata,
466            106 => Genre::Symphony,
467            107 => Genre::BootyBrass,
468            108 => Genre::Primus,
469            109 => Genre::PornGroove,
470            110 => Genre::Satire,
471            111 => Genre::SlowJam,
472            112 => Genre::Club,
473            113 => Genre::Tango,
474            114 => Genre::Samba,
475            115 => Genre::Folklore,
476            116 => Genre::Ballad,
477            117 => Genre::PowerBallad,
478            118 => Genre::RhytmicSoul,
479            119 => Genre::Freestyle,
480            120 => Genre::Duet,
481            121 => Genre::PunkRock,
482            122 => Genre::DrumSolo,
483            123 => Genre::ACapela,
484            124 => Genre::EuroHouse,
485            125 => Genre::DanceHall,
486            _ => Genre::Unknown,
487        }
488    }
489}
490
491impl fmt::Display for Genre {
492    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
493        match self {
494            Self::Something(s) => write!(f, "{}", s),
495            _ => fmt::Debug::fmt(self, f),
496        }
497    }
498}
499
500#[cfg(test)]
501mod tests {
502    use super::*;
503    #[test]
504    fn fmt_genre() {
505        assert_eq!(Genre::Club.to_string(), "Club");
506        assert_eq!(Genre::Something("Foo".to_string()).to_string(), "Foo");
507    }
508}