X-Git-Url: http://git.ithinksw.org/MenuTunes.git/blobdiff_plain/7946fbfc9ca8c59750759bfbc048d73e12a80887..a5c365dd668dee7c653dbafee270e5e05025a2ab:/iTunesRemote.m diff --git a/iTunesRemote.m b/iTunesRemote.m index add1cde..997922c 100755 --- a/iTunesRemote.m +++ b/iTunesRemote.m @@ -66,25 +66,37 @@ { ITDebugLog(@"Showing player primary interface."); - //If the window is closed - _winClosed = YES; - - //If not minimized and visible - if ( ([[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:@"'----':obj { form:'prop', want:type('prop'), seld:type('pMin'), from:obj { form:'indx', want:type('cBrW'), seld:1, from:'null'() } }" eventClass:@"core" eventID:@"getd" appPSN:savedPSN] == 0) && - ([[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:@"'----':obj { form:'prop', want:type('prop'), seld:type('pvis'), from:obj { form:'indx', want:type('cBrW'), seld:1, from:'null'() } }" eventClass:@"core" eventID:@"getd" appPSN:savedPSN] != 0) && - [[[[NSWorkspace sharedWorkspace] activeApplication] objectForKey:@"NSApplicationName"] isEqualToString:@"iTunes"] ) { - //set minimized of browser window 1 to true - [[ITAppleEventCenter sharedCenter] sendAEWithSendString:@"data:long(1), '----':obj { form:'prop', want:type('prop'), seld:type('pMin'), from:obj { form:'indx', want:type('cBrW'), seld:1, from:'null'() } }" eventClass:@"core" eventID:@"setd" appPSN:savedPSN]; + if ([self playerRunningState] == ITMTRemotePlayerRunning) { + ITDebugLog(@"Showing player interface."); + //If not minimized and visible + if ( ([[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:@"'----':obj { form:'prop', want:type('prop'), seld:type('pMin'), from:obj { form:'indx', want:type('cBrW'), seld:1, from:'null'() } }" eventClass:@"core" eventID:@"getd" appPSN:savedPSN] == 0) && + ([[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:@"'----':obj { form:'prop', want:type('prop'), seld:type('pvis'), from:obj { form:'indx', want:type('cBrW'), seld:1, from:'null'() } }" eventClass:@"core" eventID:@"getd" appPSN:savedPSN] != 0) && + [[[[NSWorkspace sharedWorkspace] activeApplication] objectForKey:@"NSApplicationName"] isEqualToString:@"iTunes"] ) { + //set minimized of browser window 1 to true + [[ITAppleEventCenter sharedCenter] sendAEWithSendString:@"data:long(1), '----':obj { form:'prop', want:type('prop'), seld:type('pMin'), from:obj { form:'indx', want:type('cBrW'), seld:1, from:'null'() } }" eventClass:@"core" eventID:@"setd" appPSN:savedPSN]; + } else { + //set minimized of browser window 1 to false + [[ITAppleEventCenter sharedCenter] sendAEWithSendString:@"data:long(0), '----':obj { form:'prop', want:type('prop'), seld:type('pMin'), from:obj { form:'indx', want:type('cBrW'), seld:1, from:'null'() } }" eventClass:@"core" eventID:@"setd" appPSN:savedPSN]; + } + //set visible of browser window 1 to true + [[ITAppleEventCenter sharedCenter] sendAEWithSendString:@"data:long(1), '----':obj { form:'prop', want:type('prop'), seld:type('pvis'), from:obj { form:'indx', want:type('cBrW'), seld:1, from:'null'() } }" eventClass:@"core" eventID:@"setd" appPSN:savedPSN]; + //active iTunes + [[ITAppleEventCenter sharedCenter] sendAEWithSendString:@"data:long(1), '----':obj { form:'prop', want:type('prop'), seld:type('pisf'), from:'null'() }" eventClass:@"core" eventID:@"setd" appPSN:savedPSN]; + ITDebugLog(@"Done showing player primary interface."); + return YES; } else { - //set minimized of browser window 1 to false - [[ITAppleEventCenter sharedCenter] sendAEWithSendString:@"data:long(0), '----':obj { form:'prop', want:type('prop'), seld:type('pMin'), from:obj { form:'indx', want:type('cBrW'), seld:1, from:'null'() } }" eventClass:@"core" eventID:@"setd" appPSN:savedPSN]; + NSString *path; + ITDebugLog(@"Launching player."); + if ( (path = [[NSUserDefaults standardUserDefaults] stringForKey:@"CustomPlayerPath"]) ) { + } else { + path = [self playerFullName]; + } + if (![[NSWorkspace sharedWorkspace] launchApplication:path]) { + ITDebugLog(@"Error Launching Player"); + return NO; + } + return YES; } - //set visible of browser window 1 to true - [[ITAppleEventCenter sharedCenter] sendAEWithSendString:@"data:long(1), '----':obj { form:'prop', want:type('prop'), seld:type('pvis'), from:obj { form:'indx', want:type('cBrW'), seld:1, from:'null'() } }" eventClass:@"core" eventID:@"setd" appPSN:savedPSN]; - //active iTunes - [[ITAppleEventCenter sharedCenter] sendAEWithSendString:@"data:long(1), '----':obj { form:'prop', want:type('prop'), seld:type('pisf'), from:'null'() }" eventClass:@"core" eventID:@"setd" appPSN:savedPSN]; - ITDebugLog(@"Done showing player primary interface."); - return YES; } - (ITMTRemotePlayerRunningState)playerRunningState @@ -163,13 +175,14 @@ } for (k = 1; k <= numSources ; k++) { - const signed long numPlaylists = [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:[NSString stringWithFormat:@"kocl:type('cPly'), '----':obj { form:'indx', want:type('cSrc'), seld:long(%u), from:() }",k] eventClass:@"core" eventID:@"cnte" appPSN:savedPSN]; + const signed long numPlaylists = [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:[NSString stringWithFormat:@"kocl:type('cPly'), '----':obj { form:'indx', want:type('cSrc'), seld:long(%u), from:() }",k] eventClass:@"core" eventID:@"cnte" appPSN:savedPSN];; unsigned long fourcc = [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:[NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('pKnd'), from:obj { form:'indx', want:type('cSrc'), seld:long(%u), from:() } }",k] eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; NSString *sourceName = [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('pnam'), from:obj { form:'indx', want:type('cSrc'), seld:long(%u), from:() } }",k] eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; + unsigned long index = [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:[NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('pidx'), from:obj { form:'indx', want:type('cSrc'), seld:long(%u), from:() } }",k] eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; unsigned long class; if (sourceName) { NSMutableArray *aSource = [[NSMutableArray alloc] init]; - [aSource addObject:[[sourceName copy] autorelease]]; + [aSource addObject:sourceName]; switch (fourcc) { case 'kTun': class = ITMTRemoteRadioSource; @@ -193,14 +206,15 @@ class = ITMTRemoteLibrarySource; break; } - ITDebugLog(@"Adding source %@ of type %i", sourceName, class); + ITDebugLog(@"Adding source %@ of type %i at index %i", sourceName, class, index); [aSource addObject:[NSNumber numberWithInt:class]]; + [aSource addObject:[NSNumber numberWithInt:index]]; for (i = 1; i <= numPlaylists; i++) { NSString *sendStr = [NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('pnam'), from:obj { form:'indx', want:type('cPly'), seld:long(%u), from:obj { form:'indx', want:type('cSrc'), seld:long(%u), from:() } } }",i,k]; NSString *theObj = [[ITAppleEventCenter sharedCenter] sendAEWithSendString:sendStr eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; ITDebugLog(@" - Adding playlist %@", theObj); if (theObj) { - [aSource addObject:[[theObj copy] autorelease]]; + [aSource addObject:theObj]; } } [allSources addObject:[aSource autorelease]]; @@ -212,6 +226,42 @@ return [allSources autorelease]; } +- (NSArray *)artists +{ + NSAppleEventDescriptor *rawr = ITSendAEWithString(@"'----':obj { form:'prop', want:type('prop'), seld:type('pArt'), from:obj { form:'indx', want:type('cTrk'), seld:abso($616C6C20$), from:obj { form:'indx', want:type('cPly'), seld:long(1), from:obj { form:'indx', want:type('cSrc'), seld:long(1), from:() } } } }", 'core', 'getd', &savedPSN); + int i; + NSMutableArray *array = [[NSMutableArray alloc] init]; + NSArray *returnArray; + for (i = 1; i <= [rawr numberOfItems]; i++) { + NSString *artist = [[rawr descriptorAtIndex:i] stringValue]; + if (artist && [artist length] && ![array containsObject:artist]) { + [array addObject:artist]; + } + } + [array sortUsingSelector:@selector(caseInsensitiveCompare:)]; + returnArray = [NSArray arrayWithArray:array]; + [array release]; + return returnArray; +} + +- (NSArray *)albums +{ + NSAppleEventDescriptor *rawr = ITSendAEWithString(@"'----':obj { form:'prop', want:type('prop'), seld:type('pAlb'), from:obj { form:'indx', want:type('cTrk'), seld:abso($616C6C20$), from:obj { form:'indx', want:type('cPly'), seld:long(1), from:obj { form:'indx', want:type('cSrc'), seld:long(1), from:() } } } }", 'core', 'getd', &savedPSN); + int i; + NSMutableArray *array = [[NSMutableArray alloc] init]; + NSArray *returnArray; + for (i = 1; i <= [rawr numberOfItems]; i++) { + NSString *album = [[rawr descriptorAtIndex:i] stringValue]; + if (album && [album length] && ![array containsObject:album]) { + [array addObject:album]; + } + } + [array sortUsingSelector:@selector(caseInsensitiveCompare:)]; + returnArray = [NSArray arrayWithArray:array]; + [array release]; + return returnArray; +} + - (int)numberOfSongsInPlaylistAtIndex:(int)index { int temp1; @@ -328,7 +378,12 @@ { NSString *temp1; ITDebugLog(@"Getting current unique identifier."); - temp1 = [NSString stringWithFormat:@"%i-%i", [self currentPlaylistIndex], [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKeyForNumber:@"pDID" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]]; + int cls = [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKeyForNumber:@"pcls" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; + if ( ([self currentPlaylistClass] == ITMTRemotePlayerRadioPlaylist) || (cls == 'cURT') ) { + temp1 = [[ITAppleEventCenter sharedCenter] sendAEWithRequestedKey:@"pStT" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; + } else { + temp1 = [NSString stringWithFormat:@"%i-%i", [self currentPlaylistIndex], [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKeyForNumber:@"pDID" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]]; + } ITDebugLog(@"Getting current unique identifier done."); return ( ([temp1 length]) ? temp1 : nil ) ; } @@ -375,6 +430,19 @@ return ( ([temp1 length]) ? temp1 : nil ) ; } +- (NSString *)currentSongComposer +{ + NSString *temp1; + ITDebugLog(@"Getting current song artist."); + if ( [self currentPlaylistClass] != ITMTRemotePlayerRadioPlaylist ) { + temp1 = [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKey:@"pCmp" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; + } else { + temp1 = @""; + } + ITDebugLog(@"Getting current song artist done."); + return ( ([temp1 length]) ? temp1 : nil ) ; +} + - (NSString *)currentSongAlbum { NSString *temp1; @@ -460,6 +528,15 @@ } } +- (int)currentSongPlayCount +{ + int count; + ITDebugLog(@"Getting current song play count."); + count = [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKeyForNumber:@"pPlC" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; + ITDebugLog(@"Getting current song play count done."); + return count; +} + - (float)currentSongRating { float temp1; @@ -483,9 +560,9 @@ - (BOOL)equalizerEnabled { ITDebugLog(@"Getting equalizer enabled status."); - int thingy = [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:@"'----':obj { form:type('prop'), want:type('prop'), seld:type('pEQ '), from:() }" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; + int thingy = [[ITAppleEventCenter sharedCenter] sendAEWithRequestedKeyForNumber:@"pEQ " eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; ITDebugLog(@"Done getting equalizer enabled status."); - return thingy; + return (thingy != 0) ? YES : NO; } - (BOOL)setEqualizerEnabled:(BOOL)enabled @@ -693,6 +770,38 @@ return YES; } +- (BOOL)makePlaylistWithTerm:(NSString *)term ofType:(int)type +{ + int i; + + //Get fixed indexing status + BOOL fixed = [ITSendAEWithString(@"'----':obj { form:'prop', want:type('prop'), seld:type('pFix'), from:'null'() }", 'core', 'getd', &savedPSN) booleanValue]; + + //Enabled fixed indexing + ITSendAEWithString(@"data:long(1), '----':obj { form:'prop', want:type('prop'), seld:type('pFix'), from:'null'() }", 'core', 'setd', &savedPSN); + + //Search for the term + NSAppleEventDescriptor *searchResults = ITSendAEWithString([NSString stringWithFormat:@"pTrm:\"%@\", pAre:'%@', '----':obj { form:'indx', want:type('cPly'), seld:long(1), from:obj { form:'indx', want:type('cSrc'), seld:long(1), from:'null'() } }", term, ((type == 1) ? @"kSrR" : @"kSrL")], 'hook', 'Srch', &savedPSN); + + //Delete old MenuTunes playlist + ITSendAEWithString(@"'----':obj { form:'name', want:type('cPly'), seld:\"MenuTunes\", from:'null'() }", 'core', 'delo', &savedPSN); + + //Create MenuTunes playlist + ITSendAEWithString(@"prdt:{ pnam:\"MenuTunes\" }, kocl:type('cPly'), &subj:()", 'core', 'crel', &savedPSN); + + //Duplicate search results to playlist + for (i = 1; i <= [searchResults numberOfItems]; i++) { + ITSendAEWithStringAndObject(@"insh:obj { form:'name', want:type('cPly'), seld:\"MenuTunes\", from:'null'() }", [[searchResults descriptorAtIndex:i] aeDesc], 'core', 'clon', &savedPSN); + } + //Reset fixed indexing + ITSendAEWithString([NSString stringWithFormat:@"data:long(%i), '----':obj { form:'prop', want:type('prop'), seld:type('pFix'), from:'null'() }", fixed], 'core', 'setd', &savedPSN); + + //Play MenuTunes playlist + ITSendAEWithString(@"'----':obj { form:'name', want:type('cPly'), seld:\"MenuTunes\", from:'null'() }", 'hook', 'Play', &savedPSN); + + return YES; +} + - (ProcessSerialNumber)iTunesPSN { /*NSArray *apps = [[NSWorkspace sharedWorkspace] launchedApplications]; @@ -726,7 +835,7 @@ { if ([(NSString *)name isEqualToString:@"iTunes"]) { - ITDebugLog(@"iTunes' highLongOfPSN: %lu.", number.highLongOfPSN); + ITDebugLog(@"iTunes' highLPongOfPSN: %lu.", number.highLongOfPSN); ITDebugLog(@"iTunes' lowLongOfPSN: %lu.", number.lowLongOfPSN); ITDebugLog(@"Done getting iTunes' PSN."); return number;