i-mode
Macintosh Page
ホームMacintoshOpenGLThinkPadJavaダイビング水中デジカメ


インデックス

Macintosh

Mac生活

リンク

AppleScript と iTunes - 2 -

はじめに

今年中にと言っていた日本版 iTunes Music Store が予想よりも早く始まりました。早速私も登録して2日で20曲近く購入しました。本当に好きなアーティストの曲はすでに CD で持っているので、買ったのは「欲しいけどアルバムを買う程ではないな」と思っていた曲、「誰が歌っていたのか分からなかった、もしくは曲名が分からな かった曲」などでした。

体験してみて分かったのは IT を駆使したミュージックストアは「ただオンラインで音楽が買える」という以上に楽しいという事でした。ハイパーサーチやブラウズ機能を駆使して楽曲を探し たり、トップ100リストを見てみたり、検索に引っかかった知らない曲を視聴してみたりと様々な方法で音楽を探す事ができます。これこそが正に新しい時代 の音楽の楽しみ方ではないでしょうか。

ただまだまだ無い曲や参加していないアーティストが多く、これからの更なる拡充を期待したい所です。音楽の未来は疑う余地も無くオンラインの方向へ進んでいます。願わくば全てのアーティストが早急にオンライン販売に参加して欲しいものです。

歌詞の検索

前回はローカルコンピュータに歌詞を保存して好きな時に表示するためのスクリプトを紹介しました。今回はインターネットにある歌詞検索サービスを利 用して歌詞を検索するスクリプトを紹介したいと思います。前回のスクリプトと同じ部分については省略して行きますので前回と合わせて読み進めて下さい。前 回と同じ圧縮ファイルに追加のスクリプトが入っています。

iTunes用スクリプト集(tar.gz ファイル)

調べてみた所、歌詞検索サービスにも色々あり、それぞれのサイトで検索方法や表示方法、ユーザー認証の有無等の違いがあるという事が分かりました。 もちろん日本語の曲がメインの日本のサイトと欧米の曲がメインのサイトがあります。そこで検索したいサイトによって別々のスクリプトを作成する事にしまし た。

また、うたまっぷと歌詞GETについては表示がプラグインになっていて歌詞のコピーはできません。この辺り著作権がどういう風になっているのかはよ く分かりませんが、とにかくそれらのサイトについても少なくとも歌詞を参照するためには使えるという事で検索スクリプトを書いてみる事にしました。

Lyrics Search Engine の場合

この検索サービスでは検索ワードは URL に埋め込まれてサーバに渡されています。例えば "song name" で検索した場合、次の用な URL で結果のページが表示されます。

   http://search.lyrics.astraweb.com/?word=song+name

なので同様の URL をスクリプト側で作成してブラウザに渡してやれば検索を実行する事ができます。ただ URL として使えない文字(日本語、特定の記号、空白等)があるので「URL エンコード」と呼ばれる方法で検索語を処理する必要があります。

前半部分は前回の歌詞表示スクリプトと同様に演奏中、もしくは選択された曲を取得しています。少し違っているのは今回はアーティストや曲名のデータが必要なのでトラックだけを取得している点です。

if target_track is not missing value then -- トラックが取得できているかどうかを判定する。
set artist_name to the artist of the target_track -- アーティスト名を取得
set song_name to the name of the target_track -- 曲名を取得
set search_string to artist_name & " " & song_name -- 検索語を作成
do shell script "python -c 'import sys, urllib; print urllib.quote(sys.argv[1])' " & quoted form of search_string -- python で URL エンコードする。
set url_string to the result -- 結果を取得する。
else
error "曲が取得できません"
end if

まずトラックが無事に取得できた事を判定するために target_track と "missing value" を比較しています。"missing value" は変数に値が無い場合を示していて、missing value になっているのに処理を進めるとエラーになる場合があるのでここで比較して処理可能か判定しています。

次にトラックからアーティスト名と曲名を取り出して artist_name, song_name という変数に格納しています。そしてその二つの文字列を空白で結合して検索語 search_string を作成しています。Lyrics Search Engine はフリーワードでの検索なのでアーティスト名と曲名を合わせた文字列で検索すればほとんどの場合ヒットすると考えました。

次の行で先程の「URLエンコード」という処理をしています。調べてみた所、Apple Script には URL エンコードを行う機能が無いようなので、外部のコマンドである python を呼び出しています。

「MacOS X は UNIX ベースである」という事を聞いた事がある人は多いと思いますが、実際にそれが意味する事を理解している人は少ないのではないでしょうか。簡単に言えばそれ は他の UNIX OS と互換性のあるコマンドやプログラミングで使える命令セットが使えるという事です。この python というコマンドもそういった UNIX 系のコマンドなのです。

これらのコマンドを呼び出す時に使うのが "do shell script コマンド" 命令です。do shell script の後に UNIX 環境に実行させたいコマンドを書きます。実行結果(標準出力)は result という変数に入ります。

ここでは python の urllib という機能を使って search_string を URL 形式に変換しています。文字列を UNIX コマンドの渡す場合、直接渡した場合に特定の記号でエラーが起こる場合があるので "quoted form of 文字列" で変換する必要があります。

set url_string to "http://search.lyrics.astraweb.com/?word=" & replace(url_string, "%20", "+") -- URL を作成
tell application "Safari"
activate
open location url_string -- Safari で URL を開く
end tell

次に検索文字列を Lyrics Search Engine の URL と合成して完全な URL を作成しています。ここで前回も使った replace() 関数を使って空白文字を "+" に変換しています。URL エンコードによって空白文字は "%20" に変換されているので実際には "%20" を "+" に変換します。

