なんでだろ。

2007-02-05 - griffin-stewieの日記
このエントリに結構最近になってはてブされているのを知ってびっくりです。
ということでちょっといじってみようかなと思ったのですが・・・。

マルチバイト文字

2007-02-07 - griffin-stewieの日記
このエントリの最後で書いたマルチバイト文字を見つけたら邦楽と判定するというのを
実際に試してみました。


Rubyレシピブック 第2版 268の技
P122を使わせて頂きました。

#!/usr/bin/ruby

begin require 'rubygems'; rescue LoadError; end
$KCODE = "UTF8"
require 'rbosa'
OSA.utf8_strings = true

itunes = OSA.app('iTunes')
utf8 = /[\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3}|[\xf8-\xfb][\x80-\xbf]{4}|[\xfc-\xfd][\x80-\xbf]{5}/xn


#選択されているトラックを対象とする
itunes.selection.each{ |track|
  pre_comment = track.comment()
  puts "曲名「#{track.name}"
  puts "アーティスト名「#{track.artist}"

  if /\[Japanese\]|\[English\]/ =~ pre_comment
    p "分類済み"
    p pre_comment
  else
    p "未分類"
    kashi = track.lyrics()
    if kashi.length == 0
      p "歌詞がありません"
    else
      if utf8 =~ kashi
        p "2Byte文字にマッチ"
        track.comment = "[Japanese]" +"\r\n" + pre_comment
        p "邦楽に設定"
      elsif
        track.comment = "[English]" +"\r\n" +pre_comment
        p "洋楽に設定"
      end
    end
  end
}

以前のスクリプトは以下のようにして選択トラックを取得して
each で回していたのですが

selected_tracks = itunes.selection.get


今回Leopard環境でやると

NoMethodError: undefined method ‘get’ for #


と怒られてしまったので

itunes.selection.each{

get を介さずにそのまま each してみました。

肝心の高速化は?

これと比較してみると
ほとんど変わらない orz
むしろほんのちょっとだけ*1遅くなってる orz

一応、iTunesが起動していなかった時のエラー処理だけ追加した
初期と同じ歌詞内の英数字の出現率で判定するスクリプトを貼っておきます。

#!/usr/bin/ruby
begin require 'rubygems'; rescue LoadError; end
$KCODE = "UTF8"
require 'rbosa'
OSA.utf8_strings = true

itunes = OSA.app('iTunes')

#選択されているトラックを対象とする
begin
  itunes.selection.each{ |track|
    pre_comment = track.comment()
    puts "曲名「#{track.name}"
    puts "アーティスト名「#{track.artist}"

    if /\[Japanese\]|\[English\]/ =~ pre_comment
      p "分類済み"
     p pre_comment
    else
      p "未分類"
      kashi = track.lyrics()
      if kashi.length == 0
       p "歌詞がありません"
      elsif
        count = 0
        kashi.scan(/[a-zA-Z0-9\']/) {
          count += 1
        }

        puts "歌詞サイズ #{kashi.length}"
        puts "アルファベットにマッチ #{count}"
        par = (count.to_f / kashi.length.to_f)*100.to_f
        p "#{par.round}%"
        if par.round >= 65
          track.comment = "[English]" +"\r\n" +pre_comment
          p "洋楽に設定"
        elsif
          track.comment = "[Japanese]" +"\r\n" + pre_comment
          p "邦楽に設定"
        end
      end
    end
  }
rescue Exception => e
  puts "iTunesを起動し、トラックを選択して下さい。"
  puts e
end

*1:0.01~0.03秒