7个版本

使用旧Rust 2015

0.3.5 2017年4月13日
0.3.4 2017年3月9日
0.3.1 2017年2月27日
0.2.1 2017年2月13日

#576 in 音频

MIT 许可证

120KB
2.5K SLoC

为什么

为了学习Rust!

  • 此库用于基于控制台的 ID3 标签工具 Markdang

用法

这是一个 ID3 读写库。

其他用例 查看测试

添加依赖

您可以通过将 rtag 添加到项目中的 Cargo.toml 依赖来使用它。

[dependencies]
rtag = "0.3.5"

并将其添加到crate根目录

extern crate rtag;

读取:如何读取 ID3 信息

要读取 ID3 元数据,您使用一个 MetadataReader 和一个 Unit 枚举。

并且 MetadataReader 实现了 std::iter::Iterator trait,您可以使用 filtermapfold 等等。

示例

// read a frame1
for m in MetadataReader::new("./test-resources/v1-v2.mp3").unwrap() {
    match m {
        Unit::FrameV1(frame) => {
            debug!("v1: {:?}", frame);
            assert_eq!("Artist", frame.artist);
            assert_eq!("!@#$", frame.comment);
            assert_eq!("1", frame.track);
            assert_eq!("137", frame.genre);
        }
        _ => (),
    }
}

// filter a frame v3 having `compression flag`
let mut i = MetadataReader::new(path).unwrap().filter(|m| match m {
    &Unit::FrameV2(FrameHeader::V23(ref header), _) => {
        header.has_flag(FrameHeaderFlag::Compression)
    }
    _ => false,
});

// fold a frame v2
let new_data = MetadataReader::new(path)
    .unwrap()
    .fold(Vec::new(), |mut vec, unit| {
        if let Unit::FrameV2(frame_head, frame_body) = unit {
            let new_frame_body = if let FrameBody::TALB(ref frame) = frame_body {
                let mut new_frame = frame.clone();
                new_frame.text = "Album!".to_string();
                FrameBody::TALB(new_frame)
            } else {
                frame_body.clone()
            };

            vec.push(Unit::FrameV2(frame_head, new_frame_body));
        } else {
            vec.push(unit);
        }

        vec
    });

写入:如何写入 ID3 信息

要写入 ID3 元数据,您通过 FrameHeaderFrameBody 将它们传递给 MetadataWriter,通过 std::vec::Vec

示例

let new_data = MetadataReader::new(path)
    .unwrap()
    .fold(Vec::new(), |mut vec, unit| {
        if let Unit::FrameV2(frame_head, frame_body) = unit {
            let new_frame_body = ...
            vec.push(Unit::FrameV2(frame_head, new_frame_body));
        }

        vec
    });

let _ = MetadataWriter::new(path).unwrap().write(new_data, false);

重写:如何将 ID3 信息重写为版本 4

要将所有帧重写为版本 4,与上述示例相同,但第二个参数为 true

注意:忽略v1帧信息以及一些被忽略的帧。

  • 在2.2节中提到'CRM'、'PIC'。
  • 在2.3节中提到'EQUA'、'IPLS'、'RVAD'、'TDAT'、'TIME'、'TORY'、'TRDA'、'TSIZ'、'TYER'。
// collect frames having version 2
let frames = MetadataReader::new(path).unwrap().collect::<Vec<Unit>>();
// rewrite to version 4
let _ = MetadataWriter::new(path).unwrap().write(frames, true);
// read a version 4
for unit in MetadataReader::new(path).unwrap() {
    match unit {
        Unit::FrameV2(FrameHeader::V24(head), frame_body) => {
            ...
        },
        _ => (),
    }
}

获取没有属性名称的帧体信息。

要读取没有属性名的帧值,FrameBody支持to_mapinside

示例

for unit in MetadataReader::new(path).unwrap() {
    match unit {
        Unit::FrameV2(_, ref frame_body) => {
            
            // 1. using to_map();
            let map = frame_body.to_map();
            //{
            //    <key1:&str>: <value1:String>
            //    ...
            //}

            // 2. using inside
            frame_body.inside(|key, value| {
                // key<&str>, value<String>
                ...

                true // if true, look inside next.
            })

        },
        _ => (),
    }
}

依赖项

~10MB
~202K SLoC