04/21 iPhoto, iTunes, Safariアップデートについて
iPhoto 9.2.3、iTunes 10.6.1、Safari 5.1.5の各アップデートが提供されていますが、これらのアプリケーションのAppleScript用語辞書に変更はありません。
iPhoto 9.2.3、iTunes 10.6.1、Safari 5.1.5の各アップデートが提供されていますが、これらのアプリケーションのAppleScript用語辞書に変更はありません。
InDesign CS3上で指定したオブジェクトをJPEG書き出ししてiPhoneに転送するAppleScriptです。
ことのはじまりは、目下開発中のiPhoneアプリ(私はプロジェクト管理やら仕様書書きやらを)で、Welcome画面の表示を行うのに「文字詰めや行送りをいろいろ指定できないと!」という話になったこと。
……そもそも、iPhoneの文字表示部品に、そんな気の利いたものはありません。そこで、InDesignやらIllustrator上で気の済むまで行間や文字間にこだわっていただいて、それをそのまま「画像」として書き出して表示しようではないか、と。
ただし、その指定内容をすぐにiPhoneの実機で見たいという話に。
その場で10分もかけずにInDesign書類上の指定レイヤー(「コンテンツ」)上に存在する指定名称(スクリプトラベル「screen」)のグループをJPEG書き出しして、書き出したJPEG書類をiPhotoにインポートして、iTunesに命令して接続しているすべてのiOSデバイスにシンクロを行うようAppleScriptで指令を出すようにしてみました。
できた瞬間はかなりガッツポーズでしたが、冷静に考えるとInDesignから書き出されるJPEG画像のクオリティが「残念なレベル」です。また、シンクロが終わるまでにちょっと時間がかかるので、実用性がいまひとつ。
結局、Good Reader for iPhoneをインストールして、iTunes経由でGood Readerに対してInDesignから書き出したPDFを渡す、という方法に落ち着きました。本Scriptは何らかの「可能性」を感じさせてくれはしたのですが、結局おクラ入りに。
| スクリプト名:InDesign CS3で指定のオプジェクトを、JPEG書き出ししてiPhoneへ |
| –v1 InDesign CS3から直接JPEG書き出し。画像クオリティが低くて難あり
set dtPath to (path to desktop) as string set fName to do shell script "date +%Y%m%d%H%M%S" set fullPath to dtPath & fName & ".jpg" set fullPathPOSIX to POSIX path of fullPath tell application "Adobe InDesign CS3" tell document 1 tell layer "コンテンツ" set aList to every group whose label is equal to "screen" end tell set expItem to contents of first item of aList export expItem format JPG to fullPath without with grids end tell end tell –iPhotoに書き出したJPEGファイルをインポートする tell application "iPhoto" import from fullPathPOSIX end tell –アップデート可能なiOSデバイスをアップデートする tell application "iTunes" repeat with i in sources if (kind of i is iPod) then update i end repeat end tell |
Xcodeのバージョン4.2.1、およびiTunesのバージョン10.5.1が登場しています。
ともにAppleScript用語辞書の内容に変更はありません。
バンドルIDを指定してアプリケーションのパスを求め、その中のローカライズ文字列テーブルから指定ラベルに該当する文字を取り出すAppleScriptの改良版です。
プロセスを確認して、起動中であればプロセスから情報を取得。起動中ではない場合には、Finder経由で実行ファイルのパスを求めるようにしています。
| スクリプト名:指定アプリの指定タグの文字列をアプリ内のLocalizableStringsから取得する v3 |
set aRes to retLocalizedStringFromApp("135.006", "com.apple.itunes") of me –> "ライブラリ"–Japanese –> "LIBRARY"–English –> "BIBLIOTHÈQUE"–French –> "资料库"–Simply Chinese –> "資料庫"–Traditional Chinese –> "MEDIATHEK"–Deutsch –指定バンドルIDのアプリケーション内のResourcesフォルダの中の現在のロケールのフォルダ内のLocalizable.strings内の指定タグに対応する値を取得 –iTunesのような「不適切なローカライズ」に対応するために、リソース内のローカライズデータからオブジェクト名を取得 on retLocalizedStringFromApp(locLabel, bundleID) set pRes to retExistenceOfProcessByBundleID(bundleID) of me if pRes is not equal to false then –指定Bundle IDのプロセスが起動していた場合 tell application "System Events" tell pRes set appFile to application file end tell end tell else –指定Bundle IDのプロセスが起動していなかった場合 tell application "Finder" try set appFile to application file id bundleID on error return end try end tell set appFile to appFile as alias end if set aStr to localized string locLabel in bundle appFile end retLocalizedStringFromApp –指定のバンドルIDのプロセスが起動していればプロセスへの参照を返す、なければfalseを返す on retExistenceOfProcessByBundleID(bundleID) tell application "System Events" set aProc to every process whose bundle identifier is equal to bundleID if aProc = {} then return false set aProc to contents of first item of aProc return aProc end tell end retExistenceOfProcessByBundleID |
本ルーチンを使って、iTunesの「ライブラリ」に該当する文字列を取り出すテストを行い、実際に使用ユーザー環境の言語を変更してログインし直し、各言語で動作確認を行ってみました。
| スクリプト名:iTunes_control_Japanese |
| tell application “iTunes” tell source “ライブラリ” tell playlist “ライブラリ” count every track end tell end tell end tell |
| スクリプト名:iTunes_control_English |
| tell application “iTunes” tell source “LIBRARY” tell playlist “LIBRARY” count every track end tell end tell end tell |
| スクリプト名:iTunes_control_Deteuch |
| tell application “iTunes” tell source “MEDIATHEK” tell playlist “MEDIATHEK” count every track end tell end tell end tell |
| スクリプト名:iTunes_control_French |
| tell application “iTunes” tell source “BIBLIOTHÈQUE” tell playlist “BIBLIOTHÈQUE” count every track end tell end tell end tell |
| スクリプト名:iTunes_control_Chinese (simplified) |
| tell application “iTunes” tell source “资料库“ tell playlist “资料库“ count every track end tell end tell end tell |
| スクリプト名:iTunes_control_Chinese (traditional) |
| tell application “iTunes” tell source “資料庫” tell playlist “資料庫” count every track end tell end tell end tell |
……で、冒頭のScriptを使うと、これらの各言語環境ごとにバラバラのオブジェクト名を記述しなければならなかった部分が、1本のScriptでカバーできるはずです。
| スクリプト名:指定アプリの指定タグの文字列をアプリ内のLocalizableStringsから取得する v3.1 |
| –すべての言語環境でこのプログラムに統一できるはず set aRes to retLocalizedStringFromApp(“135.006″, “com.apple.itunes”) of me tell application “iTunes” tell source aRes tell playlist aRes count every track end tell end tell end tell –指定バンドルIDのアプリケーション内のResourcesフォルダの中の現在のロケールのフォルダ内のLocalizable.strings内の指定タグに対応する値を取得 –iTunesのような「不適切なローカライズ」に対応するために、リソース内のローカライズデータからオブジェクト名を取得 on retLocalizedStringFromApp(locLabel, bundleID) set pRes to retExistenceOfProcessByBundleID(bundleID) of me if pRes is not equal to false then –指定Bundle IDのプロセスが起動していた場合 tell application “System Events” tell pRes set appFile to application file end tell end tell else –指定Bundle IDのプロセスが起動していなかった場合 tell application “Finder” try set appFile to application file id bundleID on error return end try end tell set appFile to appFile as alias end if set aStr to localized string locLabel in bundle appFile end retLocalizedStringFromApp –指定のバンドルIDのプロセスが起動していればプロセスへの参照を返す、なければfalseを返す on retExistenceOfProcessByBundleID(bundleID) tell application “System Events” set aProc to every process whose bundle identifier is equal to bundleID if aProc = {} then return false set aProc to contents of first item of aProc return aProc end tell end retExistenceOfProcessByBundleID |
Amazonダウンローダー内でAppleScriptを使っている箇所があり、案の定、オブジェクト名までローカライズされているiTunesの特性を理解せずに作られているために、日本語環境ではまともに動かなくて大笑いしましたが……このような悲劇が起こらないように、いろいろ考えておりました。
結局のところ、アプリケーションのバンドル内のResourcesフォルダの各言語フォルダの中に入っているLocalizable.stringsファイル内から該当するデータを取り出せればよいのだろうか、と考えました。

