Uncommented the multisource playlist chooser.
[MenuTunes.git] / iTunesRemote.m
index a4e1558..0702568 100755 (executable)
 - (BOOL)showPrimaryInterface
 {
     ITDebugLog(@"Showing player primary interface.");
 - (BOOL)showPrimaryInterface
 {
     ITDebugLog(@"Showing player primary interface.");
-    //If not minimized
-    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) {
+    
+    //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];
     } else {
         //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 {
     return ITMTRemotePlayerStopped;
 }
 
     return ITMTRemotePlayerStopped;
 }
 
-- (NSArray *)playlists
+/*- (NSArray *)playlists
 {
     long i = 0;
     const signed long numPlaylists = [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:@"kocl:type('cPly'), '----':()" eventClass:@"core" eventID:@"cnte" appPSN:savedPSN];
 {
     long i = 0;
     const signed long numPlaylists = [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:@"kocl:type('cPly'), '----':()" eventClass:@"core" eventID:@"cnte" appPSN:savedPSN];
         [playlists addObject:theObj];
     }
     return [playlists autorelease];
         [playlists addObject:theObj];
     }
     return [playlists autorelease];
-}
+}*/
 
 //Full source awareness
 
 //Full source awareness
-/*- (NSArray *)playlists
-{   unsigned long i,k;
+- (NSArray *)playlists
+{
+    unsigned long i, k;
     const signed long numSources = [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:@"kocl:type('cSrc'), '----':()" eventClass:@"core" eventID:@"cnte" appPSN:savedPSN];
     NSMutableArray *allSources = [[NSMutableArray alloc] init];
     
     ITDebugLog(@"Getting playlists.");
     const signed long numSources = [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:@"kocl:type('cSrc'), '----':()" eventClass:@"core" eventID:@"cnte" appPSN:savedPSN];
     NSMutableArray *allSources = [[NSMutableArray alloc] init];
     
     ITDebugLog(@"Getting playlists.");
+    if (numSources == 0) {
+        ITDebugLog(@"No sources.");
+        return nil;
+    }
+    
     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];
         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];
     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];
         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];
-        NSNumber *sourceClass;
+        unsigned long class;
         NSMutableArray *aSource = [[NSMutableArray alloc] init];
         [aSource addObject:sourceName];
         NSMutableArray *aSource = [[NSMutableArray alloc] init];
         [aSource addObject:sourceName];
-        
         switch (fourcc) {
             case 'kTun':
         switch (fourcc) {
             case 'kTun':
-                sourceClass = [NSNumber numberWithInt:ITMTRemoteRadioSource];
+                class = ITMTRemoteRadioSource;
                 break;
             case 'kDev':
                 break;
             case 'kDev':
-                sourceClass = [NSNumber numberWithInt:ITMTRemoteGenericDeviceSource];
+                class = ITMTRemoteGenericDeviceSource;
                 break;
             case 'kPod':
                 break;
             case 'kPod':
-                sourceClass = [NSNumber numberWithInt:ITMTRemoteiPodSource];
+                class = ITMTRemoteiPodSource;
                 break;
             case 'kMCD':
             case 'kACD':
                 break;
             case 'kMCD':
             case 'kACD':
-                sourceClass = [NSNumber numberWithInt:ITMTRemoteCDSource];
+                class = ITMTRemoteCDSource;
                 break;
             case 'kShd':
                 break;
             case 'kShd':
-                sourceClass = [NSNumber numberWithInt:ITMTRemoteSharedLibrarySource];
+                class = ITMTRemoteSharedLibrarySource;
                 break;
             case 'kUnk':
             case 'kLib':
             default:
                 break;
             case 'kUnk':
             case 'kLib':
             default:
-                sourceClass = [NSNumber numberWithInt:ITMTRemoteLibrarySource];
+                class = ITMTRemoteLibrarySource;
                 break;
         }
                 break;
         }
-        
-        [aSource addObject:sourceClass];
+        ITDebugLog(@"Adding source %@ of type %i", sourceName, class);
+        [aSource addObject:[NSNumber numberWithInt:class]];
         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];
         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);
             [aSource addObject:theObj];
         }
         [allSources addObject:aSource];
         [aSource release];
     }
     ITDebugLog(@"Finished getting playlists.");
             [aSource addObject:theObj];
         }
         [allSources addObject:aSource];
         [aSource release];
     }
     ITDebugLog(@"Finished getting playlists.");
-    return [NSArray arrayWithArray:[allSources autorelease]];
-}*/
+    return [allSources autorelease];
+}
 
 - (int)numberOfSongsInPlaylistAtIndex:(int)index
 {
 
 - (int)numberOfSongsInPlaylistAtIndex:(int)index
 {
 {
     NSString *temp1;
     ITDebugLog(@"Getting current song title.");
 {
     NSString *temp1;
     ITDebugLog(@"Getting current song title.");
-    temp1 = [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKey:@"pnam" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN];
+    
+    //If we're listening to the radio.
+    if ([[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKeyForNumber:@"pcls" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN] == 'cURT') {
+        NSString *bad = [NSString stringWithUTF8String:"浳湧"];
+        temp1 = [[ITAppleEventCenter sharedCenter] sendAEWithRequestedKey:@"pStT" eventClass:@"core" eventID:@"getd" appPSN:savedPSN];
+        if ([temp1 isEqualToString:bad]) {
+            temp1 = [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKey:@"pnam" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN];
+        }
+        temp1 = [temp1 stringByAppendingString:@" (Stream)"];
+    } else {
+        temp1 = [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKey:@"pnam" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN];
+    }
     ITDebugLog(@"Getting current song title done.");
     return ( ([temp1 length]) ? temp1 : nil ) ;
 }
     ITDebugLog(@"Getting current song title done.");
     return ( ([temp1 length]) ? temp1 : nil ) ;
 }
 
 - (NSImage *)currentSongAlbumArt
 {
 
 - (NSImage *)currentSongAlbumArt
 {
-    NSAppleScript *script;
-    NSAppleEventDescriptor *moof;
-    NSData *data;
     ITDebugLog(@"Getting current song album art.");
     ITDebugLog(@"Getting current song album art.");
-    script = [[NSAppleScript alloc] initWithSource:@"tell application \"iTunes\"\nget data of artwork 1 of current track\nend tell"];
-    moof = [script executeAndReturnError:nil];
-    data = [moof data];
-    ITDebugLog(@"Getting current song album art done.");
-    
-    //NSLog(@"%@", [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForData:@"'---':obj { form:'prop', want:type('prop'), seld:type('data'), from:obj { form:'indx', want:type('cArt'), seld:1, from:obj { form:'prop', want:type('prop'), seld:type('pTrk'), from:'null'() } } }" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]);
-    
+    NSData *data = [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForData:@"'----':obj { form:'prop', want:type('prop'), seld:type('pPCT'), from:obj { form:'indx', want:type('cArt'), seld:long(1), from:obj { form:'prop', want:type('prop'), seld:type('pTrk'), from:'null'() } } }" eventClass:@"core" eventID:@"getd" appPSN:savedPSN];
+    ITDebugLog(@"Getting current song album art done.");    
     if (data) {
         return [[[NSImage alloc] initWithData:data] autorelease];
     } else {
     if (data) {
         return [[[NSImage alloc] initWithData:data] autorelease];
     } else {
     return YES;
 }
 
     return YES;
 }
 
-/*- (BOOL)switchToPlaylistAtIndex:(int)index ofSourceAtIndex:(int)index2
+- (BOOL)switchToPlaylistAtIndex:(int)index ofSourceAtIndex:(int)index2
 {
     ITDebugLog(@"Switching to playlist at index %i of source %i", index, index2);
     [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"'----':obj { form:'indx', want:type('cPly'), seld:long(%lu), from: obj { form:'indx', want:type('cSrc'), seld:long(%lu), from:'null'() } }", index - 1, index2 + 1] eventClass:@"hook" eventID:@"Play" appPSN:savedPSN];
     //{ form:'indx', want:type('cPly'), seld:long(%lu), from:obj { form:'indx', want:type('cSrc'), seld:long('%lu'), from:'null'() } } -- obj { form:'indx', want:type('cSrc'), seld:long(1), from:'null'() }
     ITDebugLog(@"Done switching to playlist at index %i of source %i", index, index2);
     return YES;
 {
     ITDebugLog(@"Switching to playlist at index %i of source %i", index, index2);
     [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"'----':obj { form:'indx', want:type('cPly'), seld:long(%lu), from: obj { form:'indx', want:type('cSrc'), seld:long(%lu), from:'null'() } }", index - 1, index2 + 1] eventClass:@"hook" eventID:@"Play" appPSN:savedPSN];
     //{ form:'indx', want:type('cPly'), seld:long(%lu), from:obj { form:'indx', want:type('cSrc'), seld:long('%lu'), from:'null'() } } -- obj { form:'indx', want:type('cSrc'), seld:long(1), from:'null'() }
     ITDebugLog(@"Done switching to playlist at index %i of source %i", index, index2);
     return YES;
-}*/
+}
 
 - (BOOL)switchToSongAtIndex:(int)index
 {
 
 - (BOOL)switchToSongAtIndex:(int)index
 {