2011-08-12 9 views
7

スクリプトブリッジで現在再生中の曲のiTunesアートワークを取得する方法を解明しようとしています。私はそれがいくつかの曲のために働くポイントになったが、他の人のために、私はSIGABRTを得る。何が問題なのか分かりませんので、どんな助けでも大歓迎です。ここで私はこれまで持っているものです。ScriptingBridgeで現在の曲のiTunesアートワークを取得

iTunesApplication * iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"]; 
NSImage *songArtwork; 
iTunesTrack *current = [iTunes currentTrack]; 
iTunesArtwork *artwork = (iTunesArtwork *)[[[current artworks] get] lastObject]; 
if(artwork != nil) 
    songArtwork = [artwork data]; 
else 
    songArtwork = [NSImage imageNamed:@"Image.tiff"]; 

NSMenuItem *artworkMenuItem = [[NSMenuItem alloc] initWithTitle:@"" action:NULL keyEquivalent:@""]; 
[songArtwork setSize:NSMakeSize(128, 128)]; 
[artworkMenuItem setImage:songArtwork]; 
[Menu insertItem:artworkMenuItem atIndex:0]; 

私はいくつかの曲のためにそれが動作し、メニュー項目にきれいにアートワークを表示しますが、他人のために、私はライン上でSIGABRTを得る:

[songArtwork setSize:NSMakeSize(128, 128)]; 

コンソールの出力は次のようになります。

2011-08-12 23:13:20.094 SongViewer[2146:707] -[NSAppleEventDescriptor setSize:]:  unrecognized selector sent to instance 0x102827f70 
2011-08-12 23:13:20.095 SongViewer[2146:707] An uncaught exception was raised 
2011-08-12 23:13:20.096 SongViewer[2146:707] -[NSAppleEventDescriptor setSize:]: unrecognized selector sent to instance 0x102827f70 
2011-08-12 23:13:20.097 SongViewer[2146:707] (
0 CoreFoundation      0x00007fff86f11986 __exceptionPreprocess + 198 
1 libobjc.A.dylib      0x00007fff8b04cd5e objc_exception_throw + 43 
2 CoreFoundation      0x00007fff86f9d5ae -[NSObject doesNotRecognizeSelector:] + 190 
3 CoreFoundation      0x00007fff86efe803 ___forwarding___ + 371 
4 CoreFoundation      0x00007fff86efe618 _CF_forwarding_prep_0 + 232 
5 SongViewer       0x0000000100002a83 -[IPMenulet awakeFromNib] + 4483 
6 CoreFoundation      0x00007fff86f089e1 -[NSObject performSelector:] + 49 
7 CoreFoundation      0x00007fff86f08962 -[NSSet makeObjectsPerformSelector:] + 274 
8 AppKit        0x00007fff8d9d9c27 -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] + 1245 
9 AppKit        0x00007fff8d9d01b9 loadNib + 322 
10 AppKit        0x00007fff8d9cf6b6 +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] + 217 
11 AppKit        0x00007fff8d9cf5d1 +[NSBundle(NSNibLoading) loadNibFile:externalNameTable:withZone:] + 141 
12 AppKit        0x00007fff8d9cf514 +[NSBundle(NSNibLoading) loadNibNamed:owner:] + 364 
13 AppKit        0x00007fff8dc42355 NSApplicationMain + 398 
14 SongViewer       0x0000000100001882 main + 34 
15 SongViewer       0x0000000100001854 start + 52 
) 
2011-08-12 23:13:20.098 SongViewer[2146:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSAppleEventDescriptor setSize:]: unrecognized selector sent to instance 0x102827f70' 
*** First throw call stack: 
(
0 CoreFoundation      0x00007fff86f11986 __exceptionPreprocess + 198 
1 libobjc.A.dylib      0x00007fff8b04cd5e objc_exception_throw + 43 
2 CoreFoundation      0x00007fff86f9d5ae -[NSObject doesNotRecognizeSelector:] + 190 
3 CoreFoundation      0x00007fff86efe803 ___forwarding___ + 371 
4 CoreFoundation      0x00007fff86efe618 _CF_forwarding_prep_0 + 232 
5 SongViewer       0x0000000100002a83 -[IPMenulet awakeFromNib] + 4483 
6 CoreFoundation      0x00007fff86f089e1 -[NSObject performSelector:] + 49 
7 CoreFoundation      0x00007fff86f08962 -[NSSet makeObjectsPerformSelector:] + 274 
8 AppKit        0x00007fff8d9d9c27 -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] + 1245 
9 AppKit        0x00007fff8d9d01b9 loadNib + 322 
10 AppKit        0x00007fff8d9cf6b6 +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] + 217 
11 AppKit        0x00007fff8d9cf5d1 +[NSBundle(NSNibLoading) loadNibFile:externalNameTable:withZone:] + 141 
12 AppKit        0x00007fff8d9cf514 +[NSBundle(NSNibLoading) loadNibNamed:owner:] + 364 
13 AppKit        0x00007fff8dc42355 NSApplicationMain + 398 
14 SongViewer       0x0000000100001882 main + 34 
15 SongViewer       0x0000000100001854 start + 52 
) 
terminate called throwing an exception(gdb) 

誰かが間違っていると思われることがあれば、私に教えてください!

+0

その他のコンソール出力は何ですか? – jtbandes

+0

こんにちは、あなたのお返事ありがとうございます。上記の質問にコンソール出力を追加しました。何らかの理由でNSImage *のアートワークがnil(またはNULL?)であり、これがセグメンテーション違反を説明するように見えます。奇妙なことは、それが無かったかどうかをチェックすると思っていたということです。それは...私には分かりません。 iTunesの観点からは、私が演奏していた両方の曲がアートワークを持っているという点で同じであるようでした。 1人は働き、1人は働きませんでした。あなたが私に与えることができる任意のおかげでありがとう! :) – alwaysapple

+0

わかりましたので、実際のiTunesArtwork *のアートワークが無効になっています。しかし、それはゼロではありません。この作品が有効かどうかを確認する方法はありますか? – alwaysapple

答えて

12

私はそれを理解しました。解決策は、NSImageではなくAPIによって提供されるNSData生データを使用することです。だから私は使用:

NSImage *songArtwork = [[NSImage alloc] initWithData:[artwork rawData]]; 

ではなく

songArtwork = [artwork data]; 
+0

これは本当に助けになりました、ありがとう!あなた自身の答えも受け入れることができます。 – pt2ph8

0

私は、iTunesからトラック作品のバッチをフェッチし、あまりにも「生データ」を使用する必要があります。 しかし、この方法は非効率的です。 より良い方法を見つけました(実際には 'フェッチ'時間が約2倍になります。«Improving the Performance of Scripting Bridge Code»に従って 'valueForKey:'を使用して多くのトラックのアートワークを取得すると非常に重要です)。

だから、私はiTunesArtworkの 'データ'プロパティに何が問題なのかを理解することに決めました。 NSImageオブジェクト(iTunes.hによる)を取得する予定ですが、実際のオブジェクトは種類が「NSAppleEventDescriptor」です。そして、このオブジェクトには私たちのためのイメージが含まれていると推測するのは簡単です。だから、私たちは単に 'data'プロパティを使って画像データを取得することができます。これは、iTunesArtworkから 'rawData'を取得するよりも、はるかに高速です。 しかし、iTunesはNSAppleEventDescriptorの代わりにNSImageオブジェクトを返すことがあります。これは奇妙な動作ですが、まだrawDataを使用する方が速いです。

関連する問題