そこで、実際にLocalizable.stringsを調査して、実際にオブジェクト名に該当するものを探しだし、ラベルを指定して取り出せるようにしてみました。
Localizable.stringsには文字定数とか画面に表示する文字列なんかを入れておくわけで、このケースでも画面上に「ライブラリ」と表示するためのデータが格納されているわけですが、それがAppleScriptのオブジェクト名と同じであるために、結果オーライで取り出してみることにしました。
本バージョンでは、アプリケーション名とLocalizable.strings内のラベルを指定します。対象のアプリケーションが起動していることが実行条件です。
| スクリプト名:指定アプリの指定タグの文字列をアプリ内のLocalizableStringsから取得する |
set aRes to retLocalizedStringFromApp(“135.006″, “iTunes”) of me on retLocalizedStringFromApp(locLabel, appName) launchAnApp(appName) of me tell application “System Events” set aProc to process appName if aProc = “” then return tell aProc set appPath to application file end tell end tell set aStr to localized string locLabel in bundle appPath –ライブラリ end retLocalizedStringFromApp on launchAnApp(appName) tell application appName to launch end launchAnApp |
iCloudへの対応など新機能を盛り込んだiTunes 10.5が公開されました。さっそく、AppleScript用語辞書を前バージョンのiTunes 10.4.1と比較してみたところ、差異はとくにありませんでした。
本日、β版が公開されたiTunes 10.3のAppleScript用語辞書を現行のiTunes 10.2.2と比較してみたところ、変更点がないことを確認しました。
いろんな意味で、ドキドキさせられます。
追記:
iTunes 10.3.1βでもAppleScript用語辞書には変更はありませんでした。
ソフトウェア・アップデート経由でiTunes 10.1アップデートがリリースされました。早速、AppleScript用語辞書をHTMLに書き出して前バージョンとのdiffを取ってみたところ、とくに変更はありませんでした。
最近では、iTunes 7.6.2と9.1で変更(追加)があったぐらいで、用語辞書にはほとんど変更はありません。
iTunesで選択中のtrackのうち、再生済みのものを削除するAppleScriptです。
Podcastで、ダウンロード先が変更になって……それを知らずにすべてのエピソードをダウンロードしてしまった場合、すべてのエピソードが2つ存在してしまいます。

