2011-08-12 12 views
7

के साथ वर्तमान गीत के लिए आईट्यून्स आर्टवर्क प्राप्त करें मैं स्क्रिप्टिंग ब्रिज के साथ वर्तमान में बजाने वाले गीत के लिए आईट्यून्स आर्टवर्क कैसे प्राप्त करना है, यह जानने का प्रयास कर रहा हूं। मैं एक ऐसे बिंदु पर पहुंच गया हूं जहां यह कुछ गानों के लिए काम करता है, लेकिन दूसरों के लिए, मुझे एक सिगबर्ट मिलता है। मुझे यकीन नहीं है कि समस्या क्या हो सकती है, इसलिए किसी भी मदद की सराहना की जाएगी। यहाँ मैं अब तक है:स्क्रिप्टिंग ब्रिज

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, आपकी प्रतिक्रिया के लिए धन्यवाद। मैंने उपरोक्त प्रश्न में कंसोल आउटपुट जोड़ा है। ऐसा लगता है कि किसी कारण से एनएसआईमेज * आर्टवर्क शून्य (या नल?) है और यह सेगमेंटेशन गलती को समझाएगा। अजीब चीज यह है कि मैंने यह देखने के लिए चेक देखा कि क्या यह शून्य था, इसके लिए जांच होगी ... मुझे नहीं लगता ... मुझे सच में यकीन नहीं है कि कैसे जारी रखना है। आईट्यून्स परिप्रेक्ष्य से, मैं जो गीत गा रहा था वह कलाकृति के मामले में समान था। एक काम किया, और एक नहीं किया। किसी भी सहायता के लिए धन्यवाद जो आप मुझे दे सकते हैं! :) – alwaysapple

+0

ठीक है इसलिए मैंने इसे वास्तविक iTunesArtwork * आर्टवर्क को अमान्य कर दिया है। लेकिन यह शून्य नहीं है। क्या यह कलाकृति वैध है या नहीं, यह जांचने का कोई तरीका है? – alwaysapple

उत्तर

12

ठीक है तो मैंने इसे समझ लिया। समाधान एनएसआईएमएज के बजाय एपीआई द्वारा प्रदान किए गए एनएसडीटा कच्चे डेटा का उपयोग करना है। इसलिए मैं प्रयोग किया है:

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

बजाय

songArtwork = [artwork data]; 
+0

यह वास्तव में मदद की, धन्यवाद! आप अपना खुद का जवाब भी स्वीकार कर सकते हैं। – pt2ph8

0

मैं iTunes से ट्रैक कलाकृतियों के बैच लाने और भी 'rawData' का उपयोग करने के लिए है। लेकिन इस तरह से अक्षम है। मुझे एक बेहतर तरीका मिला (वास्तव में यह लगभग 2 बार 'fetch' समय कम करता है, «Improving the Performance of Scripting Bridge Code» के अनुसार 'valueForKey:' का उपयोग करके कई ट्रैक के लिए कलाकृतियां प्राप्त करना बहुत महत्वपूर्ण है।

इसलिए मैंने यह समझने का फैसला किया कि iTunesArtwork 'डेटा' संपत्ति के साथ क्या गलत है। हम एक एनएसआईमेज ऑब्जेक्ट (iTunes.h के अनुसार) प्राप्त करने की उम्मीद करते हैं, लेकिन वास्तविक वस्तु 'NSAppleEventDescriptor' की तरह है। और यह अनुमान लगाना आसान है कि इस ऑब्जेक्ट में हमारे लिए एक छवि है। इसलिए हम छवि डेटा प्राप्त करने के लिए केवल 'डेटा' संपत्ति का उपयोग कर सकते हैं। और यह iTunesArtwork से 'rawData' प्राप्त करने से वास्तव में तेज़ है। लेकिन कभी-कभी iTunes NSIppleEventDescriptor के बजाय एनएसआईमेज ऑब्जेक्ट लौटाता है। यह एक अजीब व्यवहार है, लेकिन कच्चे डेटा का उपयोग करते हुए यह अभी भी तेज़ है।

संबंधित मुद्दे