ハッシュを活用して音楽ファイル整理だ!

D-Snap用音楽データを改めて作り直していた。
昔作成したものは一部の情報に誤りがあったり、ビットレートがばらばらだったり、
という都合があったので改めて一定のビットレートで作り直した。
少し容量を削減するために96kbpsから80kbpsに変更した。
一時80kbpsで作ってた時期もあったから、多分作り直す前からいくらか含んでたはずだけど。


foobar2000の変換時、ファイル名はその曲のタイトルにするようにしている。
ただ一部同じタイトルの曲があるので、これは○○ (△△).mp3のように、アーティスト名を付けている。
これが少しぶれていて。まぁ片方だけ付いているということもあるのよね。
あと一部の曲でタイトルとファイル名が一致しないことがある。以前のミスですね。
これについても今回の変換時にタイトル通りのファイル名になるのを利用して解決しようと思った。
とりあえず変換と。変換時、ファイル名が重複するとでれば、ファイル名を変更しつつ進めた。


とりあえず完成しました。
ここで変換前のwmaと変換後のmp3のファイル名が一致するか確かめましょうと。
こういう時にはPerlですね。

my %c=();
opendir my $dw,'C:\Music';
m/(.+)\.wma/ and $c{$1}=1 while ($_=readdir $dw);
closedir $dw;
opendir my $dm,'C:\mp3';
m/(.+)\.mp3/ and ($c{$1}+=2)==3 and delete $c{$1} while ($_=readdir $dm);
closedir $dm;
for(sort keys %c){ printf "%-30s %02b\n",$_,$c{$_}; }

ハッシュを使うと案外シンプルに書けます。
wmaがあれば1、mp3があれば2を書き込んで、
最後にmp3について書き込んだ時点で3になってればキーを削除すると。
こうすればそのハッシュの中身を全部表示するだけでいいと。
eachでハッシュを回してもいいけど、ソートしたいからkeysでキーの配列を得てソートしてやってます。
これで%02bというフォーマットで値を表示させてるけど、
wmaだけあれば01、mp3だけあれば10と表示されると。
ハッシュというのはこういう風に使うこともできるんですね。
配列の中にそれがあるかチェックするとか、配列の中からそれを消すとかめんどくさいからね。
ハッシュだったらそれぞれ1回の簡単な動作で済ませられるからね。
これでチェックすると一致しない曲がいくつも。
タイトルと一致していなかったファイルも見つかりました。うまいこと修正できた。
foobar2000がファイル名に使えない文字を置き換えてくれたことによる差も発見できた。
?はファイル名に使えないから_としてくれていたんだよね。これはいわゆる全角文字である?を使っていた。
余談だが、ATOKの設定で日本語入力モードで?と打ってもASCIIの?が出るようにしてるの。
普段は!?とかはASCIIの方を使ってるから。日本語入力OFFにして打つことが多いけど、
さらに確実に統一するためにこうしている。だってこっちの方が使いやすいでしょ。
だから日本語モードに打った上で、さらにF9を押して作ってる。


こんな風にしてwmaの方もきれいに整理できた。
全部変換し終わったかとかの確認のために作ったスクリプトですが、
結構役に立ってます。仕組みも簡単なのですぐ書けますね。
さてと、整理した音楽をD-Snapに転送しますかね。
mp3をそのまま転送するだけだけど、ファイル数が多いので結構時間がかかるんですよ。