ブログトップ
コンピュータと共にある創造的日常
uneoyaji.exblog.jp

メディアアート・プロジェクトにハマったオヤジの日常生活
by une0exct
タグ:AppleScript ( 6 ) タグの人気記事
QuickTime Player で YouTube に自動 Upload
SBArt4 の自動進化機能で全自動的に作成した動画のダイジェスト版を全自動的に YouTube にアップする方法。
まず、QuickTime Player 7 (Pro) でダイジェスト版を自動生成。
これは、わりと簡単で、1つ新規の空のムービーを作っておいて、ダイジェストに入れるべき複数の動画について、それらの一部分ずつをコピペしてから、適当なファイルに保存してやる。スクリプトはこんな感じ。
tell application "QuickTime Player 7"
 activate
  set x to make new document
  repeat with m in 元の動画のパスのリスト
   open m
   tell document 1
    select at 1200 to 4800
    copy
    close
  end tell
  paste x
 end repeat
 save in 保存先のファイル
end tell

7行目の数字はダイジェストに入れる部分の時間の指定です。単位は TimeScale。普通は 600 で一秒が多いかな?つまり、1200から4800ということは2秒目から8秒目までの6秒間をコピーしています。んで、次は自動投稿ですが、QuickTime Player の共有機能で一度YouTube にログインして、情報がキーチェーンに記録されていれば、ログインの部分は省略できます。ということで、以下のスクリプトはログイン省略版です。
tell application "QuickTime Player"
 activate
 open 投稿したい動画のパス
end tell
tell application "System Events"
 tell process "QuickTime Player"
  set win to window 1
  click menu item "YouTube..." of menu "共有" of menu bar item "共有" of menu bar 1
  delay 0.5
  tell sheet 1 of win
   repeat while value of busy indicator 1
    delay 1
   end repeat
  end tell
  delay 1
  tell sheet 1 of win
   keystroke tab
   set the clipboard to 動画につけるのコメントの文字列
   delay 0.5
   keystroke "v" using command down
   keystroke tab
   delay 0.5
   set the clipboard to 動画のタグ
   keystroke "v" using command down
   delay 0.5
   click button "次へ"
  end tell
  delay 2
  tell sheet 1 of win to click button "共有"
  delay 20
  tell group 1 of scroll area 1 of window "書き出しの進行状況"
   repeat while (count progress indicators) > 0 or (count busy indicators) > 0
    delay 2
   end repeat
   delay 2
  end tell
 end tell
end tell
delay 2
tell application "QuickTime Player" to quit saving no

delay の待ち時間は適当です。
[PR]
by une0exct | 2011-10-28 12:34
AppleScript で自動ツイート
AppleScript の System Events を使うとほとんどなんでも自動化できてしまう。というか、そもそも GUI のせいでスクリプトから操作できないアプリが増えて困るという状態が常識化して年久しいわけです。Twitter のクライアントアプリとして MacOS および IOS でも動く Echofon を使ってるのだけど、これが Scripable でないんだ。こういうときの奥の手が System Evens。GUIのエレメントをクリックしたりキー入力したりという指示を AppleScript で書けるわけだから強力この上ない。
activate application "Echofon"
tell application "System Events"
 tell process "Echofon"
   keystroke "ブログにカキコなう"
  keystroke return
 end tell
end tell
これはちゃんと動く。
しかし、英文を入れようとして文章中にスペースをいれると、スペースのところで仮名漢字変換が動いてしまう。入力方法から「ことえり」を外せば、かな文字になることはないが、スペースは入力されないようである。いろいろ思案した挙げ句の解決策は、一旦、clipboard に文字列をコピーしておいてから、Echofon にペーストするというもの。こんなかんじ。
set the clipboard to "writing my blog, now!"
activate application "Echofon"
tell application "System Events"
 tell process "Echofon"
   keystroke "v" using command down
  keystroke return
 end tell
