mp3 にアートワークをセットしたい - 答えは eyeD3 でした

command line 上で,mp3 ファイルに画像,itunes で言う 'アートワーク' にデータをセットできないものかと悶々としていた.

当初,以前の radiko の録音 にて,mid3v2 で id3 タグをセットした夢を見たこともあり,同じようにこの書き先にアートワーク用のナニを用意してやればよろしい,と軽く妄想の中でその手続きをふらふらと泳がせておりました.
そんなもんだから,作業としてのモチベーションも高くなく,どうせすぐやっつけられるもの,とずっとうっちゃっていたアイテムだったわけです.

そして昨日,ちょっと radiko の録音に関するワークフローを,もう少し便利にしようとその作業に着手.結構あっさり出来ちゃったので,ついでだし,と "勝手にアートワーク作戦" を遂行したわけです.

こんなイメージ.簡単でしょ?

mid3v2 \
        -t "${titleis}" \
        -a "${artistis}" \
        -A "${albumis}" \
        -g "${ganreis}" \
        -y ${year} \
        (←ここにちょちょっと書く感じ) \
    $mp3file

と こ ろ が っ! こぉれぇがぁでぇきぃなぁうぃ,ってさ!! *1

と,こっからズブズブと深みに沈んでいくことに.
こんなに時間を費やすことになるとは思わなかった :(

答えは eyeD3
id3 タグをいじるための python のツールとのことで,これ使います. 何とこちら homebrew にあったりする! ので brew install eye3D.homebrew では eyeD3_script となっているようです.これに --add-image オプションをかまし,挿したい画を教えれば ok.
答えの具体的な内容は以下に.

id3 タグの 'APIC'

id3 タグ に apic というトコあって,そこにセットしたい画情報を挿し込んでやればよい,というのは直ぐ分かりました.
ちなみに,apic は attached picture の略.
ちなみにちなみに,id3 目線になると apic 等は "フレーム frame" と言うらしいです.*2

そして mid3v2 のドキュメントにはこんなことが.;

Any text or URL frame (those beginning with T or W) can be modified or added by prefixing the name of the frame with "--". For example, --TIT3 "Monkey!" will set the TIT3 (subtitle) frame to Monkey!.

だったらこうでしょ,と妄想が叶ったシーンを想像してちょっと高揚したり... ;

mid3v2 \
        -t "${titleis}" \
        -a "${artistis}" \
        -A "${albumis}" \
        -g "${ganreis}" \
        -y ${year} \
        --APEC ${←こんな感じ} \
    $mp3file

ところが上手くいかない.
ターミナルで試してみると,...

mid3v2 ではできない

確かにおかしい.

% mid3v2 --APIC "mypicture.jpg" mysong.mp3
()[, 0]: , 0 bytes

そしたら,がっかりな事実が.

id3v2 では APIC を指定できても,画像はセットはしないんだそう.
オプションで APIC が使えるようにはしてるけど,それは情報を読み込むだけのものだってさ.

If i read the source of id3v2 correctly, the --APIC commandline switch is read-only: http://id3v2.cvs.sourceforge.net/vie...w=markup#l_610 So no use trying to pipe the image data into id3v2.

mid3v2 は "m" がついた id3v2 なので,一緒.
ちょっとカッとして調べてみたら,本家で --apic つけてよ,に本人が,.... もしや,ちょっとキレ気味 ? :P ;

If mid3v2 is going to support APIC, it should support more functionality - in particular, it should be able to choose which APIC subkey to use, and be able to set the description.

なんだよ,って気分みちみち.

ffmpeg で? id3tool で? id3lib で?

radiko スケジュール録音の作業で id3 タグを書くために幾つかのツールをインストールしてました.

じゃ,この子たちでやれるかも? と,考えたわけです.見てみました.

ffmpeg

なぁんか出来そうな雰囲気があるのですが,見ろと言われてるドキュメント見てもよく分かんないし,ffmeg はアートワーク挿すのには適してないツールね っていうの見て,ここにあまり労力割くのはスマートではないと,それ以上の深追いは止めることに.

id3tools

画を埋めるところか,画を扱うオプションない.文字情報のみみたいです.

id3tag

こちらも同様.画を扱うオプションがないみたいです.

id3v2

これは先述した通り.読みのみ.

lame

--longhelp で見つけたのですが,'ID3 tag options' のセクションにありました.

--ti <file>     audio/song albumArt (jpeg/png/gif file, v2.3 tag)

ところが,たったひとつの id3 タグのために,あらためてエンコード処理をさせるのはちょっと重すぎると思って...
単純に id3 タグの情報をピンポイントで書き換えてくれるだけでいいのに.

むーん...

easy-tags ?

で,色々見ていたら,それ easy-tag ってのがあんだろ,って話が目に留まる.
しかも homebrew でイケル,というではありませんか.きらーん!

available as a homebrew for osx as well. 'brew install easy-tag' – shadowbq Jan 9 at 18:10

easy-tag なんて弱そうな名前なので半信半疑でしたが,何かジャケットを埋める機能もあるみたい.

Can edit more tag fields : Title, Artist, Album, Disc Album, Year, Track Number, Genre, Comment, Composer, Original Artist/Performer, Copyright, URL, Encoder name and attached Picture,

もちろんターミナルからもイケルみたいだし...

brew search easy-tag で見てみると...ホントだ.確かに居ます.ということで brew install easy-tag

-h 見てみてもたいした情報ないだけに,何となく勘でコマンド走らせてみると,エラーがバババっと出てきてこんな感じでビタッと停まる.

EasyTAG 2.1.7: 異常終了しました! (PID: 44833).
シグナル SIGSEGV (11) を受け取りました
EasyTAG でバグと思われるものが見つかりました。gdb によるバックトレースのログ (gdb easytag core して 'bt' と 'l' コマンドの結果) を easytag@gmail.com までメールして下さい。

とこんな感じで i am all at sea ...

そして eyeD3

この辺り見てフラフラしてるんだけど... gui アプリじゃないのだよな,と思ってちょっと見方を変えてみた.
コマンドラインで出来るのは? と,"id3 command line image" あたりキーワードに片っ端から見ているうち,ココに.答えではないのだけど,偶然 related にある 'Seeking command-line example for adding images to MP3 files' を見つけ,良い雰囲気だとクリックしてみる.

するとこの回答のひとつにこんな記載が.

For MP3, try eyeD3, found in this SO answer.

--add-image=IMG_PATH:TYPE[:DESCRIPTION] Add an image to the tag. The description and type optional, but when used, both ':' delimiters must be present. The type MUST be an string that corresponds to one given with --list-image-types. If the IMG_PATH value is empty the APIC frame with TYPE is removed.

"あいでぃーすりー" なんて冴えない駄洒落.したり顔でつけたんだろーな,ふざけた名前だとか思いながら...本家のサイトを必死に読みあさっていたら. ありました!!

homebrew にもあった

そしてそしてあまり期待もせず,brew search eyed3 と放ってみたら返ってきました.すんげーーーー!!
すげーぞ brew.ありがとう brew.つかありがとう世界の皆さん.
いただきます.;

% brew search eyeD3

f:id:wooweezoowee:20130202083606j:plain

かんぱーいっ!!
そういえば,アイコンつきましたよね.いいね.でもなんでジョッキ?

eyeD3 とか eye-d3 じゃなく 'eyeD3_script'

早速,ヘルプ見ようとコマンド叩いたらけど,そんなコマンド無いよ,って言われる."eyeD3" じゃない?! eyed3 とか eyed-3 とか幾つかやってみたけど,どれもだめ.

むん,と,

% brew --prefix eyeD3
/usr/local/opt/eye-d3

eye-d3 でも動かないけど...

% brew --cellar
/usr/local/Cellar
% ls /usr/local/bin/eye*
/usr/local/bin/eyeD3_script
% eyeD3_script -h

eyeD3_scrip が正解みたいです.何ででしょ.というか自分が使い方間違ってるかも...

そしてもう一歩踏み込んで本当に画を貼れるかチェック.;

% eyeD3_script --add-image ~/mypicture.jpg:FRONT_COVER ~/mysong.mp3

mysong.mp3    [ 39.22 MB ]
-------------------------------------------------------------------------------
Time: 34:16    MPEG1, Layer III    [ 160 kb/s @ 48000 Hz - Stereo ]
-------------------------------------------------------------------------------
Adding image /Users/{youaccount}/mypicture.jpg
Writing tag...
ID3 v2.4:
title: タイトル 2013.01.31        artist: アーティスト
album: アルバム        year: 2013
boo
track:         genre: radio (id None)

FRONT_COVER Image: [Size: 268992 bytes] [Type: image/png]
Description: 

きた.

既についているタグもそのまま.
itunes に放ってみると,ちゃんとアタッチされている. 理想通りの動き.画像だけ貼ってくれた.

他の id3 タグも,全部 eyeD3 に任せる?

これはダメでした.

文字情報系は,マルチバイトを受け付けてくれないようです.
日本語が問題なく通るのでしたら,これで全部賄おうと思ったわけですが...惜しい.

ということで,;

  • タイトルやアーティストなど文字情報は mid3v2.
  • アルバムアート (画像) の埋め込みは eyeD3.

ちょっと不細工ですけど.今回はこんなところで.
うーんぜったいもっと奇麗なやり方あるんだろうな.

そういうことで

こんな感じにしました.

というか,あれかな, 構成するファイルとか増えてきちゃったから gist じゃなく,github 上で管理しようかな,考え始め.
というようなのは正解ですか? ... 未だ gist と github の摘み分けの基準に自信無い.

ということで.おしまいです.

*1:この手の話は,以前別件で調べた時の検索結果の雰囲気見ただけでもニーズもあるだろうから,あって当然,的に構えていた分,これが出来ないのには正直ビックリ.

*2:id3 タグ,とかって言うくらいだから,てっきり "タグ" と言っているのかと思っていたら違うらしいです.あっちのドキュメントに目を通していて,最初ちょっと迷ったところ.