Added a status field to the audioscrobbler preferences. Using alloc'd NSTimers in...
[MenuTunes.git] / MainController.m
index 7a8c874..b39d34d 100755 (executable)
@@ -140,6 +140,8 @@ static MainController *sharedController;
     currentRemote = [self loadRemote];
     [[self currentRemote] begin];
     
+       [[self currentRemote] currentSongElapsed];
+       
     //Turn on network stuff if needed
     networkController = [[NetworkController alloc] init];
     if ([df boolForKey:@"enableSharing"]) {
@@ -199,7 +201,9 @@ static MainController *sharedController;
     [statusItem setAlternateImage:[NSImage imageNamed:@"MenuInverted"]];
 
        if ([df boolForKey:@"audioscrobblerEnabled"]) {
-               [[AudioscrobblerController sharedController] attemptHandshake:NO];
+               if ([PreferencesController getKeychainItemPasswordForUser:[df stringForKey:@"audioscrobblerUser"]] != nil) {
+                       [[AudioscrobblerController sharedController] attemptHandshake:NO];
+               }
        }
 
     [networkController startRemoteServerSearch];
@@ -408,7 +412,12 @@ static MainController *sharedController;
 
 - (void)timerUpdate
 {
-       NSString *identifier = [[self currentRemote] playerStateUniqueIdentifier];
+       NSString *identifier = nil;
+       NS_DURING
+               identifier = [[self currentRemote] playerStateUniqueIdentifier];
+       NS_HANDLER
+               [self networkError:localException];
+       NS_ENDHANDLER
        if (refreshTimer && identifier == nil) {
                if ([statusItem isEnabled]) {
                        [statusItem setToolTip:@"iTunes not responding."];
@@ -470,11 +479,12 @@ static MainController *sharedController;
                        
                        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];
+                                       _audioscrobblerInterval = ((length / 2 < 240) ? length / 2 : 240);
+                                       [_audioscrobblerTimer invalidate];
+                                       [_audioscrobblerTimer release];
+                                       _audioscrobblerTimer = [[NSTimer alloc] initWithFireDate:[NSDate dateWithTimeIntervalSinceNow:_audioscrobblerInterval] interval:nil target:self selector:@selector(submitAudioscrobblerTrack:) userInfo:nil repeats:NO];
+                                       [[NSRunLoop currentRunLoop] addTimer:_audioscrobblerTimer forMode:NSDefaultRunLoopMode];
                                }
                        } else {
                                _audioscrobblerTimer = nil;
@@ -596,11 +606,12 @@ static MainController *sharedController;
                
                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];
+                               _audioscrobblerInterval = ((length / 2 < 240) ? length / 2 : 240);
+                               [_audioscrobblerTimer invalidate];
+                               [_audioscrobblerTimer release];
+                               _audioscrobblerTimer = [[NSTimer alloc] initWithFireDate:[NSDate dateWithTimeIntervalSinceNow:_audioscrobblerInterval] interval:1.0 target:self selector:@selector(submitAudioscrobblerTrack:) userInfo:nil repeats:NO];
+                               [[NSRunLoop currentRunLoop] addTimer:_audioscrobblerTimer forMode:NSDefaultRunLoopMode];
                        }
                } else {
                        _audioscrobblerTimer = nil;
@@ -618,14 +629,12 @@ static MainController *sharedController;
 
 - (void)submitAudioscrobblerTrack:(NSTimer *)timer
 {
-       int interval = [timer timeInterval];
-       [timer invalidate];
-       _audioscrobblerTimer = nil;
        ITDebugLog(@"Audioscrobbler: Attempting to submit current track");
+       [timer invalidate];
        if ([df boolForKey:@"audioscrobblerEnabled"]) {
                NS_DURING
                        int elapsed = [[self currentRemote] currentSongPlayed];
-                       if ((abs(elapsed - interval) < 5) && ([[self currentRemote] playerPlayingState] == ITMTRemotePlayerPlaying)) {
+                       if ((abs(elapsed - _audioscrobblerInterval) < 5) && ([[self currentRemote] playerPlayingState] == ITMTRemotePlayerPlaying)) {
                                NSString *title = [[self currentRemote] currentSongTitle], *artist = [[self currentRemote] currentSongArtist];
                                if (title && artist) {
                                        ITDebugLog(@"Audioscrobbler: Submitting current track");
@@ -634,9 +643,12 @@ static MainController *sharedController;
                                                                                                                                        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];
+                       } else if (_audioscrobblerInterval - elapsed > 0) {
+                               ITDebugLog(@"Audioscrobbler: Creating a new timer that will run in %i seconds", _audioscrobblerInterval - elapsed);
+                               _audioscrobblerInterval -= elapsed;
+                               [_audioscrobblerTimer release];
+                               _audioscrobblerTimer = [[NSTimer alloc] initWithFireDate:[NSDate dateWithTimeIntervalSinceNow:_audioscrobblerInterval] interval:nil target:self selector:@selector(submitAudioscrobblerTrack:) userInfo:nil repeats:NO];
+                               [[NSRunLoop currentRunLoop] addTimer:_audioscrobblerTimer forMode:NSDefaultRunLoopMode];
                        }
                NS_HANDLER
                        [self networkError:localException];
@@ -1217,9 +1229,9 @@ static MainController *sharedController;
 
 - (void)updateTime:(NSTimer *)timer
 {
-       StatusWindow *sw = [StatusWindow sharedWindow];
+       StatusWindow *sw = (StatusWindow *)[StatusWindow sharedWindow];
        _timeUpdateCount++;
-       if (_timeUpdateCount < (int)[sw exitDelay] + (int)[[sw exitEffect] effectTime] + (int)[[sw entryEffect] effectTime]) {
+       if ([sw visibilityState] != ITWindowHiddenState) {
                NSString *time = nil, *length;
                NS_DURING
                        length = [[self currentRemote] currentSongLength];
@@ -1517,12 +1529,14 @@ static MainController *sharedController;
                        if (refreshTimer) {
                                [refreshTimer invalidate];
                        }
-                       refreshTimer = [[NSTimer scheduledTimerWithTimeInterval:([networkController isConnectedToServer] ? 10.0 : 0.5)
-                                                                        target:self
-                                                                        selector:@selector(timerUpdate)
-                                                                        userInfo:nil
-                                                                        repeats:YES] retain];
                }
+               
+               refreshTimer = [[NSTimer scheduledTimerWithTimeInterval:([networkController isConnectedToServer] ? 10.0 : 0.5)
+                                                                target:self
+                                                                selector:@selector(timerUpdate)
+                                                                userInfo:nil
+                                                                repeats:YES] retain];
+               
         [self timerUpdate];
         ITDebugLog(@"Connection successful.");
         return 1;
@@ -1547,10 +1561,12 @@ static MainController *sharedController;
     [networkController disconnect];
     
     if ([[self currentRemote] playerRunningState] == ITMTRemotePlayerRunning) {
+               refreshTimer = nil;
         [self applicationLaunched:nil];
     } else {
         [self applicationTerminated:nil];
     }
+       
     if (refreshTimer) {
                [self timerUpdate];
        };