Added a currentSongPlayed method that returns the integer seconds played in the curre...
[MenuTunes.git] / MainController.m
index 548ca25..d51b72f 100755 (executable)
@@ -469,8 +469,8 @@ static MainController *sharedController;
                                if (_audioscrobblerTimer) {
                                        [_audioscrobblerTimer invalidate];
                                }
                                if (_audioscrobblerTimer) {
                                        [_audioscrobblerTimer invalidate];
                                }
-                               if (length > 0) {
-                                       _audioscrobblerTimer = [NSTimer scheduledTimerWithTimeInterval:((length < 240) ? length / 2 : 120) target:self selector:@selector(submitAudioscrobblerTrack:) userInfo:nil repeats:NO];
+                               if (length > 30) {
+                                       _audioscrobblerTimer = [NSTimer scheduledTimerWithTimeInterval:((length < 240) ? length / 2 : 120) target:self selector:@selector(submitAudioscrobblerTrack:) userInfo:nil repeats:YES];
                                }
                        } else {
                                _audioscrobblerTimer = nil;
                                }
                        } else {
                                _audioscrobblerTimer = nil;
@@ -595,8 +595,8 @@ static MainController *sharedController;
                        if (_audioscrobblerTimer) {
                                [_audioscrobblerTimer invalidate];
                        }
                        if (_audioscrobblerTimer) {
                                [_audioscrobblerTimer invalidate];
                        }
-                       if (length > 0) {
-                               _audioscrobblerTimer = [NSTimer scheduledTimerWithTimeInterval:((length < 240) ? length / 2 : 120) target:self selector:@selector(submitAudioscrobblerTrack:) userInfo:nil repeats:NO];
+                       if (length > 30) {
+                               _audioscrobblerTimer = [NSTimer scheduledTimerWithTimeInterval:((length < 240) ? length / 2 : 120) target:self selector:@selector(submitAudioscrobblerTrack:) userInfo:nil repeats:YES];
                        }
                } else {
                        _audioscrobblerTimer = nil;
                        }
                } else {
                        _audioscrobblerTimer = nil;
@@ -614,20 +614,29 @@ static MainController *sharedController;
 
 - (void)submitAudioscrobblerTrack:(NSTimer *)timer
 {
 
 - (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
        if ([df boolForKey:@"audioscrobblerEnabled"]) {
                NS_DURING
-                       NSString *title = [[self currentRemote] currentSongTitle], *artist = [[self currentRemote] currentSongArtist];
-                       if (title && artist) {
-                               [[AudioscrobblerController sharedController] submitTrack:title
-                                                                                                                               artist:artist
-                                                                                                                               album:[[self currentRemote] currentSongAlbum]
-                                                                                                                               length:[[self currentRemote] currentSongDuration]];
+                       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
                        }
                NS_HANDLER
                        [self networkError:localException];
                NS_ENDHANDLER
-               [timer invalidate];
-               _audioscrobblerTimer = nil;
        }
 }
 
        }
 }
 
@@ -950,7 +959,7 @@ static MainController *sharedController;
         [hotKey setName:@"TrackInfo"];
         [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"TrackInfo"]]];
         [hotKey setTarget:self];
         [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]];
     }
     
         [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]];
     }
     
@@ -1060,6 +1069,18 @@ static MainController *sharedController;
     ITDebugLog(@"Finished setting up hot keys.");
 }
 
     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;
 - (void)showCurrentTrackInfo
 {
     ITMTRemotePlayerSource  source      = 0;
@@ -1073,14 +1094,6 @@ static MainController *sharedController;
     int                     rating      = -1;
     int                     playCount   = -1;
        
     int                     rating      = -1;
     int                     playCount   = -1;
        
-       //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;
-       }
-       
     ITDebugLog(@"Showing track info status window.");
     
     NS_DURING
     ITDebugLog(@"Showing track info status window.");
     
     NS_DURING