2011-08-12 26 views
7

Tôi đã cố gắng tìm ra cách để có được tác phẩm nghệ thuật iTunes cho bài hát hiện đang phát với cây cầu kịch bản. Tôi đã đến một điểm mà nó hoạt động cho một số bài hát, nhưng đối với những người khác, tôi nhận được SIGABRT. Tôi không chắc vấn đề có thể là gì, vì vậy mọi trợ giúp sẽ được đánh giá cao. Dưới đây là những gì tôi có cho đến nay:Tải iTunes tác phẩm nghệ thuật cho bài hát hiện tại với 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]; 

tôi đối với một số bài hát nó hoạt động, và hiển thị các tác phẩm nghệ thuật độc đáo trong các mục trình đơn, nhưng đối với những người khác tôi nhận được một SIGABRT trên dòng:

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

Đầu ra của bảng điều khiển như sau:

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) 

Nếu có ai có ý tưởng gì có thể sai, vui lòng cho tôi biết !!

+0

Bạn nhìn thấy đầu ra console nào khác? – jtbandes

+0

Xin chào jtbandes, cảm ơn bạn đã trả lời. Tôi đã thêm đầu ra bàn điều khiển cho câu hỏi trên. Nó xuất hiện với tôi rằng đối với một số lý do tác phẩm nghệ thuật NSImage * là nil (hoặc NULL?) Và điều đó sẽ giải thích lỗi phân đoạn. Điều kỳ lạ là tôi nghĩ kiểm tra để xem nếu nó được nil sẽ kiểm tra cho rằng ... Tôi đoán không ... Tôi không thực sự chắc chắn làm thế nào để tiếp tục. Từ quan điểm của iTunes, cả hai bài hát tôi đang chơi dường như giống nhau về mặt tác phẩm nghệ thuật. Một người làm việc, và một người thì không. Cảm ơn vì sự giúp đỡ của bạn! :) – alwaysapple

+0

Ok vì vậy tôi đã thu hẹp nó xuống tác phẩm nghệ thuật thực tế của iTunesArtwork * không hợp lệ. Nhưng nó không phải là không. Có cách nào để kiểm tra xem tác phẩm nghệ thuật này có hợp lệ hay không? – alwaysapple

Trả lời

12

Ok vì vậy tôi đã tìm ra. Giải pháp là sử dụng dữ liệu thô NSData do API cung cấp thay vì NSImage. Vì vậy, tôi đã sử dụng:

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

hơn

songArtwork = [artwork data]; 
+0

Điều này thực sự đã giúp, cảm ơn! Bạn có thể chấp nhận câu trả lời của riêng bạn. – pt2ph8

0

tôi phải lấy lô tác phẩm nghệ thuật theo dõi từ iTunes và sử dụng ‘rawData’ quá. Nhưng cách này không hiệu quả. Tôi đã tìm thấy một cách tốt hơn (thực sự nó giảm thời gian 'tìm nạp' khoảng 2 lần, điều này rất quan trọng khi tìm nạp tác phẩm nghệ thuật cho nhiều bản nhạc bằng ‘valueForKey:’ theo «Improving the Performance of Scripting Bridge Code»).

Vì vậy, tôi quyết định hiểu có gì sai với thuộc tính ‘dữ liệu’ của iTunesArtwork. Chúng tôi hy vọng sẽ nhận được một đối tượng NSImage (theo iTunes.h), nhưng đối tượng thực sự là loại ‘NSAppleEventDescriptor’. Và thật dễ đoán, rằng đối tượng này chứa một hình ảnh cho chúng tôi. Vì vậy, chúng tôi chỉ có thể sử dụng thuộc tính ‘data’ để lấy dữ liệu hình ảnh. Và điều này thực sự nhanh hơn việc lấy ‘rawData’ từ iTunesArtwork. Nhưng đôi khi iTunes trả về đối tượng NSImage thay vì NSAppleEventDescriptor. Đây là một hành vi kỳ lạ, nhưng nó vẫn nhanh hơn sau đó sử dụng rawData.

Các vấn đề liên quan