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 音频
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,您可以使用 filter、map、fold 等等。
示例
// 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
元数据,您通过 FrameHeader 和 FrameBody 将它们传递给 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_map
和inside
。
示例
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