Quick Remote API update for an enumeration of all supported playlist classes.
[MenuTunes.git] / iTunesRemote.m
index 639843d..b14f74e 100755 (executable)
 
 - (NSDictionary *)capabilities
 {
-    return nil;
-}
-
-- (ITMTRemotePlayerRunningStatus)playerRunningState
+    return [NSDictionary dictionaryWithObjectsAndKeys:
+                [NSNumber numberWithBool: YES], @"Remote",
+                [NSNumber numberWithBool: YES], @"Basic Track Control",
+                [NSNumber numberWithBool: YES], @"Track Information",
+                [NSNumber numberWithBool: YES], @"Track Navigation",
+                [NSNumber numberWithBool: YES], @"Upcoming Songs",
+                [NSNumber numberWithBool: YES], @"Playlists",
+                [NSNumber numberWithBool: YES], @"Volume",
+                [NSNumber numberWithBool: YES], @"Shuffle",
+                [NSNumber numberWithBool: YES], @"Repeat Modes",
+                [NSNumber numberWithBool: YES], @"Equalizer",
+                [NSNumber numberWithBool: YES], @"Track Rating",
+                nil];
+}
+
+- (ITMTRemotePlayerRunningState)playerRunningState
 {
     NSArray *apps = [[NSWorkspace sharedWorkspace] launchedApplications];
     int i;
     return [[ITAppleEventCenter sharedCenter] sendAEWithSendStringForNumber:[NSString stringWithFormat:@"kocl:type('cTrk'), '----':obj { form:'indx', want:type('cPly'), seld:long(%lu), from:'null'() }",index] eventClass:@"core" eventID:@"cnte" appPSN:iTunesPSN];
 }
 
-- (NSString *)classOfPlaylistAtIndex:(int)index
+- (ITMTRemotePlayerPlaylistClass)classOfPlaylistAtIndex:(int)index
 {
     int realResult = [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKeyForNumber:@"pcls" fromObjectByKey:@"pPla" eventClass:@"core" eventID:@"getd" appPSN:iTunesPSN];
     
-    if (realResult == 'cRTP') {
-        return @"radio tuner playlist";
-    } else {
-        return @"playlist";
-    }
+    // ADD SUPPORT FOR RETURNING A ITMTRemotePlayerLibraryPlaylist WHEN PLAYLIST IS LIBRARY.
+
+    switch (realResult)
+          {
+          case 'cRTP':
+                 return ITMTRemotePlayerRadioPlaylist;
+                 break;
+          default:
+                 return ITMTRemotePlayerPlaylist;
+          }
 }
 
 - (int)currentPlaylistIndex
 
 - (BOOL)setCurrentSongRating:(float)rating
 {
-    [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"data:long(%lu), ----:obj { form:'prop', want:type('prop'), seld:type('pRte'), from:obj { form:'prop', want:type('prop'), seld:type('pTrk'), from:'null'() } ",(long)rating*100] eventClass:@"core" eventID:@"setd" appPSN:iTunesPSN];
+    [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"data:long(%lu), ----:obj { form:'prop', want:type('prop'), seld:type('pRte'), from:obj { form:'indx', want:type('cTrk'), seld:long(%lu), from:obj { form:'indx', want:type('cPly'), seld:long(%lu), from:'null'() } } }",(long)rating*100,[self currentSongIndex],[self currentPlaylistIndex]] eventClass:@"core" eventID:@"setd" appPSN:iTunesPSN];
     return YES;
 }
 
     return NO;
 }
 
+- (BOOL)shuffleEnabled
+{
+    int result = [[ITAppleEventCenter sharedCenter]
+                sendTwoTierAEWithRequestedKeyForNumber:@"pShf" fromObjectByKey:@"pPla" eventClass:@"core" eventID:@"getd" appPSN:iTunesPSN];
+    return result;
+}
+
+- (BOOL)setShuffleEnabled:(BOOL)enabled
+{
+    [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"data:long(%lu) ----:obj { form:'prop', want:type('prop'), seld:type('pShf'), from:obj { form:'prop', want:type('prop'), seld:type('pPla'), from:'null'() } }",enabled] eventClass:@"core" eventID:@"setd" appPSN:iTunesPSN];
+}
+
+- (ITMTRemotePlayerRepeatMode)repeatMode
+{
+    FourCharCode m00f;
+    int result;
+    m00f = [[ITAppleEventCenter sharedCenter]
+                sendTwoTierAEWithRequestedKeyForNumber:@"pRpt" fromObjectByKey:@"pPla" eventClass:@"core" eventID:@"getd" appPSN:iTunesPSN];
+
+    switch (m00f)
+          {
+          case 'kRp0':
+                 result = ITMTRemotePlayerRepeatOff;
+                 break;
+          case 'kRp1':
+                 result = ITMTRemotePlayerRepeatOne;
+                 break;
+          case 'kRpA':
+                 result = ITMTRemotePlayerRepeatAll;
+                 break;
+          }
+    
+    return result;
+}
+
+- (BOOL)setRepeatMode:(ITMTRemotePlayerRepeatMode)repeatMode
+{
+    FourCharCode m00f;
+    switch (repeatMode)
+          {
+          case ITMTRemotePlayerRepeatOff:
+                 m00f = 'kRp0';
+                 break;
+          case ITMTRemotePlayerRepeatOne:
+                 m00f = 'kRp1';
+                 break;
+          case ITMTRemotePlayerRepeatAll:
+                 m00f = 'kRpA';
+                 break;
+          }
+
+    [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"data:long(%lu) ----:obj { form:'prop', want:type('pRpt'), seld:type('pShf'), from:obj { form:'prop', want:type('prop'), seld:type('pPla'), from:'null'() } }",m00f] eventClass:@"core" eventID:@"setd" appPSN:iTunesPSN];
+
+}
+
 - (BOOL)play
 {
     [[ITAppleEventCenter sharedCenter] sendAEWithEventClass:@"hook" eventID:@"Play" appPSN:iTunesPSN];