mp3_metadata/
enums.rs

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