mp3-metadata 0.4.0

Metadata parser for MP3 files
Documentation
extern crate mp3_metadata;
extern crate simplemad;

use std::time::Duration;

use std::fs::File;

#[test]
fn basic() {
    let meta = mp3_metadata::read_from_file("assets/test.mp3").expect("File error");
    let file = File::open("assets/test.mp3").unwrap();
    let decoder = simplemad::Decoder::decode(file).unwrap();
    let mut sum = Duration::new(0, 0);
    for (i, decoding_result) in decoder.enumerate() {
        match decoding_result {
            Err(_) => {}
            Ok(frame) => {
                if i >= meta.frames.len() {
                    println!(
                        "==> {} > {} {:?} {:?}",
                        i,
                        meta.frames.len(),
                        meta.frames.last().unwrap().duration,
                        frame.duration
                    );
                } else {
                    if meta.frames[i].sampling_freq as u32 != frame.sample_rate {
                        println!(
                            "[{}] [SAMPLE_RATE] {} != {}",
                            i, meta.frames[i].sampling_freq, frame.sample_rate
                        );
                        panic!();
                    }
                    if meta.frames[i].bitrate as u32 * 1000 != frame.bit_rate {
                        println!(
                            "[{}] [BIT_RATE] {} != {}",
                            i,
                            meta.frames[i].bitrate as u32 * 1000,
                            frame.bit_rate
                        );
                        panic!();
                    }
                    if meta.frames[i].duration.unwrap() != frame.duration {
                        println!(
                            "[{}] [DURATION] {:?} != {:?}",
                            i, meta.frames[i].duration, frame.duration
                        );
                        panic!();
                    }
                    if meta.frames[i].position != frame.position {
                        println!(
                            "[{}] [POSITION] {:?} != {:?}",
                            i, meta.frames[i].position, frame.position
                        );
                        panic!();
                    }
                }
                sum += frame.duration;
            }
        }
    }
    if let Some(frame) = meta.frames.first() {
        assert_eq!(frame.size, 417, "frame size");
        assert_eq!(frame.version, mp3_metadata::Version::MPEG1, "version");
        assert_eq!(frame.layer, mp3_metadata::Layer::Layer3, "layer");
        assert_eq!(frame.crc, mp3_metadata::CRC::Added, "crc");
        assert_eq!(frame.bitrate, 128, "bitrate");
        assert_eq!(frame.sampling_freq, 44100, "sampling freq");
        assert!(!frame.padding, "padding");
        assert!(!frame.private_bit, "private bit");
        assert_eq!(
            frame.chan_type,
            mp3_metadata::ChannelType::SingleChannel,
            "channel type"
        );
        assert!(!frame.intensity_stereo, "intensity stereo");
        assert!(!frame.ms_stereo, "ms stereo");
        assert_eq!(frame.copyright, mp3_metadata::Copyright::None, "copyright");
        assert_eq!(frame.status, mp3_metadata::Status::Copy, "status");
        assert_eq!(frame.emphasis, mp3_metadata::Emphasis::None, "emphasis");
    }
    assert_eq!(meta.frames.len(), 475, "number of frames");
    assert_eq!(meta.duration, Duration::new(12, 408162800), "duration");
    assert_eq!(
        meta.tag,
        Some(mp3_metadata::AudioTag {
            title: "Test of MP3 File              ".to_owned(),
            artist: "Me                            ".to_owned(),
            album: "Me                            ".to_owned(),
            year: 2006,
            comment: "test                        ".to_owned(),
            genre: mp3_metadata::Genre::Other,
        }),
        "tag"
    );
    assert_eq!(meta.duration, sum, "time check");
}