2009-12-28 15 views
9

के साथ आईट्यून्स प्लेलिस्ट बनाएं, मैं कोको स्क्रिप्टिंग पुल का उपयोग करके एक नई उपयोगकर्ता प्लेलिस्ट बनाने की कोशिश कर रहा हूं, लेकिन इसे काम पर नहीं लग रहा है। मैं अब तक है:स्क्रिप्टिंग पुल

iTunesBridge [630: 80F]

iTunesApplication *iTunes = [SBApplication 
          applicationWithBundleIdentifier:@"com.apple.iTunes"]; 
SBElementArray *iSources = [iTunes sources]; 
iTunesSource *library = nil; 
for (iTunesSource *source in iSources) { 
    if ([[source name] isEqualToString:@"Library"]) { 
     library = source; 
     break; 
    } 
} 

// could not find the itunes library 
if (!library) { 
    NSLog(@"Could not connect to the iTunes library"); 
    return; 
} 

// now look for our playlist 
NSString *playlistName = @"new playlist"; 
SBElementArray *playlists = [library userPlaylists]; 
iTunesUserPlaylist *playlist = nil; 
for (iTunesUserPlaylist *thisList in playlists) { 
    if ([[thisList name] isEqualToString:playlistName]) { 
     playlist = thisList; 
     break; 
    } 
} 

// if the playlist was not found, create it 
if (!playlist) { 
    playlist = [[[iTunes classForScriptingClass:@"playlist"] alloc] init]; 
    [playlist setName:playlistName]; 
    [[library userPlaylists] insertObject:playlist atIndex:0]; 
} 

जब मैं कोशिश करते हैं और प्लेलिस्ट के लिए कोई नाम जोड़ने, मैं त्रुटि संदेश मिलता है *** - [SBProxyByClass setName:] : वस्तु अभी तक एक कंटेनर में नहीं जोड़ा गया है; चयनकर्ता

क्या कोई मुझे सही दिशा में इंगित कर सकता है?

+0

'[स्रोत नाम] isEqualToString: @" लाइब्रेरी "] क्या आपने गैर-अंग्रेजी प्रणालियों में परीक्षण किया है? नाजुक लगता है ... – Kornel

+1

गैर-अंग्रेजी प्रणालियों में, आपको '([स्रोत प्रकार] == iTunesESrcLibrary) ' – fabian789

उत्तर

5

एसबी में नई एप्लिकेशन ऑब्जेक्ट्स को डरावना ढंग से खराब कर दिया गया है। छद्म-कोको-आइश आवंटन-इनिट-डालने की प्रक्रिया वास्तव में नीचे क्या चल रहा है इसके समान नहीं है। जबकि आवंटन-इनिट एक नियमित ऑब्जेक्ट बनाने के लिए प्रतीत होता है जिसे आप बाद की विधि कॉल के साथ जोड़ सकते हैं, परिणाम वास्तव में एक शिम है जिसका एकमात्र फ़ंक्शन 'सरणी' में 'डाला' होना है, जिस बिंदु पर एसबी वास्तविक make ईवेंट भेजता है लक्ष्य प्रक्रिया के लिए।

IIRC, केवल बात आप वास्तव में -initWithProperties: में है प्रारंभिक गुण निर्दिष्ट कर सकते हैं (यह भी here और here देखें एस.बी. आलोचनाओं के लिए।)। ऑब्जेक्ट को 'डालने' के बाद आप उन्हें सेट कर सकते हैं, लेकिन यह एक पूरी तरह से अलग ऑपरेशन है (किसी ऑब्जेक्ट को मैनिपुलेट करना जो ऑब्जेक्ट बनने के लिए प्रारंभिक स्थिति निर्दिष्ट करने के बजाए पहले से मौजूद है) ताकि सावधान न हो तो आसानी से अनपेक्षित परिणाम हो सकते हैं ।

किसी भी हाल में इस तरीके से सामान्य रूप से कोई नई प्लेलिस्ट बनाने हैं तो पहले से ही नहीं करता है मौजूद हैं:

set playlistName to "new playlist" 
tell application "iTunes" 
    if not (exists playlist playlistName) then 
     make new playlist with properties {name:playlistName} 
    end if 
end tell 

और, Fwiw, यहाँ मैं कैसे ObjC में ऐसा करना चाहते हैं, objc-appscript का उपयोग कर (है जो मैं इतना लिखा था मैं एस.बी., natch) का उपयोग नहीं होगा:।

#import "ITGlue/ITGlue.h" 

NSString *playlistName = @"new playlist"; 

ITApplication *itunes = [ITApplication applicationWithName: @"iTunes"]; 
ITReference *playlist = [[itunes playlists] byName: playlistName]; 

