iTunesのびっくりマークをなんとかして修復した

最初に書いておきますが、またいつものことながらMac OS X版のiTunesのことを書いているのでWindowsiTunesではあんまり役に立たない記事です。

さて。

たぶんiTunesを10.5にバージョンアップした時か、iPadiOSをバージョン5にアップデートした時かわからないが
同期を行うたびに「元のファイルが見つからないからこの曲は同期されなかったよ」みたいな感じのエラーが。


はてさてどうしたもんかと、その曲を見てみると



なんか画像がちっちゃくなっちゃうんだけど・・・一番左に「!」マーク



びっくりマークがついていますね。
この!マーク、エクスクラメーションマークとか、日本語的には感嘆符と言いますが
個人的にはびっくりマークが好きなので、以下びっくりマークとします。


ちなみに、先のエラーダイアログには「この他に100件ほど」みたいな感じのメッセージが出ていて
詳細を表示させるとほんとに大変な数の曲が行方不明になっているようでした。


標準設定では、iTunesのウインドウにドラッグ&ドロップで追加した曲や、CDから取り込んだ曲というのは
ミュージックフォルダの「iTunes」→「iTunes Music」フォルダにiTunesさんが
アーティスト名でフォルダを作り、更にその中にアルバム名でフォルダを作り、そのさらに中に曲を突っ込むという
整理整頓が得意な主婦のごとく勝手に入れて管理してくれているし
もともと入れる前にデスクトップにあろうが、どこにあろうがココにコピーされているため
iTunes Musicフォルダをどうこうしない限りは元のファイルをどうしようとも、こういう行方不明問題は起こらないはずです。


さて、この問題を抱えている人々が世の中にはたくさんいらしゃるようで
外付けハードディスクにiTunes Musicフォルダを保存するように設定しておいたけど、そのディスクをiTunes
認識できなくなってしまってびっくりマークが、とかそういうケースが大半を占めるようです。


でも、わたしはそういうんじゃなくてデフォルトのまま、起動ディスクに入れるようにしておいたのに。


で、そのびっくりマークがついている曲を再生しようとすると

「元のファイルが見つからなかったため、曲 "なんとかかんとか" は使用できませんでした。元のファイルを探しますか?」

とメッセージが出てきて怒られちゃいます。
「場所を確認」といういかにもコンピュータに探せと指示できそうなボタンがありますが、押すと素っ気ないファイル選択ダイアログが出てきて
「おまえがどっかにやったんだから、おまえが探せよ ホラ」と言われているかのようです。


実際のところ、私の場合は奇跡が起きているのか、ミュージック→iTunesiTunes Music→その曲のアーティスト名→アルバム名→の中にその曲が入っていたので
選択することで何事もなかったかのように再生が始まったのですが
このびっくりマーク付きの曲が100曲以上あるというヤバイ状態。選択していくのはクソめんどいです。
だいたいちゃんと存在するじゃないか。


びっくりマーク付きの曲を右クリック→情報を見るを選択した場合
同じエラーメッセージが登場しますが、「いいえ」をクリックすると曲の情報を参照することができます。


その曲の情報の中には、その曲ファイルがどこに存在しているはずだと思っているかという情報も書いてあって
びっくりマークがついていない場合は、その場所に本当に曲ファイルが存在しています。
びっくりマークがつくのは、その場所に曲ファイルが存在しないから、というわけです。


で、わたしのiTunesはどこに曲があると思っているのか調べて見ました。
対象は同じくびっくりマーク付きの「crankyさんのX-Y-Z "Tiny C mix"」です。


file://localhost/Users/isogame/Music/iTunes111./iTunes Music/cranky/Unknown Album/X-Y-Z_Tiny C mix_.mp3

(゚Д゚)ハァ?


まず実際のフォルダを見てみたらMusicの中に「iTunes111.」が存在しないし、作った覚えもありませんが・・・
あと、Macintosh HD:Users:isogame:Music・・・のような気もしますが、ネットワーク経由で参照しているかのように
localhostとかついていますが、大丈夫でしょうか。
実際大丈夫じゃないみたいで、正常なファイルの場合はこう書いてありました。

例にとったのは「crankyさんのPWRPFF WAVES」。


/Users/isogame/Music/iTunes/iTunes Music/cranly/SPEEDSTER/PWRPFF WAVES.mp3

アルバム名がついていないと見つからなくなるのかとも思いましたが、そうでもない様子でした。
そんでもって「file://localhost/」もないし、それ以降のiTunes111.もありません・・・

解決への道1:あきらめてミュージックファイルを再登録編(やりたくない)

