3

Python と Scripting Bridge を使用してプレイリストを作成するにはどうすればよいですか?

これまでのところ、私は持っています:

from Foundation import *
from ScriptingBridge import *

iTunes = SBApplication.applicationWithBundleIdentifier_("com.apple.iTunes")
newPlaylist = iTunes.iTunesPlaylist()

これは明らかに機能しません。

Ruby と Objective C については見たことがありますが、言語はよくわかりません。

4

1 に答える 1

6

これは、実際にはScriptingBridgeのドキュメントの例です。リスト2「PyObjCコードでスクリプト可能なアプリケーションにオブジェクトを追加する」を参照してください。

from Foundation import *
from ScriptingBridge import *

iTunes = SBApplication.applicationWithBundleIdentifier_("com.apple.iTunes")
p = {'name':'Testing'}
playlist = iTunes.classForScriptingClass_("playlist").alloc().initWithProperties_(p)
iTunes.sources()[0].playlists().insertObject_atIndex_(playlist, 0)

これが意味をなさない場合は、説明する醜いことがいくつかあります…</ p>

まず、の優れたサブクラスであるSBApplicationメンバーがありません。静的接着剤を生成した場合、そのようなことがあるかもしれません…しかし、静的接着剤を使用したくありません。したがって、クラスオブジェクトを動的に作成する必要があります。これを行うにはいくつかの異なる方法がありますが、簡単な方法は(Applescriptで呼び出されていることを知っていると仮定して)、を使用することです。iTunesPlaylistSBObjectITApplicationiTunesPlaylistplaylistclassForScriptingClass_

次に、ScriptingBridgeは実際にはAEへのネイティブPythonブリッジではありません。これは、AEへのObjCブリッジへのPythonブリッジです。つまり、これiTunesPlaylistは実際にはラップアップされたObjCクラスであり、Pythonクラスではありません。つまり、単にインスタンス化することはできません。iTunesPlaylist()と言わなければなりませんiTunesPlaylist.alloc().init()

呼び出しinitWithProperties_(p)は、個別の手順でプロパティを初期化および設定するための優れたショートカットです。

最後に、AEオブジェクトモデルが機能する方法では、単に「オブジェクトを作成する」ことはできません。ある場所にオブジェクトを作成する必要があります。ScriptingBridgeはこれをあなたから隠そうとしますが、あまりうまくいきません。作成したplaylistオブジェクトは、実際にはまだiTunesで何も表していません。実際、そのtypeまたはreprを見ると、「将来のiTunesPlaylist」であることがわかります。SBElementArrayあなたはそれを挿入するための適切なものを見つける必要があります、そうすればそれは本当のプレイリストになります。

ScriptingBridgeのすべてがこれほどひどいわけではありません。しかし、それのいくつかはさらに悪いです。iTunesのスクリプト辞書が間違っている領域の1つに遭遇するまで待ってください…</p>

ScriptingBridgeの使用を避けることができれば、iTunesAEインターフェイス自体は非常に優れています。それを回避する方法は3つありますが、役に立たない場合があります。

まず、appscriptがあります(ドキュメントはこちら)。これは、SBよりもはるかに優れた別のPython->AEブリッジです。同じように見えます(iTunesがプレイリストのデフォルトの場所を持っているというデフォルトに依存しています—最初のライブラリソースのプレイリストのリストの最後にあります):

from appscript import *

iTunes = app('iTunes')
p = {'name':'Testing'}
playlist = iTunes.make(new=k.playlist, with_properties=p)

また、やりたいことを実行する方法がわからなくても、AppleScriptサンプルコード(たとえば、dougscripts)を見つけることができる場合は、ASTranslateツールを使用して同等のappscriptを作成できます。

残念ながら、appscriptの作成者はプロジェクトをキャンセルしました。そして、正当な理由があります。それは、Appleが10.9で削除できる(またはApp Storeからあなたを拒否することを引用する)レガシーAPIに依存しています。現在のところ、それはまだ正常に機能しており、上記のgithubリポジトリで数人の人々がそれを存続させていますが、いつの日か、それは実際に死ぬ必要があります。したがって、これが個人的な、短期的な、または学習プロジェクトでない限り、それは良い解決策ではないかもしれません。(また、iTunesに固有:10.6.3には、appscriptに影響するバグがありますが、リモートで使用しない限り、他のブリッジには影響しません。そのバージョンで作業する必要がある場合は、1つの解決策のiTunesを参照してください

もちろん、常に明白なオプションがあります:AppleScriptでそれを行います:

tell application "iTunes"
    make new playlist with properties {name:"Testing4"}
end tell

AppleScriptの問題は、AEOMを話すことを除いてすべてにとって恐ろしい言語であり、Pythonの標準ライブラリに相当するものが約5%の深さと幅であるということです。ただし、2つの方法で、いつでも2言語のソリューションを使用できます。ASOCを介して、AppleScriptから他のCocoaコード(PythonとPyObjCなど)に接続できます。または、NSAppleScriptとその仲間を使用して、PyObjC/etcからスクリプトを実行することもできます。

後者は最も苦痛な答えかもしれませんが、1つの大きな利点があります。MountainLionで新しいAPIを使用し、ユースケースが特定の狭い範囲内にある場合、一時的なものを必要とせずにiTunesをスクリプト化するサンドボックスアプリを作成できます。例外の資格。つまり、AppStoreで販売できます。

于 2012-10-18T22:55:41.903 に答える