2011-08-12 47 views
7

我一直在试图弄清楚如何使用脚本桥获取当前播放歌曲的iTunes艺术作品。我已经得到了一些对某些歌曲有用的点,但是对于其他歌曲,我得到了一个SIGABRT。我不确定这个问题会是什么,所以任何帮助将不胜感激。以下是我迄今为止:获取iTunes当前歌曲与ScriptingBridge的艺术作品

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

嗨jtbandes,谢谢你的回应。我已经将控制台输出添加到上述问题中。在我看来,出于某种原因,NSImage *艺术品是零(或NULL?),这将解释分段错误。奇怪的是我认为检查是否为零将检查这个......我猜不是......我不确定如何继续。从iTunes的角度来看,我玩过的两首歌似乎都具有相同的艺术作品。一个工作,一个没有。感谢你给与我的帮助! :) – alwaysapple

+0

好的,我已经缩小到实际的iTunesArtwork *图稿无效。但它不是零。有没有办法检查这件作品是否有效? – alwaysapple

回答

12

好吧,我想通了。解决方案是使用由API提供的NSData原始数据而不是NSImage。所以我用:

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

而不是

songArtwork = [artwork data]; 
+0

这真的很有帮助,谢谢!你也可以接受你自己的答案。 – pt2ph8

0

我不得不从iTunes获取批量跟踪艺术品和使用“RAWDATA”太多。 但这种方式效率低下。 我发现了一个更好的方法(实际上它将'fetch'时间减少了大约2倍,当使用'valueForKey:'根据«Improving the Performance of Scripting Bridge Code»获取许多曲目的作品时,它非常重要)。

因此,我决定了解iTunesArtwork'data'属性有什么问题。 我们希望得到一个NSImage对象(根据iTunes.h),但真实的对象是'NSAppleEventDescriptor'。很容易猜到,这个对象包含我们的图像。所以我们可以使用'data'属性来获取图像数据。这比从iTunesArtwork获得'rawData'要快得多。 但有时iTunes会返回NSImage对象,而不是NSAppleEventDescriptor。这是一个奇怪的行为,但使用rawData仍然更快。

相关问题