3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ID3タグとflacファイルメタデータとRust

Last updated at Posted at 2019-05-18

動機

  • 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を編集すれば良いです。
が、プログラムがよろしくないので私の例を出します。

main.rs
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 : ["ハツユキカズラ"]

とりあえずはいじょです。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?