次に tell application 命令で Safari を呼び出して検索の URL をオープンさせています。URL をオープンさせるには "open location URL" 命令を使います。他のブラウザを使用したい場合にはここを書き換える必要がありますが、その場合はブラウザ特有の命令を使う必要があります。

これで洋楽については歌詞検索が出来るようになりました。続いて日本語サイトの場合について解説したいと思います。

歌ネットの場合

歌ネットの場合はログインが必要です。しかし一度ログインしてあれば直接検索ページに行く事は可能です。またログインしていない場合は「ログインして下さい」というページが表示されるのでログイン作業はユーザに任せてスクリプトで特にログイン処理はしない事にしました。

on wait_load(time_out)
repeat with i from 1 to the time_out -- タイムアウトするまで繰り返す
delay 1 -- 1秒待つ
tell application "Safari"
if (do JavaScript "document.readyState" in document 1) is "complete" then -- ページがロードされたか確認する
return true -- ロードが完了したら true を返して終了。
end if
end tell
end repeat
return false -- タイムアウト時に false を返す。
end wait_load

まず最初に wait_load() という新しい関数が追加されています。これは Safari に URL の表示を指示した後、ページのロードが終了するまで待つための関数です。ネットワークに繋がっていない場合等に処理が終わらないでハングアップしてしまわ ないように関数にタイムアウトまでの時間を秒(time_out)で渡せるようにしてあります。

中では repeat 節で繰り返し処理を行っています。"repeat with カウンタ from 初期値 to 最終値" で初期値から最終値までの回数、節の中の処理を繰り返します。節の中には delay コマンドで1秒待つ処理があるため、ページのロードが完了しなくても、time_out で指定された秒数待った後は自動的に関数は終了します。

節の中では Safari を呼び出してページのロードが終了したかどうか問い合わせています。AppleScript からは直接ページのロード状況を取得する事はできません。そこでここでは "do JavaScript コマンド in document 番号" コマンドで JavaScript を呼び出し、ドキュメントの readyState 属性を取得しています。ここで readyState が "complete" ならページのロードは完了しているので return true で関数を終了します。

repeat が完了するまでページのロードが完了しなかった場合は return false で終了します。帰って来た値でロードが終了したかタイムアウトしたかが分かるようになっています。

本文の最初ではこれまでと同様にトラックの取得をしています。そして取得したトラックの曲名を song_name に取得しています。

tell application "Safari"
open location "http://www.uta-net.com/members/index2.html" -- Safari で検索ページを開く
end tell
wait_load(10) -- ロードの終了を待つ
if result is true then
tell application "Safari" -- 最初のページは検索が失敗するので空の検索を行う
set script_text to "document.KeyForm.MA_text1_de.value=" & "\"\"" -- 検索フィールドを空白にする
do JavaScript script_text in document 1
set script_text to "document.KeyForm.submit()" -- 検索を開始
do JavaScript script_text in document 1
delay 1
end tell

次に歌ネットの検索ページを Safari で開いています。ログインしていない状態だと「ログインして下さい」というページに飛んで終了してしまうのでログインして下さい。次に wait_load() でページが表示されるのを待ちます。

次に検索を行うのですが、この最初のページから曲名での検索をしても何故か歌手名での検索になってしまうという問題があるのでここで空の検索をして 結果ページの検索フィールドを使う事にしました。検索フィールドのセットや検索フォームの submit には JavaScript を使います。

wait_load(10) -- ロードの終了を待つ
if result is true then
tell application "Safari"
activate
set script_text to "top.kensaku_jouken.document.KeyForm.MA_select_ga.selectedIndex=1" -- 曲名検索に切り替える
do JavaScript script_text in document 1
set script_text to "top.kensaku_jouken.document.KeyForm.MA_text1_de.value=" & "\"" & song_name & "\"" -- 曲名をセット
do JavaScript script_text in document 1
set script_text to "top.kensaku_jouken.document.KeyForm.submit()" -- 検索を開始
do JavaScript script_text in document 1
end tell
end if

再び wait_load() でページが表示されるのを待ち、検索フォームをセットして検索を実行します。JavaScript の中に出て来るフレーム名やフォーム名、フィールド名は歌ネットのページのソースを見て調べました。例えば最初の JavaScript は、

top.kensaku_jouken.document.KeyForm.MA_select_ga.selectedIndex=1

となっていますが、これはウインドウのトップ(top)の下にある "kensaku_jouken" フレームの文書(document)に含まれている "KeyForm" という名前のフォームの "MA_select_ga" という名前の選択リストの選択状態(selectedIndex)を1に変更する、という意味です。実際には検索ページの検索条件が「曲名で検索」に変わ ります。

歌マップ、歌詞GETの場合

他の2つの検索サイト対応のスクリプトも基本的には歌ネットの場合と同じです。検索ページを開いてフォームの値をセットして検索を実行しているだけです。

どの検索サイトの場合もタイトルの付け方などによってはヒットしない場合があります。例えば曲名に "・" や "、" が入っていたりアーティスト名の姓と名の間に空白が入っていたりすると検索サイトによってはヒットしない場合があります。そんな場合は検索語を手で修正し て検索してみて下さい。

おわりに

これでインターネットを利用した歌詞の検索、表示に対応する事ができ、私としては満足の行く音楽環境を作る事ができました。既存のアプリケーション やインターネットサービスを簡単なスクリプトで組み合わせる事でコンピュータ生活を劇的に便利にする事ができるという事が分かっていただけたのではないでしょうか。


コンテンツ: [ホーム] [Macintosh] [OpenGL] [ThinkPad] [Java] [ダイビング] [水中デジカメ]

このページについてのご質問はこちらへどうぞ。
このページに用いられている3Dのロゴやボタンは全てGLlogoによってレンダリングされたものです。
このページはリンクフリーです。
著作権等についてはこちらをどうぞ。