54个版本 (23个稳定版)
1.14.0 | 2024年6月30日 |
---|---|
1.13.1 | 2024年2月26日 |
1.12.0 | 2023年12月30日 |
1.10.0 | 2023年11月16日 |
0.1.6 | 2015年6月6日 |
#4 在 音频
每月下载量172,110
用于 67 个库 (48个直接使用)
335KB
7.5K SLoC
rust-id3
用于读取和写入ID3元数据的库。
实现的功能
- ID3v1读取
- ID3v2.2, ID3v2.3, ID3v2.4 读取/写入
- MP3, WAV 和 AIFF 文件
- Latin1, UTF16 和 UTF8 编码
- 文本帧
- 扩展文本帧
- 链接帧
- 扩展链接帧
- 注释帧
- 歌词帧
- 同步歌词帧
- 图片帧
- 封装对象帧
- 章节帧
- 非同步
- 压缩
- MPEG位置查找表帧
- 唯一文件标识符帧
- 标签和文件修改保留位
示例
读取标签帧
use id3::{Tag, TagLike};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let tag = Tag::read_from_path("testdata/id3v24.id3")?;
// Get a bunch of frames...
if let Some(artist) = tag.artist() {
println!("artist: {}", artist);
}
if let Some(title) = tag.title() {
println!("title: {}", title);
}
if let Some(album) = tag.album() {
println!("album: {}", album);
}
// Get frames before getting their content for more complex tags.
if let Some(artist) = tag.get("TPE1").and_then(|frame| frame.content().text()) {
println!("artist: {}", artist);
}
Ok(())
}
修改任何现有标签
use id3::{Error, ErrorKind, Tag, TagLike, Version};
use std::fs::copy;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let temp_file = std::env::temp_dir().join("music.mp3");
copy("testdata/quiet.mp3", &temp_file)?;
let mut tag = match Tag::read_from_path(&temp_file) {
Ok(tag) => tag,
Err(Error{kind: ErrorKind::NoTag, ..}) => Tag::new(),
Err(err) => return Err(Box::new(err)),
};
tag.set_album("Fancy Album Title");
tag.write_to_path(temp_file, Version::Id3v24)?;
Ok(())
}
创建新标签,覆盖任何旧标签
use id3::{Tag, TagLike, Frame, Version};
use id3::frame::Content;
use std::fs::copy;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let temp_file = std::env::temp_dir().join("music.mp3");
copy("testdata/quiet.mp3", &temp_file)?;
let mut tag = Tag::new();
tag.set_album("Fancy Album Title");
// Set the album the hard way.
tag.add_frame(Frame::text("TALB", "album"));
tag.write_to_path(temp_file, Version::Id3v24)?;
Ok(())
}
处理损坏的文件或没有标签的文件
use id3::{Tag, TagLike, partial_tag_ok, no_tag_ok};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let tag_result = Tag::read_from_path("testdata/id3v24.id3");
// A partially decoded tag is set on the Err. partial_tag_ok takes it out and maps it to Ok.
let tag_result = partial_tag_ok(tag_result);
// no_tag_ok maps the NoTag error variant and maps it to Ok(None).
let tag_result = no_tag_ok(tag_result);
if let Some(tag) = tag_result? {
// ..
}
Ok(())
}
贡献
你认为你找到了一个错误?那么请通过GitHub问题跟踪器报告它。请确保附加任何可以用于重现问题的有问题的文件。这些文件还用于创建回归测试,以确保您的错误永远不会返回。
在提交拉取请求时,请使用 fix:
或 feat:
作为错误修复和新功能的提交信息前缀。这是 常规提交 方案,用于自动化一些维护工作,例如生成更改日志和推断下一个版本号。
运行测试
测试需要 ffprobe
(ffmpeg的一部分) 在 $PATH 中。
cargo test --all-features
依赖项
~0.4–1.8MB
~32K SLoC