いや~はまったわ
昨日、ipod touchが届いた。駅前のK電気に行くと、品切れだというのでアマゾンで買った。値段はK電気と同じくらいだったが、品切れではいかんともしがたい。アマゾンだとまさに2日くらいで届いた。小さな箱に入っていてシンプルな包装であった。この辺がappleのスタイリッシュさなのだろう。
さて本題だが、ipodにiTuneを同期すると、アーティスト名、アルバム名などで区分けされて出てくるので、ここが空欄であるとバラバラに入ってしまう。そこで、このwavファイルに、アーティスト名、アルバム名などを追記しようと思った。
まず手作業で入れることは、実はこれから書くことを全否定するものだが以外と悪くない。単に区分けするだけのものであったならば、iTuneでまとめて選択してから情報を手作業で書き換えると、作業は一回で済む。
参考:
http://setuyakuseikatu.com/ipod/itunes/2-10.html
だが今後のことも考えて出来るようになったところまでは書き残しておきたい。基本的にはRuby関連、Ruby周りで行う。
さてこれがmp3であったならば、タグ情報を書き換えればiTuneに反映される。wavファイルにタグ情報があるか。windows画面では、アーティスト情報、アルバム名、トラック番号などが書かれているため、当然iTunesに反映されるはずであると思うが、それが何故か反映されないのである。
いろいろ調べてみると、どうもwavファイル自体はそれらの情報を保持しておらず、windowsとしてのファイル情報であることが分かった。下はRubyでmp3タグを書き換える際のもので、mp3には通用するが、
危険!!決してこれをwavファイルに使ってはならない。特にエラーは出ないが(ここが恐ろしい)ファイルが破壊されて再生が出来なくなってしまう。
!!危険
CDで元を保持していたりバックアップがあれば安心である。私はバックアップがあったので特に問題なかった。
#! ruby -Ks
require "rubygems"
require "id3lib"
Dir.glob("*mp3").each{|fname|
p fname
tag = ID3Lib::Tag.new(fname)
p tag.album
tag.artist="matsumura"
p tag.title
p tag.artist
tag.album = "cream stew"
tag.artist = "cream stew"
tag.update!
end
}
上は一例である。他のライブラリもあると思うが、簡単だと思う。=で内容を入れて、updateするだけである。
基本的には次のように考えられた。まずiTunesの保持している情報。mp3の保持している情報。windowsのwavファイルが保持している情報。これらが別々にあるが、mp3の情報はiTunesの情報に反映される。windowsのwavファイル情報は反映されない。
よって、windowsのwavファイル情報を吸い出して、iTunesの情報に書き込むという作業が必要となる。
かなり試行錯誤したが、ファイルのプロパティ情報を得る方法は、下のような形になるようだ。(上述の通りこれはiTunesには反映されない)。
#coding: Shitf_JIS
require 'win32ole'
f_name="03 Sonata in C major, Hob. XVI- 50.wav"
obj= WIN32OLE.new('Shell.Application')
objFolder=obj.NameSpace('C:\\Users\\(秘)\\Music')
objFolderItem = objFolder.ParseName(f_name)
(0..99).each{|n|
objInfo = objFolder.GetDetailsOf(objFolderItem, n)
puts "#{n}:-->> "+objInfo.force_encoding("SHIFT_JIS")
}
#ruby 1.9による
上は事例として、f_nameに当たるファイルのプロパティ情報を得るもので、結果は以下のようになる。
0:-->> 03 Sonata in C major, Hob. XVI- 50.wav
1:-->> 25.4 MB
2:-->> Wave サウンド
3:-->> 2009/04/26 10:13
4:-->> 2013/02/13 16:32
5:-->> 2013/02/13 16:32
6:-->> A
7:-->>
8:-->>
9:-->> オーディオ
10:-->> (秘)
11:-->> 音楽
12:-->>
13:-->> Glenn Gould
14:-->> Haydn Piano Sonatas Disc 2
15:-->>
16:-->> Classical
17:-->>
18:-->>
19:-->> 評価なし
20:-->> Glenn Gould
21:-->> Sonata in C major, Hob. XVI: 50
22:-->>
23:-->>
24:-->>
25:-->>
26:-->> 3
27:-->> 00:02:31
28:-->> ?1411kbps
29:-->> いいえ
29以下はほとんど有用な情報はない。上の内容については
http://pnpk.net/cms/archives/1352に書かれている「ファイルプロパティ詳細」が参考になる。が、上と比較するとどうも合わないのはどういうことなのか。
上によれば、必要と考えられるのは。
0:ファイル名
13:アーティスト名
14:アルバム名
16:ジャンル
21:タイトル
26:トラック番号
ということになるだろうか。
いずれにしろこれらの情報が得られれば、ファイル操作はRubyを使って行えばよいから分類等の用に供することは出来るだろう。
***
さてwaveファイルのプロパティ編集は、スクリプトを通してでもそう簡単ではないらしい。フリーソフトで下のようなものがある。
http://hp.vector.co.jp/authors/VA012911/STEP/step.html
上のソフトは非常に良く出来ていて、タグ編集出来るように思えるが、ファイルのプロパティにはそれが反映されていない。もちろんiTunesにも反映されない。何のためかと思うが、winampというソフト(windows用のiTunesみたいなものだといわれている。私はあまり使っていないが)にはどうやら反映されているようである。
winampをよく使っている人なら意味があるが、今回の趣旨からすると、あまり意味がないということになる。
***
さらに調べていくうち、私の目論見はかなり実現が難しいらしいということがわかった。windowsのファイルとして保持しているプロパティ情報は、読み出しは出来るが変更がかなり困難であるということである(ほとんど無理)。
windowsファイルとしてのプロパティ情報はどうもファイルシステムというものの中に管理されているらしく、アンタッチャブルな領域に属しているらしい。ということはつまりCDからwavを読み込ませる際に、情報がうまく書き込まれなかったら(これは良くあるようだ。特に最初と最後のトラック)、それでおしまいであり、後から書き直すことは不可能ということになる。単にwindowsのクソ仕様としか理解しようのないことなんだろうか。
いずれにしてもどうやらそれは無理である、ということは、上の良く出来たソフト(STEP)によって登録した情報を、iTunesに登録時に横流しするということが考えられる。勿論iTunesに直接読み込ませて情報登録することは可能であるが、もしそれならこれ以上読む必要はないだろう。
私としてはSTEPというソフトは大変使いやすいことから、それで登録してそのデータを生かそうと思った。STEPによって作ったリストをCSVの形で出力する。
そして、下のスクリプトによって、iTunesに登録し、一旦登録した後、他のデータ(アーティスト名、アルバム他)を加えるという形を取る。rubu1.9で動作確認した。(RDEで実行)
#coding: Shift_JIS
require "win32ole"
require "csv"
app = WIN32OLE.new('iTunes.Application')
#まずライブラリに登録する。
CSV.open("testlist.csv").each{|i|
begin
app.LibraryPlaylist.AddFile(i[7])
#i[7]にファイルのフルパス情報が入っている
rescue
puts i
end
}
#ここから属性を付け加える。
CSV.open("testlist.csv").each{|i|
#iに1曲分の名前、属性データがarrayとして入っている。
tracks = app.LibraryPlaylist.Tracks
begin
if i[0].include?(".wav")==true
track = tracks.ItemByName(i[0].gsub(".wav",""))
#ItemByNameメソッドはファイル名から拡張子を抜かなければ反応しない。
track.Artist=i[1]
track.Album=i[2]
track.Name=i[3]
track.TrackNumber=i[4]
end
rescue =>exc
p exc
end
}
CSVファイルの配列順序は変わる場合もあるかもしれないので、それぞれ見て変える必要があるだろう。
苦労したがここで終わる。
まとめ
・(少なくともwindows7では)windowsの保持しているwavファイルのプロパティは一部を除き変更できない。だからwindowsのエクスプローラで表示されるアーティスト名などのプロパティ情報は変更出来ないということになる。(データの読み出しは出来る)
・wavファイルのタグが変更できるというソフトは、上の意味でのプロパティを変更するものではなく、またiTuneにも反応しない。
・ただそのソフトの使い勝手は優れたものであるため、タグ情報の管理にはそれを使うことにしてそのソフトによってリストを作成し、データをCSVにして出力し、そのデータを使用してiTunesにリストとして登録するという方法を取った。
*追記
つまりRubyを使わなくとも、もしcsvファイルからiTunesにインポート出来るようなソフトか何かがあればよいということになる。ありそうなもんだがどうか。スクリプトで出来るのだから、出来そうだ。
*追記 2013.4.24
新しいCDを読んで入れようとしたところ、上のスクリプトではCSVmalformedErrorと言うのが出た。下のように書き換えたところ、特に問題なく動くようになったようで、原因は不明だがCSVとしてうまく読み込まれなかったのが原因らしい。
要するに行ごとに区切って、その行を配列として処理していけば良いわけであってRubyのCSVライブラリを敢えて使う必要は無いということになる。この辺は臨機応変に対処すればよいと思う。
*(2013.10.31)下のスクリプトでiTuneのリストに登録されないものが出たので原因を調べていたが、まずwmaファイルはそのままでは登録されないようなのでファイル形式を変換する必要があるのと(通常のやり方ならiTunesが勝手に変換してくれるようだが)
ファイル名等、どこかに,(コンマ)が入っていると、下のスクリプトではそれをCSVセルの区切りと認識してしまうためにおかしな事態が発生する。故に含まれているコンマは予め何か別の、アンダーバーなり何なりに変えておくことが必要となる。
#coding: Shift_JIS
require "win32ole"
require "csv"
app = WIN32OLE.new('iTunes.Application')
File.readlines("itunelist.csv")[1..-2].each{|i|
path = i.split(",")[7].gsub('"',"").chomp
begin
app.LibraryPlaylist.AddFile(path)
rescue
puts path
end
#}
#}
}
File.readlines("itunelist.csv")[1..-2].each{|i|
array = i.split(",").map{|i| i.gsub('"',"").chomp}
tracks = app.LibraryPlaylist.Tracks
begin
if array[0].include?(".wav")==true
track = tracks.ItemByName(array[0].gsub(".wav",""))
#p track.ole_methods
track.Artist=array[1]
track.Album=array[2]
track.Name=array[3]
track.TrackNumber=array[4]
end
rescue =>exc
p exc
end
}