Added a currentSongPlayed method that returns the integer seconds played in the curre...
[MenuTunes.git] / MainController.m
index cfc9518..d51b72f 100755 (executable)
@@ -9,6 +9,7 @@
 #import <ITKit/ITCategory-NSMenu.h>
 #import "StatusWindow.h"
 #import "StatusWindowController.h"
+#import "AudioscrobblerController.h"
 #import "StatusItemHack.h"
 
 @interface NSMenu (MenuImpl)
@@ -88,6 +89,7 @@ static MainController *sharedController;
         sharedController = self;
         
                _statusWindowUpdateTimer = nil;
+               _audioscrobblerTimer = nil;
                
         remoteArray = [[NSMutableArray alloc] initWithCapacity:1];
         [[PreferencesController sharedPrefs] setController:self];
@@ -461,6 +463,18 @@ static MainController *sharedController;
                                        [statusItem setToolTip:nil];
                                }
                        }
+                       
+                       if ([df boolForKey:@"audioscrobblerEnabled"]) {
+                               int length = [[self currentRemote] currentSongDuration];
+                               if (_audioscrobblerTimer) {
+                                       [_audioscrobblerTimer invalidate];
+                               }
+                               if (length > 30) {
+                                       _audioscrobblerTimer = [NSTimer scheduledTimerWithTimeInterval:((length < 240) ? length / 2 : 120) target:self selector:@selector(submitAudioscrobblerTrack:) userInfo:nil repeats:YES];
+                               }
+                       } else {
+                               _audioscrobblerTimer = nil;
+                       }
         NS_HANDLER
             [self networkError:localException];
         NS_ENDHANDLER
@@ -575,6 +589,18 @@ static MainController *sharedController;
                                [statusItem setToolTip:nil];
                        }
                }
+               
+               if ([df boolForKey:@"audioscrobblerEnabled"]) {
+                       int length = [[self currentRemote] currentSongDuration];
+                       if (_audioscrobblerTimer) {
+                               [_audioscrobblerTimer invalidate];
+                       }
+                       if (length > 30) {
+                               _audioscrobblerTimer = [NSTimer scheduledTimerWithTimeInterval:((length < 240) ? length / 2 : 120) target:self selector:@selector(submitAudioscrobblerTrack:) userInfo:nil repeats:YES];
+                       }
+               } else {
+                       _audioscrobblerTimer = nil;
+               }
        NS_HANDLER
                [self networkError:localException];
        NS_ENDHANDLER
@@ -586,6 +612,34 @@ static MainController *sharedController;
     }
 }
 
+- (void)submitAudioscrobblerTrack:(NSTimer *)timer
+{
+       int interval = [timer timeInterval];
+       [timer invalidate];
+       _audioscrobblerTimer = nil;
+       ITDebugLog(@"Audioscrobbler: Attempting to submit current track");
+       if ([df boolForKey:@"audioscrobblerEnabled"]) {
+               NS_DURING
+                       int elapsed = [[self currentRemote] currentSongPlayed];
+                       if ((abs(elapsed - interval) < 5) && ([[self currentRemote] playerPlayingState] == ITMTRemotePlayerPlaying)) {
+                               NSString *title = [[self currentRemote] currentSongTitle], *artist = [[self currentRemote] currentSongArtist];
+                               if (title && artist) {
+                                       ITDebugLog(@"Audioscrobbler: Submitting current track");
+                                       [[AudioscrobblerController sharedController] submitTrack:title
+                                                                                                                                       artist:artist
+                                                                                                                                       album:[[self currentRemote] currentSongAlbum]
+                                                                                                                                       length:[[self currentRemote] currentSongDuration]];
+                               }
+                       } else if (interval - elapsed > 0) {
+                               ITDebugLog(@"Audioscrobbler: Creating a new timer that will run in %i seconds", interval - elapsed);
+                               _audioscrobblerTimer = [NSTimer scheduledTimerWithTimeInterval:(interval - elapsed) target:self selector:@selector(submitAudioscrobblerTrack:) userInfo:nil repeats:YES];
+                       }
+               NS_HANDLER
+                       [self networkError:localException];
+               NS_ENDHANDLER
+       }
+}
+
 //
 //
 // Menu Selectors
@@ -905,7 +959,7 @@ static MainController *sharedController;
         [hotKey setName:@"TrackInfo"];
         [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"TrackInfo"]]];
         [hotKey setTarget:self];
-        [hotKey setAction:@selector(showCurrentTrackInfo)];
+        [hotKey setAction:@selector(showCurrentTrackInfoHotKey)];
         [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]];
     }
     
@@ -1015,6 +1069,18 @@ static MainController *sharedController;
     ITDebugLog(@"Finished setting up hot keys.");
 }
 
+- (void)showCurrentTrackInfoHotKey
+{
+       //If we're already visible and the setting says so, vanish instead of displaying again.
+       if ([df boolForKey:@"ToggleTrackInfoWithHotKey"] && [statusWindowController currentStatusWindowType] == StatusWindowTrackInfoType && [[StatusWindow sharedWindow] visibilityState] == ITWindowVisibleState) {
+               ITDebugLog(@"Track window is already visible, hiding track window.");
+               [self invalidateStatusWindowUpdateTimer];
+               [[StatusWindow sharedWindow] vanish:nil];
+               return;
+       }
+       [self showCurrentTrackInfo];
+}
+
 - (void)showCurrentTrackInfo
 {
     ITMTRemotePlayerSource  source      = 0;
@@ -1039,16 +1105,18 @@ static MainController *sharedController;
     
     if ( title ) {
         if ( [df boolForKey:@"showAlbumArtwork"] ) {
-           NSSize oldSize, newSize;
-             NS_DURING
-                art = [[self currentRemote] currentSongAlbumArt];
-                oldSize = [art size];
-                if (oldSize.width > oldSize.height) newSize = NSMakeSize(110,oldSize.height * (110.0f / oldSize.width));
-                else newSize = NSMakeSize(oldSize.width * (110.0f / oldSize.height),110);
-                art = [[[[NSImage alloc] initWithData:[art TIFFRepresentation]] autorelease] imageScaledSmoothlyToSize:newSize];
-            NS_HANDLER
-                [self networkError:localException];
-            NS_ENDHANDLER
+                       NSSize oldSize, newSize;
+                       NS_DURING
+                               art = [[self currentRemote] currentSongAlbumArt];
+                               oldSize = [art size];
+                               if (oldSize.width > oldSize.height) {
+                                       newSize = NSMakeSize(110,oldSize.height * (110.0f / oldSize.width));
+                               }
+                               else newSize = NSMakeSize(oldSize.width * (110.0f / oldSize.height),110);
+                               art = [[[[NSImage alloc] initWithData:[art TIFFRepresentation]] autorelease] imageScaledSmoothlyToSize:newSize];
+                       NS_HANDLER
+                               [self networkError:localException];
+                       NS_ENDHANDLER
         }
         
         if ( [df boolForKey:@"showAlbum"] ) {
@@ -1329,9 +1397,11 @@ static MainController *sharedController;
 
 - (void)setRating:(ITHotKey *)sender
 {
-    int stars = [[sender name] characterAtIndex:9] - 48;
-    [self selectSongRating:stars * 20];
-    [statusWindowController showRatingWindowWithRating:(float)stars / 5.0];
+       if ([self songIsPlaying]) {
+               int stars = [[sender name] characterAtIndex:9] - 48;
+               [self selectSongRating:stars * 20];
+               [statusWindowController showRatingWindowWithRating:(float)stars / 5.0];
+       }
 }
 
 - (void)toggleLoop