if ([[[playlist exists] send] boolValue]) 
    playlist = [playlist getItem]; 
else 
    playlist = [[[[itunes make] new_: [ITConstant playlist]] 
         withProperties: [NSDictionary dictionaryWithObject: playlistName 
                    forKey: [ITConstant name]]] send]; 

(ObjC-appscript का नकारात्मक पहलू आप का निर्माण करने के लिए है और आपके आवेदन बंडल में ढांचे की एक प्रति एम्बेड वह यह है कि लाभ यह है कि यह अधिक सक्षम, आवेदन संगतता मुद्दों के लिए कम प्रवण है, और बहुत कम obfuscated। इसके अलावा आप ऐपस्क्रिप्ट के ASTranslate टूल का उपयोग उपरोक्त ऐप्पलस्क्रिप्ट द्वारा ओबीजेसी सिंटैक्स में भेजे गए ऐप्पल इवेंट्स को कन्वर्ट करने के लिए कर सकते हैं - आपके संदर्भों और कमांडों को कैसे बनाया जाए, यह पता लगाने में बहुत आसान है।)

+2

हे धन्यवाद का उपयोग करना चाहिए, आप सही हैं, स्क्रिप्टिंग पुल के साथ काम करना एक दुःस्वप्न है। objc-appscript अच्छा दिखता है, लेकिन मेरे मामले में थोड़ी अधिक मात्रा में, प्लेलिस्ट में फ़ाइलों को जोड़ने के बाद मैं सब कुछ कर रहा हूं। मैंने इसे काम किया: प्लेलिस्ट = [[[आईट्यून्स क्लासफॉरस्क्रिप्टिंग क्लास: @ "प्लेलिस्ट"] alloc] initWithProperties: [NSDictionary blah]]]; तो पॉइंटर –

1

आपको आईट्यून्स में देखना चाहिए। यह उद्देश्य-सी का उपयोग कर आईट्यून्स के साथ बातचीत के लिए एक ओपन-सोर्स फ्रेमवर्क है। यदि आपने आईट्यून्स के माध्यम से ऐसा किया है तो आप कोड अधिक सरल दिखेंगे।

http://www.liquidx.net/eyetunes/

+2

के लिए धन्यवाद आईट्यून्स वही काम कर रहा है जो स्क्रिप्टिंग ब्रिज कर रहा है। बग फिक्स और छोटे ऐप आकार के लिए, हमेशा तीसरे पक्ष में ऐप्पल रास्ता चुना। – jarjar

+2

यह वास्तव में ओपी के प्रश्न का उत्तर नहीं देता है। – ray

2

बस एक क्विक नोट कि [[source name] isEqualToString:@"Library"] निश्चित रूप से गैर-अंग्रेज़ी सिस्टम पर काम नहीं करता। पहले स्रोत आइटम शीर्ष पर एक है, उदाहरण के लिए iTunesSource *library = [[_iTunes sources] objectAtIndex: 0]; का उपयोग करना बेहतर हो सकता है, उदा। मुख्य पुस्तकालय

9

त्रुटि संदेश आपको बता रहा है कि आपकी प्लेलिस्ट की तरह स्क्रिप्टिंग ब्रिज ऑब्जेक्ट्स तब तक संदेश प्राप्त नहीं कर सकते जब तक उन्हें प्रासंगिक SBElementArray में जोड़ा नहीं गया है, इसलिए सरणी में जोड़ने से पहले प्लेलिस्ट पर एक संपत्ति सेट करने का आपका प्रयास विफल रहता है ।

सरल समाधान सिर्फ, कोड की अंतिम दो पंक्तियों को पुनर्व्यवस्थित करने के इस तरह है:

// if the playlist was not found, create it 
if (!playlist) { 
    playlist = [[[iTunes classForScriptingClass:@"playlist"] alloc] init]; 
    [[library userPlaylists] insertObject:playlist atIndex:0]; 
    [playlist setName:playlistName]; 
} 

अन्य विकल्प initWithProperties: उपयोग करने के लिए जो एक और जवाब पर अपनी टिप्पणी के अनुसार तुम क्या कर समाप्त हो गया है।

+1

यह स्वीकार्य उत्तर होना चाहिए। – ray

2

यह वही है जो मैंने पुस्तकालय की भरोसेमंद पहचान करने के लिए किया है। मैं इसे गलत कर सकता था।

- (iTunesSource *)iTunesLibrary 
{ 
    NSArray *librarySource = [[[self iTunes] sources] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"kind == %@", [NSAppleEventDescriptor descriptorWithTypeCode:iTunesESrcLibrary]]]; 
    if ([[librarySource lastObject] exists]) { 
    return [librarySource lastObject]; 
    } 
    return nil; 
} 
संबंधित मुद्दे