iTunesで再生中のアルバム名をTwitする

Twitterを使い始めた。
基本コンセプトが「今なにしてる?」なわけで、それでは再生中の曲でも自動投稿しようかとiTunes で今聴いている曲を Twitter に送る プラグイン Current Track to Twitter を試してみました - the time ship経由でAppleScriptを入れてみた。
投稿できるようにはなったのだが、曲単位での投稿って結構鬱陶しい。5分かそこらで次々投稿することになるので、Follow数や頻度にもよるがiTunesからの投稿がTwitterを埋め尽くしかねない。
じゃあアルバム単位で投稿すれば問題なかろうと考えた*1。これなら45分間隔ぐらいに落ち着くので鬱陶しくもあるまい。
が、探せど探せどそんなものは発見できない。ならば自分でどうにかしてしまおう。
元がAppleScriptということは、OS付属のスクリプトエディタで編集も可能な筈だ。案の定、開いてソースコードが確認できた。
然程難しいコードでもない。
長いコメント、ちょっとした設定値を経て、処理本体に入る。最初はキーチェーンアクセスからTwitterのアクセスを確立する部分。これはそのまま変更なく使える。
その後の「on idle」が今回書き換えたい部分だ。
大雑把に解説すると、この部分は以下のような流れになっている。

  1. iTunesから曲IDを取得、「前の曲」にセットされた値と比較し違う値になっていたら(新しい曲が始まったと判断して)投稿処理する
    1. 現在の曲IDを「前の曲」変数にセットし、次の曲判断に使えるようにしておく
    2. 曲名・アーティスト名・アルバム名・評価を取得する
    3. 取得した曲データを繋いで文章を作る
    4. それをTwittwerに送信

これを曲単位からアルバム単位に変更するにはどうしたら良いだろうか。


まず、投稿のトリガとなっている「曲IDを比較」の辺りだが、ここは触らずにおいた。iTunesからのデータ取得方法がよく判らないからだ。代わりに1-2以降に「アルバム名を比較し、違っていたら」という条件分岐を作り、これで1-3及び1-4を括ってしまう。こうすることで「曲IDが違っていてもアルバム名が同一なら処理しない」という形を作ることができる。
実際に当該スクリプトを実行した結果と比較すると、アルバム名がalbという変数に格納されていることが判る。ID判定の例に倣い「前のアルバム」をcur_albという変数にセットすることにした。「tell cur_track to set…」でトラック情報を取得している行の次に下記を追加する:
if alb is not cur_alb then
これはifの開始位置なので、終了もセットで用意せねばならない。組み合わせの数が合わないと処理が閉じられずバグになる。この処理を閉じるべき位置は「my send_to_twitter…」の直後だ。ここに
end if
と入れる。
実はこれだけでは動かない。保存したスクリプトを実行してみると「cur_albという変数がありません」とか言われる。そうか、AppleScriptは予め変数を宣言する必要があるのか。
ずっと上に戻ると設定値の下あたりに
global cur_dbid
と曲IDをグローバル変数で宣言している部分があるので、ここに
global cur_alb
と書き加える。
これでもまだ動かない。cur_albの初期値が未定義なのでエラーになってしまうようだ。
on runの終了部分に
set cur_dbid to "" -- init
と曲IDの初期値を宣言する一文がある。これに倣って
set cur_alb to "" -- init
としておく。


ここまでのコードを保存して実行すると、きちんと曲データが投稿される。が、不具合が2点:処理後すぐスクリプトが終了してしまって次以降の曲が投稿されないのと、アルバム単位投稿なのに曲名も表示される点だ。
処理後終了は単に保存時の指定の問題。別名保存で今作ったスクリプトに上書きして「処理後終了しない」にチェックを付けておけばOK。
曲名の方はまたもコードを変更する必要がある。「set message to (preface & … & my make_stars(rat)) as string」という一文があるが、ここが表示される文字列を決める部分になっている。
&は記号前後の文字列をひとつに繋ぐことを意味する。nomというのは曲名、その後の二重引用符に囲まれる部分は変数以外の文字列を意味する。元コードでは投稿文字列に二重引用符を使うために二重引用符内で二重引用符をエスケープしており複雑になっているので、まずはこの二重引用符及びそれに囲まれた部分を削除し、変数を&で繋いだだけの命令文にしてみよう。すると実際に投稿される文字列は「prefaceで設定された文頭+曲名+アーティスト名+アルバム名+レーティング」になる。好きな部分を削り、あるいは区切り文字を付け足してカスタマイズしよう(文字列は二重引用符で括ることを忘れずに)。
保存し直して再度実行(既に実行中なら、スクリプトを終了させて再度起動)して動作を確認のこと。

*1:私は基本的にアルバム単位でしか聴かないので