はじめに
iTunes のアートワーク取得について調べたことをメモしておく。
今回は Will Ray の Mojo Blues というアルバムで試した結果である。
- ダウンロードされたアートワークはアーティスト名とアルバム名が等しいトラックで共有される
- コンテキストメニューの "Clear Downloaded Artwork" でトラックに適用されたアートワークをクリアできる
- 適用されるトラックが一つも無いアートワークはファイルそのものが削除される
ダウンロードされたアートワークの保存先(三回試行)
1) [iTunes Libraries]\Artwork\Download\88FC2B033869522C\06\02\09\88FC2B033869522C-3D3E349B28577926.itc2
2) [iTunes Libraries]\Artwork\Download\88FC2B033869522C\05\03\07\88FC2B033869522C-9F531BB56A00D735.itc2
3) [iTunes Libraries]\Artwork\Download\88FC2B033869522C\01\01\05\88FC2B033869522C-A8F7CDB06942B511.itc2
- 保存先及びファイル名はダウンロードのたびに変更される
- アートワークのルートフォルダ 88FC2B033869522C は変わらない
- iTunes Library.xml を見てみると、ルートフォルダ名は Library Persistent ID に等しい
- ファイル名はハイフンで二つのブロックに分けられるが第一ブロックはルートフォルダ名が使われる
- 第二ブロックは末尾の三桁がルートフォルダ以下のサブフォルダ階層に一致する
アートワークのリクエスト先
http://ax.itunes.apple.com/WebObjects/MZStoreServices.woa/wa/coverArtMatch?an=will%20ray&pn=mojo%20blues
- アーティスト名 (an)、アルバム名 (pn)、アルバムアーティスト名 (aan) を検索キーとしたリクエストが送信される
- タグが書き込まれていないフィールドは無視される
- アルバムアーティスト名はアーティスト名に優先される
- 表記のゆれなどで Apple のサーバが管理するアーティスト名やアルバム名と異なる場合、アートワークの取得に失敗する
- 以下のリクエストヘッダが必須となる
User-Agent: iTunes/8.1
X-Apple-Store-Front: 143462-1
143462 は iTunes の環境が日本であることを表す。ちなみに United States は 143441
リクエストが成功すると XML データが返される。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Document xmlns="http://www.apple.com/itms/" disableHistory="true" disableNavigation="true">
<Protocol>
<plist version="1.0">
<dict>
<key>status</key><integer>0</integer>
<key>cover-art-url</key><string>http://a1.phobos.apple.com/us/r10/Music/3e/d6/72/mzi.wszddhko.enc.jpg?downloadKey2=1238211755_d1fa19e59b6e399a2607ac7421013233</string>
<key>request-delay-seconds</key><string>.1</string>
<key>artistName</key><string>Will Ray</string>
<key>playlistName</key><string>Mojo Blues</string>
<key>artistId</key><string>115537179</string>
<key>playlistId</key><string>115537791</string>
<key>matchType</key><string>0</string>
</dict>
</plist>
</Protocol>
</Document>
表記のゆれ
Yngwie J. Malmsteen's Rising Force の "Odyssey" は Apple のサーバでは Yngwie Malmsteen 名義で登録されている。それ故このままではアートワークを取得できない。ローカルプロキシとして Proxomitron を挟み、リクエストを書き換えたら首尾良く取得できた。このあたりをもう少し上手くやれば MP3 に画像を埋め込むことなく、好きなアートワークを iTunes/iPod に反映できるだろう。
[HTTP headers]
In = FALSE
Out = TRUE
Key = "URL: iTunes Artwork"
URL = "ax.itunes.apple.com/*"
Match = "\1Yngwie%20J.%20Malmsteen's%20Rising%20Force\2"
Replace = "$JUMP(\1Yngwie%20Malmsteen\2)"
変更前) an=Yngwie%20J.%20Malmsteen's%20Rising%20Force&pn=Odyssey
変更後) an=Yngwie%20Malmsteen&pn=Odyssey
アートワークの取得
- アートワークは XML データに含まれる cover-art-url キーの URL をリクエストすることで取得できる
- XML データ取得時のようなリクエストヘッダ制限はない
- Content-type は image/jpeg だが、単なる JPEG ファイルではないようだ(ブラウザでは表示不可)
- Artwork フォルダに保存される画像ともデータが異なる(itc ファイルは通常の画像ファイルに Apple が独自のヘッダを追加したフォーマット)
- バイナリデータを覗いてみても JPEG ヘッダは見つからない(圧縮データのような?)
- iTunes が直接取得するデータとは同一である(レスポンスヘッダに含まれる MD5 値が同一であった)
- iTunes は取得したデータを変換(デコード?)後に Artwork フォルダに書き出していると思われる
- XML データのリダイレクト先とアートワークの URL を弄れば面白いことができそうである
解析結果
- XML データは Proxomitron で任意の URL にリダイレクトさせることができた
[HTTP headers]
In = FALSE
Out = TRUE
Key = "URL: iTunes Artwork"
URL = "ax.itunes.apple.com/WebObjects/MZStoreServices.woa/wa/coverArtMatch*"
Match = "*"
Replace = "$JUMP(http://Local.ptron/coverArtMatch.xml)"
XML ファイルは以下のフォルダに置いておく
[Proxomitron]/html/coverArtMatch.xml
- XML データ内の cover-art-url は任意の URL を指定することが可能
- 画像データは JPEG などの通常フォーマットでも問題ないようだ
- よって iTunes のサーバから渡されるデータは不明のままだが、取り立てて支障がないことになる
- 最低限以下の項目があれば iTunes は認識する
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Document xmlns="http://www.apple.com/itms/" disableHistory="true" disableNavigation="true">
<Protocol>
<plist version="1.0">
<dict>
<key>cover-art-url</key>
<string>http://Local.ptron/coverArt.jpg</string>
</dict>
</plist>
</Protocol>
</Document>
最終更新:2009年04月09日 06:27