こういうケースでは、旧ダウンロード先から落としてきたエピソード(再生ずみ)を削除し、新ダウンロード先のtrackを残しておくことになるわけで……そのために、再生ずみのtrackのみ削除するAppleScriptを作成したものです。
iTunesといえば、Amazonダウンローダー内でAppleScriptによりtrackの追加を行っているものの、ライブラリ名を英語で書いてしまったため日本語環境でうまく動いていないという悲劇がそこかしこで報告されています。日本語環境できちんと動作検証しないでリリースしてしまったAmazonに合掌(iTunes上でのオブジェクト名を日本語環境に合わせて書き直さないといけない、という間抜けな仕様を作ったAppleにも合掌)。

| スクリプト名:選択中のtrackのうち再生済みのものを削除する |
| tell application “iTunes” set aList to selection repeat with i in aList set aP to unplayed of i if aP = false then ignoring application responses delete i end ignoring end if end repeat end tell |
9/1の発表会で紹介され、その日……のうちギリギリで? ダウンロード可能になったiTunes 10。インストールして真っ先に行うのはAppleScript用語辞書が変更されているかのチェック。大規模な変更があった場合には、さまざまなプログラムを山ほど書き直さなくてはなりません。


HTMLに書き出して比較してみたところ、前バージョンからとくに変更点はない(0箇所)ということが分りました。
とりあえず、辞書上では変更がないということであり、挙動が変わっていないかどうかはこれからじっくり調べることになるでしょう。
iTunes 9.1がリリースされました。iPadのサポートが主な内容とのことですが、AppleScript用語辞書にも一部(だけ)変更が加わっています。
playlistのspecial kind属性の値が、
Audiobooks → Books
Videos → TV Shows
にそれぞれ変更されました。また、Genius、iTunes U、Libraryといった属性値が追加されています。