end tell
自分のウェブページを更新したら自動的に呟くように、更新のスクリプトの最後に付け加えるのも悪くないよ。
[PR]
by une0exct | 2011-10-16 15:19
.sdef で SBArt4 を scriptable にしてみる。
SBArt4 をライブパフォーマンスに使えるか? なんてことを考えてみました。たとえば、事前にあるていど品種改良していくつかの良さそうな遺伝子を用意しておき、アニメーションや、必要なら効果音を付けて全画面モードで映像として投影。適当なタイミングでアニメーションや効果音のパラメータをいじって盛り上げる? などなど考えていたら、これりゃ AppleScript で外から制御できるようにすべし!と思い立ったのであります。
以前に開発した DT1 や DT4 も AppleScript 対応にしておりましたが、プログラマ的にいうと MacOS X 10.3 までの標準であった .scriptSuite と .scriptTerminology という2つのリソースファイルを用意するというやり方を取ってました。これらは property list の形式になっているので Xcode に付いてくる property list editor で編集可能でして、それなりに便利だったのですが、ファイルが2つ別れているためもあり、その間の関連を付けるために余計な情報をいれないといけないという面倒さもありました。一応、scriptTerminology の方は言語環境毎に用意するように設計されているのだが、AppleScript 書く人に対しては英語だけでもいいんではないかということもあって、英語版しか作ってなかったので、ファイル1つにしてくれないかなぁという思いもあったわけでありますが、これが 10.4 から登場した .sdef ファイル1つによる記述も可能になっていました。そこで、SBArt4 では、これで実装してみようと思い立ったわけです。
Xcode についてるドキュメント AppleScript Overview を読んでみると、これも XML 形式で、ほぼ AppleScript の概念をそのまんま書けばいい感じなので、早速取りかかりましたよ。というわけで、まだ途中ですが、一部の機能は AppleScript で制御可能となりました。1つ面倒なのは .sdef の中に書いた定義だけが利用可能になるので、Standard Suite とか Text Suite などの記述も、使いたい部分については入れとかないと、ということでしたが、まぁ、逆に考えれば、使えない機能を禁止にできるということでもあるので、いいのかなぁと思い直しました。Standard Suite の必要部分は、/Developer/Examples/Sketch/Sketch.sdef からコピペしました。
しかし、.sdef ファイルは AppleScript Editor で開けるんだが、表示だけで編集できんのが痛い。ソースコードをテキストとして編集すると、ときどき終了タグを書き間違えて、実行時エラーになってしまう。と Google で .sdef editor と入れたら、フリーソフトがありました。名前もそのままずばり SdefEditor。→ http://www.shadowlab.org/softwares/sdefeditor.php
これは、なかなか使えますね。
[PR]
by une0exct | 2010-04-15 21:18
MIDI AE ver. 0
MIDI 入力を AppleScript に変換して、MIDI コントローラでスクリプタブルなアプリをコントロールするアプリ MIDIAE 試作版が一応完成しました。が、しかし、実際にやってみると、レバーやノブの操作に対するアプリ側の反応が遅〜い!
まぁ、MIDIメッセージが来るたびに短い AppleScript をコンパイルするので、しょうがないかと。キーにコマンドを割り付ける方は、結構使えそうです。試しに、ファインダにコマンドを送ってウィンドウをノブで動かしたり、キーを押すとホームフォルダが開くようにしてみました。結構、面白いね。MIDI 入力は Max/MSP とか Quartz Composer でも取り込めるけど、適当に AppleScript に対応させるってのは、いろんなアプリに対応可能という意味で汎用性が高い。これで反応が早けりゃ申し分ないのだが。あれ? Automator って MIDI 入力対応すんのかな?
b0129209_12122989.jpg

[PR]
by une0exct | 2008-05-10 12:14
MIDI コントローラでアプリをコントロール
DT1 群れオーケストラ を MIDI デバイスからコントロールできたらいいのに、というリクエストが複数(2人ですけど)から寄せられまして、確かに、そうすればパフォーマンスなどにも使えるよねということで、どう実現しようか思案した結果、MIDI 入力を Apple Event に変換するという手を思いつきました。
で、早速、アプリの開発に取りかかったのですが、どこまで汎用性を追求するかが問題。
とりあえず、NSAppleScript の initWithSource: で短いスクリプトを作って実行するという、なんとも効率の悪そうなやり方を試し中です。Core MIDI の API を使って MIDI 装置から入ってくるパケットを捕まえ、キーまたはノブに割り当てた AppleScript のコマンドを実行するというものです。
コマンドを割り当てる GUI を NSSplitView と NSTableView を利用して作ってみました。一応 NSDocument を使って、設定を保存できるようにしてます。
b0129209_2215335.gif

[PR]
by une0exct | 2008-05-04 22:19
AppleScript をアプリに埋め込む
3/25 のブログに書いたランダム系列を制御するプログラムは AppleScript で書いたもので、DT4自身のアプリとは独立したモジュールだったんですが、これをアプリに埋め込んで、デフォールトでランダム系列が走るようにしました。
早い話しが、アプリのバンドル・リソースにスクリプトファイルを入れて、実行開始時に別スレッドで、そのスクリプトを実行するわけです。スクリプトが無限ループになってるので、別スレッドにしないとGUIの操作ができなくなってしまうんだなこれが。しかし、API リファレンスには

Important: You should access NSAppleScript only from the main thread.

って書いてあるけど。。。

あと、問題はユーザがランダム系列による制御を停止する方法。無理矢理スレッドを強制終了にする方法もありそうだけど、ここでは、スクリプトから参照可能な read only の属性を仕込んでおいて、アプリのコードの方で、その属性値を変更して、スクリプトの方ではループ内でこの属性を参照して、値が変わってたら exit repeat して、スクリプトを終了するという風にしました。

NSAppleScript なんていう便利なクラスが組み込まれてて、非常に簡単でした。が、ちょっと引っかかったのは、Xcode 3 の Resources のところにスクリプトファイルを追加しても自動的にはアプリのリソースにコピーされず、ターゲットの構築手順にも追加しておかないといけないという点でした。

では、本日の画像:
b0129209_2224575.jpg

[PR]
by une0exct | 2008-03-28 22:26