このようなケースでは、びっくりマーク付きのデータを一度削除してハードディスクにある
iTunes Musicフォルダから再登録することで解決するそうです。


ちなみに、曲名をはじめとして、アルバムのアートワークやアーティスト名とかの情報も曲のファイルに
ID3タグとして記録されているのでiTunesから一度削除してしまっても再登録で復活するそうです。


でも、iTunes自身が持っている「追加日」や「曲の再生回数」といったいくつかの情報が失われてしまいます。

イヤです。


念のためやり方は次の通り。ちなみにこの方法はあとの妥協しないやり方で活躍します。

びっくりマーク付きのデータだけ抽出する([http://d.hatena.ne.jp/hetima/20061014/1160815072:title=d.hetima - iTunes のライブラリからファイルが存在しない曲を効率良く取り除く方法] から引用)
(1)プレイリストを作成
(2)ソースリストのミュージックをプレイリストにドラッグ
 プレイリストにミュージックの全曲が入ったかと思ったら実は「!」マーク付きの曲は入らない(ここがミソらしい)
 ただ、見たいのはびっくりマークがついていない曲じゃなくて、ついている曲なので続いて以下の操作。

(3)スマートプレイリストを作成
(4)条件を「プレイリストが」「(さっき作ったプレイリストの名前)」「ではない」でOK
(5)さっき作ったスマートプレイリストにびっくりマーク付きの曲リストが!
   ※ムービーとか入っちゃう場合は「メディアの種類」が「ミュージック」などの条件を追加
(6)びっくりマーク付きの曲を全部選択してOptionキーを押しながらDeleteを押して削除!

(7)先ほど作ったスマートプレイリスト、プレイリストを削除。
(8)自分のホームフォルダ→ミュージック→iTunesフォルダをiTunesのウインドウにドラッグ&ドロップ


でも、これだと再生回数とかの情報が失われるのでやりたくないわけです。(大事なことなので2回言いました)

解決への道2:テキストエディタでファイルパスを書き換え編(失敗した)

さて、びっくりマーク付きの曲を何個か情報を見るで場所を表示させてみましたが
すべて「file://localhost/」で始まり、途中に「iTunes111.」というディレクトリをはさんでいるという共通点があったので



iTunesのデータファイルである「iTunes Music Library.xml」をテキストエディタ(mi)で編集して、その部分を置換で削除すれば と思ったが
最近のiTunesはバイナリデータである「iTunes Library.itl」を参照し、テキスト形式で「iTunes Music Library.xml」に書き出す動作をするそうなので
こちらをいくらいじっても、こちらから読み込まれることはないようです。


だめじゃん。(昔はxmlの書き換えで対処できた気もしたのだが)

解決への道3:AppleScript編その1(また失敗した)

Webで情報収集していたところ、iTunesフォルダを別の場所に移動させたい人用に
AppleScriptを使って選択したミュージックのパスを変更するスクリプトなるものがあるらしくて


これを使って、びっくりマークのついている曲のパスを読み込ませて
「file://localhost/」と「iTunes111.」を削除して、再度書き込む動作をさせれば と思ったが
このスクリプトを使ってパスを読み込むと「missing value」となってしまい、失敗。


びっくりマークがついている曲でも、元々どこにあったかという情報がiTunesの情報を見るウインドウからは参照できるが
Apple Scriptからはびっくりマークがついていると参照できないらしい。
(実際、この特性を利用して、びっくりマーク付きの曲をまとめて削除するという解決への道1を簡単に実行できるとおもわれるスクリプトが存在する)

解決への道4:バグったパスにあわせてファイルを配置してみよう(またまた失敗した)

では、なんとかこの状態で、びっくりマークを解除することができれば
ひとまず再生できるようになって、解決方法3の方法で正しいパスへ自動補正もできて
ハッピーになれるのではないかということで
実際にミュージックフォルダの中に「iTunes111.」を作成して、iTunes Musicフォルダをすべてコピーしてみた



やはり先頭のfile://localhostがあるとお話にならないようで、撃沈。

シンボリックリンクとかも試したが撃沈
※ディスクイメージ上でゴニョゴニョもしてみたが撃沈

解決への道5:半分あきらめた上でAppleScriptで補正 その1(面倒だが解決できた)

ここまでやってみたが、解決には至らず。
しかし、あきらめきれないので100件以上手動で修正するかと
チマチマ一曲一曲丁寧にファイルを再選択していったわけだが、それでも10曲ぐらいで手が止まる。

そこでやってみたのが
(1)びっくりマークはそのままにして、ミュージック→iTunesフォルダをiTunesのウインドウにドラッグ&ドロップ
(2)なにやら処理が始まる
(3)パスがバグってた曲のうちいくつかはパスが修復され、びっくりマークが消えた(!)
(4)しかしほとんどの曲は、びっくりマークが消えず、さらに同名の曲がもうひとつiTunesに追加された
(5)しかも、びっくりマークがついていない曲まで2つに増えてしまうという異常事態


逆に今まで正常だったやつも、2つに増殖してしまって状況が悪化してしまったのではないか。


ちなみにこの方法の概略は:
AppleScriptであとから追加した曲のパス情報をコピーし、びっくりマークがついている曲にパスをコピー。再生回数はリセットせずにもとに戻す。終わったらあとから追加したほうの曲は抹殺」


先ほどAppleScriptで、びっくりマーク付きの曲のパス情報が読めなかったことは記載したが
それでも新しいパス情報を書き込むことは可能なようなので
このような手段をとった。


このとき使ったAppleScriptは次のようなスクリプトだ。

tell application "iTunes"
set file_location to (the location of selection of front browser window)
end tell
display dialog "ファイルパスを" & file_location & "に書き換える曲を選択してOKをクリック"
tell application "iTunes"

set (the location of selection of front browser window) to file_location
end tell

想定された使い方は次の通り。
(前提)iTunesフォルダをiTunesに再登録して、びっくりマーク付きと、びっくりマークがついていない曲が混在している
(1)「ファイル」メニューから「重複する項目を表示」を選ぶ
(2)「曲名」順でならべる
(3)びっくりマークがついていない曲を選ぶ
(4)AppleScriptを実行→正常なパスがコピーされる
(5)びっくりマークがついている曲を選んでからOKを押せというダイアログが現れる
   びっくりマークがついていり曲を選ぶ
(6)OKを押す→びっくりマーク付きの曲に正常なパスがコピーされ使用可能になる
(7)追加日が新しいほう(再生回数が0のほう)を削除

これの3〜7をびっくりマークが付いている曲の数だけ繰り返す。めんどい。

解決への道6:半分あきらめた上でAppleScriptで補正 その2(危険だがもっと楽チンだった)

「解決への道5」に記載されたスクリプトをもうちょっと改良?して手順を幾つか簡略化した。

tell application "iTunes"
repeat
if not (the location of selection of front browser window) as string is equal to "missing value" then
beep
set file_location to (the location of selection of front browser window)
delete selection of front browser window
exit repeat
-- set selectionx_track to a reference to selection of front browser window
end if
end repeat

repeat
if not the selection of front browser window is {} then
exit repeat
end if
end repeat

-- display dialog file_location as string
repeat
if (the location of selection of front browser window) as string is equal to "missing value" then
beep
beep
set (the location of selection of front browser window) to file_location
exit repeat
end if
end repeat

-- delete selectionx_track
end tell

想定された使い方は次の通り。
(前提)iTunesフォルダをiTunesに再登録して、びっくりマーク付きと、びっくりマークがついていない曲が混在している
(1)「ファイル」メニューから「重複する項目を表示」を選ぶ
(2)「曲名」順でならべる
(3)びっくりマークがついていない曲を選ぶ
(4)AppleScriptを実行→正常なパスがコピーされる。警告音が1度鳴る。曲が削除される。
(5)びっくりマークがついている曲を選ぶ→びっくりマーク付きの曲に正常なパスが設定される。警告音が2度鳴る。


この方法では、あとから追加した「パスをコピーしたら用なしの曲」が自動的に削除される。
また、OKボタンをいちいち押さなくても、びっくりマーク付きの曲を選択しただけで勝手にコピーされる。


1曲おわったら、あとは3〜5を繰り返すだけ。
なのだけど、びっくりマークがついていない曲は問答無用でパスをコピー後削除されてしまう仕様のため
(5)が終わったあと、次の曲を選択せずに(3)をやってしまうと
せっかく正常にして、ひとつしか存在しない曲が削除されてしまい、しかもどれが削除されたかもよくわからなくなってしまうというトンデモ仕様。
しかも、そのときに慌てて別の曲を選ぶと勝手にその曲にパスが設定されてしまう。


ヘビーローテーションちんこ音頭へのパスが設定されちゃうとかいうトンデモ事態に発展してしまう。


でもまあ、これを使って根気よく設定しなおしたあと
びっくりマークがついていないのに2つになってしまっている曲について
追加日の新しい方を削除というのを延々繰り返したらなんとか元に戻った・・・かな?


めでたし、めでたし。