事前にお断りしますが、失敗談なので。
MediaLibrary.frameworkを使って、ライブラリを検索するAppleScript(とASOC)を作ってみる。
AppleScriptエディタからテンプレートを使って、Cocoa-AppleScript Appletで書き始めたが、正直、Objective-Cでやった方が早いかもしれない。そして数時間・・・
もう、ダメだ耐えられない。たぶん、MediaLibrary.frameworkを呼び出すことができない。
そもそも、どうやってフレームワークにリンクしているのかわからないし。
普通にCocoaアプリで再挑戦。数年ぶりにXcode使ったので、操作に戸惑う。フレームワークの追加方法がXcode.app内を参照とか、ちょっとビックリ。
さて、mediaSourcesを取り出そうとすると戻り値は初回nilとか、KVOで受け取るとか。作業を進めて分かったが、このフレームワークは内部で非同期のXPCサービスを呼び出しているようで、ちょっと挙動があやしい。下のコードじゃライブラリは受け取れない。
NSDictionary *mediaSources = self.mediaLibrary.mediaSources;
ざっと、下みたいに書かないといけない。
self.mediaLibrary = [[MLMediaLibraryalloc] initWithOptions:opt];
//media libraryのmediaSourcesへのバインド
[self.mediaLibraryaddObserver:selfforKeyPath:@"mediaSources"options:NSKeyValueObservingOptionNewcontext:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if (object == self.mediaLibrary && [keyPath isEqual:@"mediaSources"]) {
id value = [change objectForKey:NSKeyValueChangeNewKey];
NSDictionary *mediaSources = value;
return;
}
[superobserveValueForKeyPath:keyPath ofObject:object change:change context:context];
}
でも、これが下のエラーで弾かれる。
MLMediaLibrary error obtaining remote object proxy: Error Domain=NSCocoaErrorDomain Code=4097 "Couldn’t communicate with a helper application."
ググってみると、以下の記事が。
Mavericks MediaLibrary framework - Google グループ
https://groups.google.com/forum/#!topic/imedia-dev/pSDQOIZ3Emk
ここのサンプルを見ると、NSMediaLibraryBrowserControllerクラスってのもあるらしい。使い方がわからんが。
で、ビルドしてみるとやはり動かない。
推測まじりの結論から言うと、MediaLibrary.framework(XPCサービス)はSandboxアプリが大前提。つまり、有料のDeveloper Programが必要。酷いっす。
気を取り直して、iTunesLibrary.frameworkも試してみる。こっちは、XMLを読み取ってNSDictionaryに突っ込むだけなのでSandboxはあまり関係ない。
そういえば、iTunes Music Library.xmlには歌詞は入っていないな。