#metadata #mp3 #wav #file-metadata #aiff

id3

用于读取和写入ID3元数据的库

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音频

Download history 4371/week @ 2024-05-03 6807/week @ 2024-05-10 17570/week @ 2024-05-17 20903/week @ 2024-05-24 28355/week @ 2024-05-31 20445/week @ 2024-06-07 14308/week @ 2024-06-14 8604/week @ 2024-06-21 7743/week @ 2024-06-28 20439/week @ 2024-07-05 37070/week @ 2024-07-12 45838/week @ 2024-07-19 26903/week @ 2024-07-26 44435/week @ 2024-08-02 54086/week @ 2024-08-09 42366/week @ 2024-08-16

每月下载量172,110
用于 67 个库 (48个直接使用)

MIT 协议

335KB
7.5K SLoC

rust-id3

Build Status Crate Documentation

用于读取和写入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