WIN32OLEでiPod Shuffleもどき
この間のGWに秋葉原に行ったときにiRiver T30を衝動買いしました。それをiPod Shuffleぽく使ってみたいと思います。偽Pod Shuffle for WSHのような偉大な先人の成果を使うこともできますが、折角なのでRubyのWIN32OLEを使って実装してみます。iTunesのplaylistからランダムに曲をコピーします。カスタマイズは以下のスクリプトの先頭の定数を適当に変更してください。
ファイル: rshuffle.rb
require 'win32ole' require 'fileutils' ITUNES_PLAYLIST = 'ライブラリ' AUDIO_FILE_EXT = 'mp3' AUDIO_AREA_DIR = '.' AUDIO_AREA_MBYTES = 256 module FileUtils module StreamUtils_ # FileUtils.cp speed-up on Windows. def fu_default_blksize 64 * 1024 end end end class Array def randomize self.sort_by{rand} end end class Track def initialize(path, size) @path = path @size = size end attr_accessor :path, :size end def get_tracks_from_itunes(name) itunes = WIN32OLE.new("iTunes.Application") tracks = itunes.LibrarySource.Playlists.ItemByName(name).Tracks rets = [] 1.upto(tracks.Count) do |i| track = tracks.Item(i) next if track.ExcludeFromShuffle rets.push Track.new(track.Location, track.Size) end rets end if $0 == __FILE__ FileUtils.rm_f(Dir.glob("#{AUDIO_AREA_DIR}/*.#{AUDIO_FILE_EXT}")) size = 0 get_tracks_from_itunes(ITUNES_PLAYLIST).randomize.each do |track| next if size + track.size > AUDIO_AREA_MBYTES * 1024 * 1024 size += track.size puts track.path FileUtils.cp(track.path, AUDIO_AREA_DIR) end end
BUGS: UNICODEのパスを扱うことができません。具体的には日本語Windows上ではウムラウトの含まれるパスは扱うことができません。回避策としては、iTunesでウムラウトの含まれるファイル名を手動で修正するか、「詳細」→「ID3タグを変換」を使って、ID3タグのバージョンを下げる必要があります(ID3タグのバージョンを下げると曲名などで扱える文字数が減るなど弊害があります)。
参照: iTunes RDoc [ruby-list:41084] Re: ウムラウトのある文字をファイル名に含むファイルの処理
むー、ウムラウトの制限は痛いです。やっぱおとなしく偽Pod Shuffle for WSHを使うべきかな。