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を使うべきかな。