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次
10MB
309 行
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数组,每个文件名都有一个条目(或一个具有文件名为键的对象),在写入时,期望相应的数组/对象。
还可以读取/写入大量其他元数据,我选择的特定字段只是我从不同的实用程序使用的。