griffin-stewieの日記

2007-12-21

[][][]なんでだろ。

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 #<Array:0x5690a0>


と怒られてしまったので

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秒

2007-02-09

[][][]iTunes洋楽邦楽を分けるWindows

ほとんど使い回しですが・・


WindowsiTunesではCOMオブジェクトを使ってやるといいみたいです。

ほとんどドキュメントを読んでなくてサンプルスクリプトから使えそうなメソッドとか

適当に使って”動けばOK”ってスタンスで作りました。


動作検証もそんなにやってません。

基本的にはiTunesで洋楽と邦楽を分けるちょっと改良してみた

の動作と同じになってるはずです。


選択トラックに対して歌詞中のアルファベット率が65%以上だと”洋楽”と判定します。

事前に歌詞を取得していてください。



var iTunesApp = WScript.CreateObject("iTunes.Application");

var S_Tracks = iTunesApp.SelectedTracks;
var S_tracks_length = S_Tracks.Count;

for(i=1;i<=S_tracks_length;i++){
	var pre_comment = S_Tracks.Item(i).comment;
	if(!pre_comment.match(/\[English\]|\[Japanese\]/)){
		var track_name = S_Tracks.Item(i).name;
		var kashi = S_Tracks.Item(i).Lyrics;
		if(kashi.length == 0){
			WScript.Echo(track_name+"  歌詞がありません");
		}else{
			var moji = 0;
			var alphabet = kashi.match(/[\w']/ig);
//			WScript.Echo(track_name+" は "+kashi.length+" 文字中 "+alphabet.length);
			var par = (parseFloat(alphabet.length) / parseFloat(kashi.length)) * parseFloat(100);
			WScript.Echo(track_name+" は 洋楽度"+Math.round(par)+"%");
			if(Math.round(par) >= 65){
				S_Tracks.Item(i).comment = "[English]" + "\r\n" +pre_comment;
				WScript.Echo(track_name+"  を洋楽に設定");
			}else{
				S_Tracks.Item(i).comment = "[Japanese]" + "\r\n" +pre_comment;
				WScript.Echo(track_name+"  を邦楽に設定");
			}
		}
	}else{
		WScript.Echo(track_name+"  は分類済み");
	}
}

前回のエントリのつづき

iTunesスクリプトメニューから実行したいってやつですが、

rbスクリプトを起動するためのAppleScriptを書いて入れても

Launcher.Appを使ってもスクリプトメニューからだとエラーが出てしまいます。


とりあえず、ターミナルにぶち込むスタイルで行きますorz


動作中のメッセージテキストファイルとして出力してログをとったり

Growlに出力するのも考え中。

2007-02-07

[][][]ちょっと改良してみた

  • 変更点

タグ付け対象をプレイリスト単位ではなく、選択トラックに変更。


前回のはカレントプレイリスト内のトラックに対してタグ付けしていったのですが、

この方法だとライブラリを表示してるときにまちがって実行してしまうと悲惨なことになってしまう。

あと、数曲だけタグ付けしたいって時にわざわざプレイリストを作成しないといけないのが面倒でした。

今回の改良でそのあたりの不便さが解消されているはずです。


  • 苦労したところ


「選択している曲に対して」ということをやるだけでかなりググりまくりました(^^ゞ

RDocに selection() OSA::ITunes::Application っていうのがあったのですが

戻り値がよくわからなかったんです。

で見つけました。

no title




selected_tracks = itunes.selection.get

これで選択トラック配列で返ってきますので煮るなり焼くなりと。


  • 今後の課題


iTunesスクリプトメニューから実行できるようにしたい。

めしにrbファイルのままぶち込んでみたが表示すらされませんでした。orz

AutomatorUNIXコマンドを実行するコマンド部分にターミナルに打ち込んでた文字をコピペしてみたけどエラーorz

だれかいい方法しりませんか?


#!/usr/bin/env ruby
#  SortByLanguage_iTunes_Selection
#  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')

#選択されているトラックを対象とする
selected_tracks = itunes.selection.get

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

2007-02-05

[][][]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の日記

プロフィール

griffin-stewie

griffin-stewie

遂にプログラマの端くれに。ここで述べられていることは私の個人的な意見に基づくものであり、私の雇用者には一切関係ありません。