libmirage 0.2.0

Rust bindings for libMirage
Documentation
use libmirage::Context;
use libmirage::LanguagePackType;
use libmirage::prelude::*;
use std::env;
use std::fmt;

mod utils;

fn main() {
    unsafe { libmirage::init() }.expect("mirage should init successfully");

    let context = Context::new();
    let disc = context
        .load_image(&[&env::var("IMAGE_PATH").expect("`IMAGE_PATH` should be set")])
        .expect("image should be loaded");

    for track_index in 0..disc.number_of_tracks() {
        let track = disc
            .track_by_index(track_index)
            .expect("track should exist");
        let length = track.layout_get_length();
        let duration = utils::duration_from_sectors(length);
        println!(
            "track {}, duration: {:?}, isrc: {:?}",
            track.layout_get_track_number(),
            fmt::from_fn(|f| utils::format_duration(f, duration)),
            track.isrc()
        );
        track.enumerate_languages(|language| {
            println!("  language {}", language.code());
            for (name, type_) in LANGUAGE_PACK_TYPES {
                if let Ok(value) = language.pack_data(*type_) {
                    println!("    {name}: {}", String::from_utf8_lossy(&value));
                }
            }
            true
        });
    }
}

static LANGUAGE_PACK_TYPES: &[(&str, LanguagePackType)] = &[
    ("title", LanguagePackType::Title),
    ("performer", LanguagePackType::Performer),
    ("songwriter", LanguagePackType::Songwriter),
    ("composer", LanguagePackType::Composer),
    ("arranger", LanguagePackType::Arranger),
    ("message", LanguagePackType::Message),
    ("discid", LanguagePackType::DiscId),
    ("genre", LanguagePackType::Genre),
    ("toc", LanguagePackType::Toc),
    ("toc2", LanguagePackType::Toc2),
    ("res8a", LanguagePackType::Res8a),
    ("res8b", LanguagePackType::Res8b),
    ("res8c", LanguagePackType::Res8c),
    ("closedinfo", LanguagePackType::ClosedInfo),
    ("upcisrc", LanguagePackType::UpcIsrc),
    ("size", LanguagePackType::Size),
];