iPhoneから起動するiTunesのスリープタイマー

就寝時に iTunes の音楽を聴きながら寝たりすることがある。寝室には AirMac Express とスピーカーがあり、iTunes の音源をここから鳴らすことができる。この操作は iPhone の Remote アプリから行うことができるが、スリープタイマーなど存在せず場合によっては朝まで音が鳴りっぱなしなどということが起きてしまう。iPhone 内の音楽も同じように AirMac Express 経由で鳴らすことができるが、この場合は時計アプリのタイマー機能を使うと指定時間経過後に再生を停止することができるようになっている。
以前、Mac のボリュームを iPhone からコントロールする Webアプリを作ったことがある。ApachePHPAppleScript で実現した。これと同じ感じでスリープタイマーが実現できるのではないかと考えて作り始めた。スリープを実現する AppleScript はこんな感じ。

on run argv
    delay argv * 60
    tell application "iTunes"
        stop
    end tell
end run

これをPHPから呼び出す。これだと AppleScript の実行が終わるまで次の画面にいかないだろ、というツッコミはなしでお願いします。動作確認用ということで。

<?php
$minutes = ((int) $_GET['minutes']);
exec("osascript stopiTunes.scpt $minutes");
?>
<script>
  alert("Set timer to <?php echo $minutes; ?> minutes");
  location.replace("setTimer.php");
</script>

実際にはこの前に時間をセットして実行する画面があるが割愛。
これをターミナルから %php execAppleScript.php などとして実行すると指定秒数経過後に iTunes の再生が意図通りに停止する。ところが、Webブラウザで動かすと iTunes が停止しない。delay は機能しているが、tell application のセンテンスが動かないのだ。syslog にはこんなエラーが...

Mar 2 22:03:16 Mac-mini osascript[83121]: spawn_via_launchd() failed, errno=125 label=[0x0-0x35b35b].com.apple.iTunes path=/Applications/iTunes.app/Contents/MacOS/iTunes flags=0

Twitter のつぶやきに反応してくれた人がいて少しやり取りをしたが、セキュリティ上の制約らしく解決策がないようだ。Mac OS X は年々セキュアになっているが、面倒な制約も増えている感じである。普通にアプリケーションを使っている分には気にならないかもしれないが... どなたか解決方法をご存じでしたら教えてください。

仕方がないので次の手を考えることにする。Mac には BetterTouchTool というアプリケーションがインストールされている。元々トラックパッドやマウスの新しいジェスチャやショートカットなどを定義することができるものだったが、どんどん高機能になり iOS アプリの BBT Remote が登場していた。これが使えそうだ。https://www.boastr.net

時間を可変にするのは無理そうなので、とりあえず30分、45分、60分用の AppleScript を用意した。これは 30分版。

delay 30 * 60
tell application "iTunes"
  stop
end tell

これを Better Touch Tool の Preferences で登録する。

すると iPhone の BBT Remote でこう表示されるので、これをタップすると AppleScript が起動する。これでとりあえずの目的は達成された。