Implemented a distributed notification for track information and playback status
This commit is contained in:
parent
42e6eb03c2
commit
da26e6757b
4 changed files with 77 additions and 1 deletions
|
@ -10,10 +10,13 @@
|
||||||
#import <Growl/GrowlApplicationBridge.h>
|
#import <Growl/GrowlApplicationBridge.h>
|
||||||
|
|
||||||
#import "PlaybackController.h"
|
#import "PlaybackController.h"
|
||||||
|
#import "PlaylistEntry.h"
|
||||||
|
|
||||||
@class AudioScrobbler;
|
@class AudioScrobbler;
|
||||||
@interface PlaybackEventController : NSObject <NSUserNotificationCenterDelegate, GrowlApplicationBridgeDelegate> {
|
@interface PlaybackEventController : NSObject <NSUserNotificationCenterDelegate, GrowlApplicationBridgeDelegate> {
|
||||||
NSOperationQueue *queue;
|
NSOperationQueue *queue;
|
||||||
|
|
||||||
|
PlaylistEntry *entry;
|
||||||
|
|
||||||
AudioScrobbler *scrobbler;
|
AudioScrobbler *scrobbler;
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,19 @@
|
||||||
#import "PlaybackEventController.h"
|
#import "PlaybackEventController.h"
|
||||||
|
|
||||||
#import "AudioScrobbler.h"
|
#import "AudioScrobbler.h"
|
||||||
#import "PlaylistEntry.h"
|
|
||||||
|
NSString *TrackPlaying = @"org.cogx.Cog-Track-Playing";
|
||||||
|
NSString *TrackStopped = @"org.cogx.Cog-Track-Stopped";
|
||||||
|
NSString *TrackPaused = @"org.cogx.Cog-Track-Paused";
|
||||||
|
|
||||||
|
NSString *TrackArtist = @"artist";
|
||||||
|
NSString *TrackAlbum = @"album";
|
||||||
|
NSString *TrackTitle = @"title";
|
||||||
|
NSString *TrackGenre = @"genre";
|
||||||
|
NSString *TrackComposer = @"composer";
|
||||||
|
NSString *TrackNumber = @"trackNumber";
|
||||||
|
NSString *TrackLength = @"length";
|
||||||
|
NSString *TrackCurrentTime = @"currentTime";
|
||||||
|
|
||||||
@implementation PlaybackEventController
|
@implementation PlaybackEventController
|
||||||
|
|
||||||
|
@ -42,6 +54,8 @@
|
||||||
scrobbler = [[AudioScrobbler alloc] init];
|
scrobbler = [[AudioScrobbler alloc] init];
|
||||||
[[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate:self];
|
[[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate:self];
|
||||||
[GrowlApplicationBridge setGrowlDelegate:self];
|
[GrowlApplicationBridge setGrowlDelegate:self];
|
||||||
|
|
||||||
|
entry = nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
|
@ -50,13 +64,35 @@
|
||||||
- (void)dealloc
|
- (void)dealloc
|
||||||
{
|
{
|
||||||
[queue release];
|
[queue release];
|
||||||
|
|
||||||
|
[entry release];
|
||||||
|
|
||||||
[super dealloc];
|
[super dealloc];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSDictionary *)fillNotificationDictionary:(PlaylistEntry *)pe
|
||||||
|
{
|
||||||
|
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
|
||||||
|
|
||||||
|
if ([pe title]) [dict setObject:[pe title] forKey:TrackTitle];
|
||||||
|
if ([pe artist]) [dict setObject:[pe artist] forKey:TrackArtist];
|
||||||
|
if ([pe album]) [dict setObject:[pe album] forKey:TrackAlbum];
|
||||||
|
if ([pe genre]) [dict setObject:[pe genre] forKey:TrackGenre];
|
||||||
|
if ([pe track]) [dict setObject:[pe track] forKey:TrackNumber];
|
||||||
|
if ([pe lengthText]) [dict setObject:[pe lengthText] forKey:TrackLength];
|
||||||
|
if ([pe positionText]) [dict setObject:[pe positionText] forKey:TrackCurrentTime];
|
||||||
|
|
||||||
|
return dict;
|
||||||
|
}
|
||||||
|
|
||||||
- (void)performPlaybackDidBeginActions:(PlaylistEntry *)pe
|
- (void)performPlaybackDidBeginActions:(PlaylistEntry *)pe
|
||||||
{
|
{
|
||||||
if (NO == [pe error]) {
|
if (NO == [pe error]) {
|
||||||
|
[entry release];
|
||||||
|
entry = [pe retain];
|
||||||
|
|
||||||
|
[[NSDistributedNotificationCenter defaultCenter] postNotificationName:TrackPlaying object:nil userInfo:[self fillNotificationDictionary:pe]];
|
||||||
|
|
||||||
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||||
|
|
||||||
if ([defaults boolForKey:@"notifications.enable"]) {
|
if ([defaults boolForKey:@"notifications.enable"]) {
|
||||||
|
@ -110,6 +146,7 @@
|
||||||
|
|
||||||
- (void)performPlaybackDidPauseActions
|
- (void)performPlaybackDidPauseActions
|
||||||
{
|
{
|
||||||
|
[[NSDistributedNotificationCenter defaultCenter] postNotificationName:TrackPaused object:nil userInfo:[self fillNotificationDictionary:entry]];
|
||||||
if([[NSUserDefaults standardUserDefaults] boolForKey:@"enableAudioScrobbler"]) {
|
if([[NSUserDefaults standardUserDefaults] boolForKey:@"enableAudioScrobbler"]) {
|
||||||
[scrobbler pause];
|
[scrobbler pause];
|
||||||
}
|
}
|
||||||
|
@ -117,6 +154,7 @@
|
||||||
|
|
||||||
- (void)performPlaybackDidResumeActions
|
- (void)performPlaybackDidResumeActions
|
||||||
{
|
{
|
||||||
|
[[NSDistributedNotificationCenter defaultCenter] postNotificationName:TrackPlaying object:nil userInfo:[self fillNotificationDictionary:entry]];
|
||||||
if([[NSUserDefaults standardUserDefaults] boolForKey:@"enableAudioScrobbler"]) {
|
if([[NSUserDefaults standardUserDefaults] boolForKey:@"enableAudioScrobbler"]) {
|
||||||
[scrobbler resume];
|
[scrobbler resume];
|
||||||
}
|
}
|
||||||
|
@ -124,6 +162,9 @@
|
||||||
|
|
||||||
- (void)performPlaybackDidStopActions
|
- (void)performPlaybackDidStopActions
|
||||||
{
|
{
|
||||||
|
[[NSDistributedNotificationCenter defaultCenter] postNotificationName:TrackStopped object:nil userInfo:[self fillNotificationDictionary:entry]];
|
||||||
|
[entry release];
|
||||||
|
entry = nil;
|
||||||
if([[NSUserDefaults standardUserDefaults] boolForKey:@"enableAudioScrobbler"]) {
|
if([[NSUserDefaults standardUserDefaults] boolForKey:@"enableAudioScrobbler"]) {
|
||||||
[scrobbler stop];
|
[scrobbler stop];
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,6 +73,10 @@
|
||||||
|
|
||||||
@property(readonly) NSString *spam;
|
@property(readonly) NSString *spam;
|
||||||
|
|
||||||
|
@property(readonly) NSString *positionText;
|
||||||
|
|
||||||
|
@property(readonly) NSString *lengthText;
|
||||||
|
|
||||||
@property int index;
|
@property int index;
|
||||||
@property int shuffleIndex;
|
@property int shuffleIndex;
|
||||||
|
|
||||||
|
|
|
@ -92,6 +92,16 @@
|
||||||
return [NSSet setWithObjects:@"artist", @"title", @"album", @"track", @"totalFrames", @"currentPosition", @"bitrate", nil];
|
return [NSSet setWithObjects:@"artist", @"title", @"album", @"track", @"totalFrames", @"currentPosition", @"bitrate", nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
+ (NSSet *)keyPathsForValuesAffectingPositionText
|
||||||
|
{
|
||||||
|
return [NSSet setWithObject:@"currentPosition"];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSSet *)keyPathsForValuesAffectingLengthText
|
||||||
|
{
|
||||||
|
return [NSSet setWithObject:@"length"];
|
||||||
|
}
|
||||||
|
|
||||||
+ (NSSet *)keyPathsForValuesAffectingAlbumArt
|
+ (NSSet *)keyPathsForValuesAffectingAlbumArt
|
||||||
{
|
{
|
||||||
return [NSSet setWithObject:@"albumArtInternal"];
|
return [NSSet setWithObject:@"albumArtInternal"];
|
||||||
|
@ -234,6 +244,24 @@
|
||||||
return [elements componentsJoinedByString:@""];
|
return [elements componentsJoinedByString:@""];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@dynamic positionText;
|
||||||
|
- (NSString *)positionText
|
||||||
|
{
|
||||||
|
SecondsFormatter *secondsFormatter = [[SecondsFormatter alloc] init];
|
||||||
|
NSString *time = [secondsFormatter stringForObjectValue:[NSNumber numberWithFloat:currentPosition]];
|
||||||
|
[secondsFormatter release];
|
||||||
|
return time;
|
||||||
|
}
|
||||||
|
|
||||||
|
@dynamic lengthText;
|
||||||
|
- (NSString *)lengthText
|
||||||
|
{
|
||||||
|
SecondsFormatter *secondsFormatter = [[SecondsFormatter alloc] init];
|
||||||
|
NSString *time = [secondsFormatter stringForObjectValue:[self length]];
|
||||||
|
[secondsFormatter release];
|
||||||
|
return time;
|
||||||
|
}
|
||||||
|
|
||||||
@synthesize albumArtInternal;
|
@synthesize albumArtInternal;
|
||||||
|
|
||||||
@dynamic albumArt;
|
@dynamic albumArt;
|
||||||
|
|
Loading…
Reference in a new issue