2005-06-02 18:16:43 +00:00
|
|
|
//
|
|
|
|
// PlaylistEntry.m
|
|
|
|
// Cog
|
|
|
|
//
|
|
|
|
// Created by Vincent Spader on 3/14/05.
|
2005-07-02 21:02:06 +00:00
|
|
|
// Copyright 2005 Vincent Spader All rights reserved.
|
2005-06-02 18:16:43 +00:00
|
|
|
//
|
|
|
|
|
|
|
|
#import "PlaylistEntry.h"
|
2007-02-24 20:36:27 +00:00
|
|
|
#import "CogAudio/AudioPropertiesReader.h"
|
|
|
|
#import "CogAudio/AudioMetadataReader.h"
|
2005-06-02 18:16:43 +00:00
|
|
|
|
|
|
|
@implementation PlaylistEntry
|
|
|
|
|
2008-02-20 00:44:40 +00:00
|
|
|
@synthesize index;
|
|
|
|
@synthesize shuffleIndex;
|
2008-03-01 03:29:21 +00:00
|
|
|
|
|
|
|
@synthesize current;
|
|
|
|
@synthesize removed;
|
|
|
|
|
|
|
|
@synthesize stopAfter;
|
|
|
|
|
|
|
|
@synthesize queued;
|
2008-02-22 15:26:46 +00:00
|
|
|
@synthesize queuePosition;
|
2005-06-02 18:16:43 +00:00
|
|
|
|
2008-03-01 03:29:21 +00:00
|
|
|
@synthesize error;
|
|
|
|
@synthesize errorMessage;
|
|
|
|
|
2008-02-20 00:44:40 +00:00
|
|
|
@synthesize URL;
|
2005-06-02 18:16:43 +00:00
|
|
|
|
2008-02-20 00:44:40 +00:00
|
|
|
@synthesize artist;
|
|
|
|
@synthesize album;
|
|
|
|
@synthesize genre;
|
|
|
|
@synthesize year;
|
|
|
|
@synthesize track;
|
2005-06-02 18:16:43 +00:00
|
|
|
|
2008-02-20 00:44:40 +00:00
|
|
|
@synthesize totalFrames;
|
|
|
|
@synthesize bitrate;
|
|
|
|
@synthesize channels;
|
|
|
|
@synthesize bitsPerSample;
|
|
|
|
@synthesize sampleRate;
|
2005-06-02 18:16:43 +00:00
|
|
|
|
2008-03-01 03:29:21 +00:00
|
|
|
@synthesize endian;
|
|
|
|
|
2008-02-20 00:44:40 +00:00
|
|
|
@synthesize seekable;
|
2006-05-12 14:41:02 +00:00
|
|
|
|
2008-02-29 21:54:09 +00:00
|
|
|
// The following read-only keys depend on the values of other properties
|
|
|
|
|
|
|
|
+ (NSSet *)keyPathsForValuesAffectingDisplay
|
|
|
|
{
|
|
|
|
return [NSSet setWithObjects:@"artist",@"title",nil];
|
|
|
|
}
|
|
|
|
|
|
|
|
+ (NSSet *)keyPathsForValuesAffectingLength
|
|
|
|
{
|
|
|
|
return [NSSet setWithObject:@"totalFrames"];
|
2006-05-12 14:41:02 +00:00
|
|
|
}
|
|
|
|
|
2008-02-29 21:54:09 +00:00
|
|
|
+ (NSSet *)keyPathsForValuesAffectingPath
|
2005-06-02 18:16:43 +00:00
|
|
|
{
|
2008-02-29 21:54:09 +00:00
|
|
|
return [NSSet setWithObject:@"URL"];
|
|
|
|
}
|
|
|
|
|
|
|
|
+ (NSSet *)keyPathsForValuesAffectingFilename
|
|
|
|
{
|
|
|
|
return [NSSet setWithObject:@"URL"];
|
2006-05-12 19:08:39 +00:00
|
|
|
}
|
|
|
|
|
2008-03-01 03:29:21 +00:00
|
|
|
+ (NSSet *)keyPathsForValuesAffectingStatus
|
2006-05-12 19:08:39 +00:00
|
|
|
{
|
2008-03-01 03:29:21 +00:00
|
|
|
return [NSSet setWithObjects:@"current",@"queued", @"error", nil];
|
|
|
|
}
|
|
|
|
|
|
|
|
+ (NSSet *)keyPathsForValuesAffectingStatusMessage
|
|
|
|
{
|
|
|
|
return [NSSet setWithObjects:@"current", @"queued", @"queuePosition", @"error", @"errorMessage", nil];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)setProperties:(NSDictionary *)properties
|
|
|
|
{
|
|
|
|
if (properties == nil)
|
|
|
|
{
|
|
|
|
self.error = YES;
|
|
|
|
self.errorMessage = @"Unable to retrieve properties.";
|
2006-05-12 19:08:39 +00:00
|
|
|
|
2008-02-22 03:44:06 +00:00
|
|
|
return;
|
|
|
|
}
|
2008-03-01 03:29:21 +00:00
|
|
|
|
|
|
|
[self setValuesForKeysWithDictionary:properties];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)readPropertiesThread
|
|
|
|
{
|
|
|
|
NSDictionary *properties = [AudioPropertiesReader propertiesForURL:self.URL];
|
|
|
|
|
|
|
|
[self performSelectorOnMainThread:@selector(setProperties:) withObject:properties waitUntilDone:YES];
|
2006-05-12 19:08:39 +00:00
|
|
|
}
|
|
|
|
|
2007-03-09 01:16:06 +00:00
|
|
|
- (void)readMetadataThread
|
2006-05-12 19:08:39 +00:00
|
|
|
{
|
2008-02-20 00:44:40 +00:00
|
|
|
NSDictionary *metadata = [AudioMetadataReader metadataForURL:self.URL];
|
2008-02-18 16:06:54 +00:00
|
|
|
|
2008-02-29 21:54:09 +00:00
|
|
|
[self performSelectorOnMainThread:@selector(setValuesForKeysWithDictionary:) withObject:metadata waitUntilDone:YES];
|
2007-02-24 20:36:27 +00:00
|
|
|
|
2006-05-12 19:08:39 +00:00
|
|
|
}
|
|
|
|
|
2006-09-17 18:11:29 +00:00
|
|
|
- (NSString *)description
|
|
|
|
{
|
2008-02-20 00:44:40 +00:00
|
|
|
return [NSString stringWithFormat:@"PlaylistEntry %i:(%@)", self.index, self.URL];
|
|
|
|
}
|
|
|
|
|
2008-02-29 21:54:09 +00:00
|
|
|
// Get the URL if the title is blank
|
|
|
|
@synthesize title;
|
|
|
|
- (NSString *)title
|
|
|
|
{
|
|
|
|
if(self.URL && (title == nil || [title isEqualToString:@""]))
|
|
|
|
{
|
|
|
|
return [[self.URL path] lastPathComponent];
|
|
|
|
}
|
|
|
|
return [[title retain] autorelease];
|
|
|
|
}
|
|
|
|
|
2008-02-29 21:56:01 +00:00
|
|
|
@dynamic display;
|
|
|
|
- (NSString *)display
|
|
|
|
{
|
|
|
|
if ((self.artist == NULL) || ([self.artist isEqualToString:@""]))
|
|
|
|
return self.title;
|
|
|
|
else {
|
|
|
|
return [NSString stringWithFormat:@"%@ - %@", self.artist, self.title];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-02-29 20:09:59 +00:00
|
|
|
@dynamic length;
|
|
|
|
- (NSNumber *)length
|
2007-11-24 20:16:27 +00:00
|
|
|
{
|
2008-02-29 20:09:59 +00:00
|
|
|
return [NSNumber numberWithDouble:((double)self.totalFrames / self.sampleRate)];
|
2008-02-20 00:44:40 +00:00
|
|
|
}
|
|
|
|
|
2008-02-29 20:09:59 +00:00
|
|
|
@dynamic path;
|
2008-02-20 00:44:40 +00:00
|
|
|
- (NSString *)path
|
|
|
|
{
|
|
|
|
return [[self.URL path] stringByAbbreviatingWithTildeInPath];
|
|
|
|
}
|
|
|
|
|
2008-02-29 20:09:59 +00:00
|
|
|
@dynamic filename;
|
2008-02-20 00:44:40 +00:00
|
|
|
- (NSString *)filename
|
|
|
|
{
|
|
|
|
return [[self.URL path] lastPathComponent];
|
2007-11-24 20:16:27 +00:00
|
|
|
}
|
|
|
|
|
2008-03-01 03:29:21 +00:00
|
|
|
@dynamic status;
|
|
|
|
- (NSString *)status
|
|
|
|
{
|
|
|
|
if (self.stopAfter)
|
|
|
|
{
|
|
|
|
return @"stopAfter";
|
|
|
|
}
|
|
|
|
else if (self.current)
|
|
|
|
{
|
|
|
|
return @"playing";
|
|
|
|
}
|
|
|
|
else if (self.queued)
|
|
|
|
{
|
|
|
|
return @"queued";
|
|
|
|
}
|
|
|
|
else if (self.error)
|
|
|
|
{
|
|
|
|
return @"error";
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil;
|
|
|
|
}
|
|
|
|
|
|
|
|
@dynamic statusMessage;
|
|
|
|
- (NSString *)statusMessage
|
|
|
|
{
|
|
|
|
if (self.stopAfter)
|
|
|
|
{
|
|
|
|
return @"Stopping once finished...";
|
|
|
|
}
|
|
|
|
else if (self.current)
|
|
|
|
{
|
|
|
|
return @"Playing...";
|
|
|
|
}
|
|
|
|
else if (self.queued)
|
|
|
|
{
|
|
|
|
return [NSString stringWithFormat:@"Queued: %i", self.queuePosition + 1];
|
|
|
|
}
|
|
|
|
else if (self.error)
|
|
|
|
{
|
|
|
|
return errorMessage;
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil;
|
|
|
|
}
|
|
|
|
|
2005-06-02 18:16:43 +00:00
|
|
|
@end
|