動機
- mp3とflac音楽ファイルのメタデータをどうにかしたい
- Rustで遊びたい
という思いでちょっとだけ遊んでみました。もっと遊ぶかはこれからの気分次第。
とりあえずID3とFlacメタデータについてちょっとだけ調べて、Rustで使えるライブラリを試したことを書きます。
ID3タグ
仕様
http://id3.org/id3v2.3.0 とか
個人で翻訳されたものもあります。(文字コードがsjisなので注意)
http://takaaki.info/works/id3info/
ざっくりとした仕様と実例は下記のような感じ。
- まず10バイトのヘッダーがある。
ID3v2/file identifier | ID3v2 version | ID3v2 flags | ID3v2 size |
---|---|---|---|
I D 3 | 03 00 | 00 | 00 14 3f 7d |
flagsはいろいろ意味があるみたいですがフラグが立っている実例が見当たらなかったです。特に拡張ヘッダーが指定されていると10バイトの次の領域を考慮しなければならなくなりますが、その実例はなかったので今後の研究に任せます。 |
- 次にさっそくフレームが並ぶ
フレームというのがWindowsで言うプロパティと値の組み合わせのようなもの。
1つのフレームの実例を示します。
Frame ID | Size | Flags | body? |
---|---|---|---|
M C D I | 00 00 00 66 | 00 00 | 38 00 ... 00 00 |
T P E 1 | 00 00 00 0b | 00 00 | (01h) \ufeff \u9ed2 \u5d0e \u6714 \u591c |
FrameIDはプロパティの名前のようなもので、必ず4文字みたいです。MCDIは |
4.5 MCDI [#sec4.5 Music CD identifier]
とのこと。
サイズは4バイト。
フラグは例によって00なので説明を割愛。
値のところはbodyというのか何なのか知りません。これが文字列の場合は1バイトコードとか2バイトコードとかを先頭1バイトで指定できるようです。
TPE1の例ではまずUnicodeであることが示され、次はBOMのようです。そして漢字4文字。
Rustのライブラリ
https://github.com/jameshurst/rust-id3 がとりあえず使えそうでした。
上記をそのままcloneして、中にsrc/main.rsを作成してREADME.mdのUsageのコードをぺたっと張り付けて実行すればOKです。
$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.09s
Running `target/debug/id3`
黒崎朔夜
黒崎朔夜
2回出ているのはそういうサンプルコードだから、というだけです。
flacメタデータ
仕様
……ID3で疲れたので詳細は割愛。ID3と違ってofficial toolであるmetaflacがあるのでそれで雰囲気は十分です。metaflacはflacをapt-getしたりするとついでに入ります。
$ metaflac testdata/01.flac --show-tag=TITLE
TITLE=ハツユキカズラ
ライブラリ
https://github.com/jameshurst/rust-metaflac が使えそうです。
cloneしないでUsageのようにCargo.tomlを編集すれば良いです。
が、プログラムがよろしくないので私の例を出します。
extern crate metaflac;
use metaflac::Tag;
fn main() {
let tag = Tag::read_from_path("testdata/01.flac").unwrap();
let key = "TITLE".to_owned();
match tag.get_vorbis(&key) {
None => println!("No field named {}", key),
Some(fld) => println!("{} : {:?}", key, fld),
}
}
実行結果は下記。
$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.04s
Running `target/debug/flac_tag`
TITLE : ["ハツユキカズラ"]
とりあえずはいじょです。