#read-write #id3 #json #mp3

bin+lib id3-json

以机器可读的方式读取和写入ID3标签

5个版本

0.2.1 2023年3月11日
0.2.0 2023年1月7日
0.1.2 2022年12月25日
0.1.1 2022年12月24日
0.1.0 2022年12月24日

文件系统类别中排名第546

每月下载量25

MIT许可证

10MB
309

Build Status

ID3-JSON

本项目旨在提供一个简单的方法来读取和写入ID3标签,以保持输入和输出的一致性。我发现现有的工具需要大量工作来解析其输出,并且工作方式不一致,因此我创建了一个新的工具。

本项目的客户端主要是Vim插件:https://github.com/AndrewRadev/id3.vim。但是,没有特别的原因不能用于其他目的。我希望保持工具的通用性,所以如果您需要某些特定的功能,请打开一个github问题。

本项目由出色的Rust crate id3 支持。实际上,标签解析和写入逻辑都在那里——这里的代码主要是将数据从JSON转换成JSON(尽管我做了些假设,见下文Quirks)。

安装

如果您已安装Rust工具链,则可以从crates.io安装它

$ cargo install id3-json

您还可以从GitHub的发布标签页使用您操作系统的预编译二进制文件:https://github.com/AndrewRadev/id3-json/releases

基本用法

使用--help运行程序应该会提供类似的消息。

id3-json 0.2.1

USAGE:
    id3-json [FLAGS] <music-file.mp3>

FLAGS:
    -r, --read       Reads tags from the file and outputs them to STDOUT as JSON.
                     If neither `read` nor `write` are given, will read by default.

    -w, --write      Write mode, expects a JSON on STDIN with valid tag values.
                     If also given `read`, will print the resulting tags afterwards

        --tag-version <ID3v2.{2,3,4}>
                     On write, sets the tags' version to 2.2, 2.3, or 2.4.

    -V, --version    Prints version information

ARGS:
    <music-file.mp3>    Music file to read tags from or write tags to

写入标签的输入应该是有效的JSON,其中“标题”、“艺术家”等作为键。输出将是一个具有“数据”键的JSON对象,其中包含所有这些字段。以下是一些示例输出,使用jq工具进行了美化打印

% id3-json tests/fixtures/attempt_1.mp3 | jq .
{
  "data": {
    "album": "Echoes From The Past",
    "artist": "Christiaan Bakker",
    "comment": "http://www.jamendo.com Attribution 3.0 ",
    "date": null,
    "genre": "(255)",
    "title": "Elevator Music Attempt #1",
    "track": null
  },
  "version": "ID3v2.4"
}

以下是更新标题和曲目编号以及删除流派的方法。工具将在更改后打印标签(因为使用了--read

% echo '{ "title": "[updated]", "track": 1, "genre": null }' | id3-json tests/fixtures/attempt_1.mp3 --write --read | jq .
{
  "data": {
    "album": "Echoes From The Past",
    "artist": "Christiaan Bakker",
    "comment": "http://www.jamendo.com Attribution 3.0 ",
    "date": null,
    "genre": null,
    "title": "[updated]",
    "track": 1
  },
  "version": "ID3v2.4"
}

Quirks

set_year中给“年份”字段的数字似乎是i32类型,但为了简单起见,我假设年份将是正数。

如果标签是ID3v2.4,工具将读取和写入“日期”字段为“录制日期”(TDRL)。请参阅相关的github问题讨论:[https://github.com/AndrewRadev/id3-json/issues/1](https://github.com/AndrewRadev/id3-json/issues/1)。看起来picard和easy tag都使用该字段,这就是我选择它的原因。

目前还不确定,我可能会同时处理“录制日期”和“发布日期”作为单独的字段,尽管我不禁想知道有多少人在意,并且只愿意有“日期”。对于不是v2.4的标签,它将返回TYER标签中的“年份”。

可以有多个带有“描述”、“语言”和“文本”的注释。有关详细信息,请参阅frame::Comment结构。然而,至少在我的个人音乐库中,几乎所有mp3文件都包含一个描述为""的单一注释。其中一些还有一个标记为""ID3v1 comment""的注释。

为了简化起见,我决定让id3-json读取和写入带有描述""的那个注释。所有其他注释都应保留,所以如果其他东西读取它们,它们仍然应该按预期工作。

潜在的未来更改

目前,此接口对我有效,但如果其他人需要在没有我的某些设计选择的情况下使用它,可以实施一个--raw--full选项,以最小处理直接读取和写入框架,并留由工具的用户来决定如何管理它们。

批量处理是另一个我可以采取的方向,返回一个JSON数组,每个文件名都有一个条目(或一个具有文件名为键的对象),在写入时,期望相应的数组/对象。

还可以读取/写入大量其他元数据,我选择的特定字段只是我从不同的实用程序使用的。

测试音乐

依赖项