28.05.2010 | 15:27
Znam za to ali to nije ono što sam tražio. Ja ne želim skriptu koja stalno polla iTunes, već želim da iTunes pošalje event skripti. Dakle to nije moguće? U tom slučaju moj flert sa Applescriptom će biti zaista kratkog vijeka.
Postoji li neki drugi način da iTunes pokrene applescript kod promjene tracka?
Zbunjuješ me.
U prvoj poruci si napisao da ti ne paše "da se skripta pokreće svake minute ili dvije da pokupi tu informaciju". Zaključio sam (ne nužno ispravno) da ti ne paše iz dva razloga: predug interval između dva poziva skripte i overhead koji donosi pokretanje skripte uvijek iznova. Rješenje koje sam naveo rješava oba problema jer se konkretna skripta pokrene samo jednom i ne radi ništa osim što vrti vlastiti run loop (on idle) i u njemu provjerava svira li još uvijek isti track ili je došlo do promjene. Kad dođe do promjene, pokreće onaj dio koda u kojem je "beep". Umjesto toga možeš umetnuti kod koji pokreće neku desetu skriptu. Bottom line: skripta glumi sustav za distibuciju iTunesovih notificationa (implementiran je samo jedan, zovimo ga "on track change" ). Zašto ti nije upotrebljivo takvo rješenje? Znatiželjan sam.
Što se pak tiče "pravih" notifikacija, da, moguće su. Zakačiš se za Notification Center, "slušaš" i reagiraš kad stigne notifikacija.
U Cocoa aplikaciji (trebat će ti Xcode) to izgleda ovako nekako (zamijeni defaultni main.m sa kodom u nastavku, buildaj i pokreni):
#import <Cocoa/Cocoa.h>
@interface iTunesLink : NSObject
- (id) init;
@end
@implementation iTunesLink
- (id) init {
NSDistributedNotificationCenter *dnc = [NSDistributedNotificationCenter defaultCenter];
[dnc addObserver:self selector:@selector(trigger:) name:@"com.apple.iTunes.playerInfo" object:nil];
return self;
}
- (void) trigger:(NSNotification *)notification {
NSString *myScript = [NSString stringWithFormat:
@"tell application \\"Finder\\"\\ndisplay dialog (\\"iTunes mi želi nešto reći!\\")\\nend tell"];
NSAppleScript *as = [[[NSAppleScript alloc] initWithSource:myScript] autorelease];
[as executeAndReturnError:nil];
}
@end
int main(int argc, char *argv[])
{
iTunesLink *connection;
connection = [[[iTunesLink alloc] init] autorelease];
return NSApplicationMain(argc, (const char **) argv);
}
Da li je moguće isto to u AppleScriptu? Je, ali kao Cocoa AppleScript aplikacija (kompajlirano). Kad kreiraš projekt, u NazivProjektaAppDelegate.applescript, umjesto onoga što je defaultno u njemu, umetneš ovo (gornji koncept, "preveden" u AppleScript), buildaš, pokreneš:
script NazivProjektaAppDelegate
property parent : class "NSObject"
property dnc : class "NSDistributedNotificationCenter"
on awakeFromNib()
set dnc to dnc's defaultCenter
tell dnc to addObserver_selector_name_object_(me, "trigger:", "com.apple.iTunes.playerInfo", missing value)
end awakeFromNib
on trigger_()
display dialog ("iTunes mi želi nešto reći!")
end trigger_
on applicationWillFinishLaunching_(aNotification)
-- Insert code here to initialize your application before any files are opened
end applicationWillFinishLaunching_
on applicationShouldTerminate_(sender)
-- Insert code here to do any housekeeping before your application quits
return current application's NSTerminateNow
end applicationShouldTerminate_
end script
U oba slučaja (Obj-C i AppleScript) dodaješ observer iTunesima koji trigga "trigger" metodu/handler kad iTunes pošalje notifikaciju. U "pravom" programu bi trebalo obraditi notifikaciju, da znaš što ti je iTunes zapravo rekao (ovo gore će reagirati na Play/Pause/Next Track...), a poželjno je i removati observera kad quitaš aplikaciju.