X-Git-Url: http://git.ithinksw.org/MenuTunes.git/blobdiff_plain/95bfc9d0fa830da8615ed00808ff347df2f50eb5..780eb8412d27bba1eaaf0a03ab74f90c62f28253:/MainController.m diff --git a/MainController.m b/MainController.m index db0269f..4cfd11c 100755 --- a/MainController.m +++ b/MainController.m @@ -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"]) { @@ -198,6 +200,12 @@ static MainController *sharedController; [statusItem setImage:[NSImage imageNamed:@"MenuNormal"]]; [statusItem setAlternateImage:[NSImage imageNamed:@"MenuInverted"]]; + if ([df boolForKey:@"audioscrobblerEnabled"]) { + if ([PreferencesController getKeychainItemPasswordForUser:[df stringForKey:@"audioscrobblerUser"]] != nil) { + [[AudioscrobblerController sharedController] attemptHandshake:NO]; + } + } + [networkController startRemoteServerSearch]; [NSApp deactivate]; [self performSelector:@selector(rawr) withObject:nil afterDelay:1.0]; @@ -404,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."]; @@ -466,11 +479,12 @@ static MainController *sharedController; if ([df boolForKey:@"audioscrobblerEnabled"]) { int length = [[self currentRemote] currentSongDuration]; - if (_audioscrobblerTimer) { + if (length > 30) { + _audioscrobblerInterval = ((length / 2 < 240) ? length / 2 : 240); [_audioscrobblerTimer invalidate]; - } - if (length > 0) { - _audioscrobblerTimer = [NSTimer scheduledTimerWithTimeInterval:((length < 240) ? length / 2 : 120) target:self selector:@selector(submitAudioscrobblerTrack:) userInfo:nil repeats:NO]; + [_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; @@ -592,11 +606,12 @@ static MainController *sharedController; if ([df boolForKey:@"audioscrobblerEnabled"]) { int length = [[self currentRemote] currentSongDuration]; - if (_audioscrobblerTimer) { + if (length > 30) { + _audioscrobblerInterval = ((length / 2 < 240) ? length / 2 : 240); [_audioscrobblerTimer invalidate]; - } - if (length > 0) { - _audioscrobblerTimer = [NSTimer scheduledTimerWithTimeInterval:((length < 240) ? length / 2 : 120) target:self selector:@selector(submitAudioscrobblerTrack:) userInfo:nil repeats:NO]; + [_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; @@ -614,20 +629,30 @@ static MainController *sharedController; - (void)submitAudioscrobblerTrack:(NSTimer *)timer { + ITDebugLog(@"Audioscrobbler: Attempting to submit current track"); + [timer invalidate]; 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], length = [[self currentRemote] currentSongDuration], requiredInterval = ((length / 2 < 240) ? length / 2 : 240); + if ((abs(elapsed - requiredInterval) < 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 (requiredInterval - elapsed > 0) { + _audioscrobblerInterval = requiredInterval - elapsed; + [_audioscrobblerTimer release]; + ITDebugLog(@"Audioscrobbler: Creating a new timer that will run in %i seconds", _audioscrobblerInterval); + _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]; } NS_HANDLER [self networkError:localException]; NS_ENDHANDLER - [timer invalidate]; - _audioscrobblerTimer = nil; } } @@ -954,6 +979,16 @@ static MainController *sharedController; [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; } + if ([df objectForKey:@"AlbumArt"] != nil) { + ITDebugLog(@"Setting up album art hot key."); + hotKey = [[ITHotKey alloc] init]; + [hotKey setName:@"AlbumArt"]; + [hotKey setKeyCombo:[ITKeyCombo keyComboWithPlistRepresentation:[df objectForKey:@"AlbumArt"]]]; + [hotKey setTarget:self]; + [hotKey setAction:@selector(showCurrentAlbumArtHotKey)]; + [[ITHotKeyCenter sharedCenter] registerHotKey:[hotKey autorelease]]; + } + if ([df objectForKey:@"UpcomingSongs"] != nil) { ITDebugLog(@"Setting up upcoming songs hot key."); hotKey = [[ITHotKey alloc] init]; @@ -1072,6 +1107,57 @@ static MainController *sharedController; [self showCurrentTrackInfo]; } +- (void)showCurrentAlbumArtHotKey +{ + //If we're already visible and the setting says so, vanish instead of displaying again. + if ([df boolForKey:@"ToggleTrackInfoWithHotKey"] && [statusWindowController currentStatusWindowType] == StatusWindowAlbumArtType && [[StatusWindow sharedWindow] visibilityState] == ITWindowVisibleState) { + ITDebugLog(@"Art window is already visible, hiding track window."); + [[StatusWindow sharedWindow] vanish:nil]; + return; + } + [self showCurrentAlbumArt]; +} + +- (void)showCurrentAlbumArt +{ + NSImage *art = nil; + NS_DURING + art = [[self currentRemote] currentSongAlbumArt]; + NS_HANDLER + [self networkError:localException]; + NS_ENDHANDLER + + if (art) { + NSSize oldSize = [art size], newSize; + if (oldSize.width > 300 && oldSize.height > 300) { + if (oldSize.width > oldSize.height) { + newSize = NSMakeSize(300, oldSize.height * (300.0f / oldSize.width)); + } else { + newSize = NSMakeSize(oldSize.width * (300.0f / oldSize.height), 300); + } + } else { + newSize = oldSize; + } + + art = [[[[NSImage alloc] initWithData:[art TIFFRepresentation]] autorelease] imageScaledSmoothlyToSize:newSize]; + + [statusWindowController showAlbumArtWindowWithImage:art]; + } else { + NSString *string = nil; + NS_DURING + if ([[self currentRemote] currentSongTitle]) { + string = NSLocalizedString(@"noAlbumArt", @"No art for current song."); + } else { + string = NSLocalizedString(@"noSongPlaying", @"No song is playing."); + } + NS_HANDLER + [self networkError:localException]; + NS_ENDHANDLER + //Show the no song playing window if there is no album art or no track is playing + [statusWindowController showAlbumArtWindowWithErrorText:string]; + } +} + - (void)showCurrentTrackInfo { ITMTRemotePlayerSource source = 0; @@ -1204,9 +1290,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 ([statusWindowController currentStatusWindowType] == StatusWindowTrackInfoType && [sw visibilityState] != ITWindowHiddenState) { NSString *time = nil, *length; NS_DURING length = [[self currentRemote] currentSongLength]; @@ -1504,12 +1590,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; @@ -1534,10 +1622,12 @@ static MainController *sharedController; [networkController disconnect]; if ([[self currentRemote] playerRunningState] == ITMTRemotePlayerRunning) { + refreshTimer = nil; [self applicationLaunched:nil]; } else { [self applicationTerminated:nil]; } + if (refreshTimer) { [self timerUpdate]; };