読者です 読者をやめる 読者になる 読者になる

iTunesで洋楽と邦楽を分ける

僕は洋楽(ここではアメリカ、イギリスの英語詞の歌とします。)と邦楽の両方を聴くのですが、よく「今日は、洋楽だけが聴きたいなぁ」とかその逆があったりします。
マメな方だとiTunesに取り込んだときにそれなりの方法(ジャンルやコメント)で分けていると思いますが、僕は不精者なのでそんなことしてません。
そこで洋楽と邦楽をわけたプレイリストをサクッと作れないかとググってみるもめぼしいのが見つからなかったので作ってみました。

仕組みは単純です。
トラックごとの歌詞データ(事前に取り込む必要あり)にどのくらい英語(アルファベット)が含まれているかを調べて、コメントに[English]ないし[Japanese]と付けるだけです。 その後スマートプレイリストでコメントに[English]を含むプレイリストを作れば分類完了です。

僕はAppleScriptが書けません。
ちょっと見てみましたが僕が今まで触ったことのある
JavaScriptJava,Ruby,VBScriptのどれとも違う雰囲気がぷんぷんします。
覚えるのが面倒だったので現在、勉強中のRubyが使いたいな〜と思っていたらすばらしい物がありました。
RubyOSAっというのを使えばAppleScriptで書けることをRubyで書けるみたいです。

ということで以下のものをインストールしてください。
Ruby ・・・・・標準でインストールされているでしょう。
RubyOSA・・・・http://rubyosa.rubyforge.org/

また、歌詞データが必要ですので取り込んでおいてください。
参考
http://pisces-319.seesaa.net/article/7262306.html
http://homepage.mac.com/nojiri/macosx/tips_etc.html#ituneslyricsst

#!/usr/bin/env ruby
#
#  Created by Stewie on 2007-02-05.

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

itunes = OSA.app('iTunes')

plist = itunes.current_playlist
pl_Array = plist.tracks()

pl_Array.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
}

おまけ

#!/usr/bin/env ruby
#
#  Created by Stewie on 2007-02-05.

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

itunes = OSA.app('iTunes')

plist = itunes.current_playlist
pl_Array = plist.tracks()

pl_Array.each{ |track|
  pre_comment = track.comment()
  puts "曲名「#{track.name}」  コメント#{pre_comment}"
}
  • 簡単な説明

現在再生中(もしくは停止中)のトラックがあるプレイリストの全曲に対して
歌詞に含まれる英数字の割合を算出し、コメントL欄に洋楽の場合、[English]
邦楽の場合[Japanese]と追記します。すでに、存在するコメントは上書きは
しないようにしているつもりです。また、すでに[English]か[Japanese]がコメント欄に書かれている場合はスキップします。
判定基準は僕の書いた正規表現がイマイチなので洋楽であっても100%にはなりません。 僕の環境では65%以上ならほぼ確実に洋楽のようです。

また、こんな判定の仕方なので日本人アーティストが英詩で歌っているものは洋楽と判定します。このあたりは何を洋楽と考えるかなどの個人差があると思います。僕的には”英語の歌と日本語の歌という区分で分けたい”というのが動機だったのでこれでよしとしています。
該当アーティストのコメント欄にあらかじめ[Japanese]などタグ付けしておいてください。

歌詞データの精度(取得具合)に依存します。
僕の環境でも歌詞データにある邦楽アーティストの曲が実際の歌詞が埋め込まれていなくてクレジットのみ(英語表記)だったものは洋楽扱いで分類されていました。

正確な時間は計ってなかったのですが、約2000曲に対する処理の時間が30分以内って感じでしょうか。 遅いです。 寝る前やご飯、お風呂の前に実行することをおすすめします。

  • 今後の課題

洋・邦の判定は2バイト文字が含まれるか否かでも良いかも。2バイト文字が見つかり次第次に移るってのだとどうだろ?

だれか効率の良い書き方(処理)が思いついた方ご教授お願いします。

追記

なぜか最近になってブクマされてたので。
brazilさんにもブクマされててビビッた。
以下
関連エントリです。
2007-02-07 - griffin-stewieの日記
2007-02-09 - griffin-stewieの日記
なんでだろ。 - griffin-stewieの日記