この例をベースとして使用しており、現在のトラックに関するもう少し情報を取得したいと思います。たとえば、トラックの現在の時刻(「再生ヘッド」はどこか)やトラックの合計の長さなどです。
2 に答える
アプリケーションのスクリプト プロパティに関する情報を取得する正しい方法は、AppleScript エディタを介して辞書を開くことです。これにより、ドキュメントとともに、すべてが適切なコンテキストで表示されます。
しかし、私たちは物事を行うための正しい方法を気にしないことがあります。Pythonの方法が必要なだけですよね? .__dict__
また、Python では (PyObjC を介して)や などのツールを使用して実行時に多くのクラスを調べることができますdir
。したがって、iTunes アプリケーション オブジェクトの属性をバニラSBApplication
オブジェクトと比較したり、任意のスクリプトの属性をバニラ オブジェクトと比較したりするSBObject
と、次のようになります。
>>> from ScriptingBridge import SBObject, SBApplication
>>> iTunes = SBApplication.applicationWithBundleIdentifier_("com.apple.iTunes")
>>> (list(set(dir(iTunes)) - set(dir(SBApplication))))
['fullScreen', 'selection', 'mute', 'visuals', 'setSoundVolume_',
# ...
'setVisualSize_', 'currentStreamURL', 'setFixedIndexing_']
>>> (list(set(dir(iTunes.currentTrack())) - set(dir(SBObject))))
['rating', 'databaseID', 'setUnplayed_', 'lyrics', 'show', 'releaseDate',
# ...
'setSkippedCount_', 'skippedCount', 'setSeasonNumber_', 'sampleRate']
たまたま、「プレーヤー ヘッド」はアプリケーションの属性であり (一度に 1 曲しか再生できません)、現在のトラックではありません (これは実際には同じ「トラック」オブジェクトでなくても得られます)。再生状態ではなく、メタデータを表すだけです)。それとトラックの「デュレーション」属性は両方とも秒単位であるため、(たとえば) 曲全体のパーセンテージを次のように計算できます。
>>> "{0:0.0f}%".format((iTunes.playerPosition() / iTunes.currentTrack().duration()) * 100)
Python と AppleEvent スクリプトを使用したい場合py-appscript
は、Scripting Bridge ではなく使用することを強くお勧めします。appscript は堅牢で、独立した開発者によって適切に管理されていますが、Scripting Bridge は Apple ではもはや注目されていないようです。 py-appscript
Python 2 と Python 3 の両方でもサポートされています。
が提供する ASDictionary ツールを使用しappscript
て、スクリプト可能なアプリケーションが提供するスクリプト辞書を調べることができます。または、Apple の辞書AppleScript Editor.app
(以前はScript Editor
) を表示して、構文を手動で翻訳することもできます。この場合、py-appscript
Python インスタンスの 1 つにインストールした後は、非常に簡単です。iTunes のスクリプト ディクショナリ定義には、オブジェクトのさまざまなプロパティがリストされていapplication
ます。リストされているものは次のとおりです。
player position (integer) : 現在再生中のトラック内の秒単位のプレーヤーの位置。
もう一つは:
プレーヤーの状態(停止/再生中/一時停止/早送り/巻き戻し、r/o) : iTunes は停止中、一時停止中、または再生中ですか?
有効な Python 名を作成するpy-appscript
には、スペース文字をアンダースコア文字に自動的に置き換えます。
>>> from appscript import *
>>> it = app('iTunes') # the "application" object
>>> it.player_state() # access properties of the "application" object
k.playing
>>> it.player_position() # (calling the property "( )" implies a "get" action)
1958
>>> it.player_position()
1961
>>> it.current_track.artist()
u'Bavarian Radio Symphony Orchestra'