#import "SapphireEpisode.h" #import "SapphireSeason.h" #import "SapphireSubEpisode.h" #import "SapphireFile.h" #import "SapphireMediaPreview.h" @implementation SapphireEpisode + (SapphireEpisode *)episode:(int)ep inSeason:(int)season forShow:(NSString *)show withPath:(NSString *)showPath inContext:(NSManagedObjectContext *)moc { SapphireSeason *tvseason = [SapphireSeason season:season forShow:show withPath:showPath inContext:moc]; NSEnumerator *epEnum = [tvseason.episodesSet objectEnumerator]; SapphireEpisode *tvep; while((tvep = [epEnum nextObject]) != nil) { if([SapphireSubEpisode subEpisode:ep inEpisode:tvep] != nil) return tvep; } SapphireEpisode *ret = [NSEntityDescription insertNewObjectForEntityForName:SapphireEpisodeName inManagedObjectContext:moc]; ret.season = tvseason; ret.tvShow = tvseason.tvShow; [ret addSubEpisodesObject:[SapphireSubEpisode createSubEpisode:ep inEpisode:ret]]; return ret; } - (void) dealloc { [sortedSubEpisodes release]; [super dealloc]; } - (void)createSortedEpisodes { if(sortedSubEpisodes != nil) return; NSArray *unsorted = [self.subEpisodesSet allObjects]; sortedSubEpisodes = [[unsorted sortedArrayUsingSelector:@selector(compare:)] retain]; } - (void)insertDictionary:(NSDictionary *)dict { [[self.subEpisodesSet anyObject] insertDictionary:dict epIndex:0]; int secondEp = [[dict objectForKey:@"Episode Number 2"] intValue]; if(secondEp != 0) { SapphireSubEpisode *sub = [SapphireSubEpisode createSubEpisode:secondEp inEpisode:self]; [sub insertDictionary:dict epIndex:1]; [self addSubEpisodesObject:sub]; } } + (SapphireEpisode *)episodeWithDictionary:(NSDictionary *)dict inContext:(NSManagedObjectContext *)moc { NSString *show = [dict objectForKey:@"Show Name"]; int season = [[dict objectForKey:@"Season"] intValue]; int ep = [[dict objectForKey:@"Episode"] intValue]; if(show == nil || season == 0) return nil; NSString *showPath = [dict objectForKey:@"Show ID"]; SapphireEpisode *ret = [SapphireEpisode episode:ep inSeason:season forShow:show withPath:showPath inContext:moc]; [ret insertDictionary:dict]; return ret; } - (int)episodeNumberValue { [self createSortedEpisodes]; return ((SapphireSubEpisode *)[sortedSubEpisodes objectAtIndex:0]).episodeNumberValue; } - (int)lastEpisodeNumberValue { [self createSortedEpisodes]; return ((SapphireSubEpisode *)[sortedSubEpisodes objectAtIndex:sortedSubEpisodes.count - 1]).episodeNumberValue; } - (NSString *)episodeTitle { [self createSortedEpisodes]; return [[sortedSubEpisodes valueForKey:@"episodeTitle"] componentsJoinedByString:@" / "]; } - (NSComparisonResult)compare:(SapphireEpisode *)other { NSComparisonResult result = [self.season compare:other.season]; if(result != NSOrderedSame) return result; [self createSortedEpisodes]; return [[sortedSubEpisodes objectAtIndex:0] compare:[other->sortedSubEpisodes objectAtIndex:0]]; } - (NSString *)coverArtPath { NSString *base = [[self season] coverArtPath]; if([self episodeNumberValue] > 0) return [base stringByAppendingFormat:@"/Episode %d", [self episodeNumberValue]]; return [base stringByAppendingPathComponent:[self episodeTitle]]; } - (void)insertDisplayMetaData:(NSMutableDictionary *)dict { id value = [self episodeTitle]; if(value != nil) [dict setObject:value forKey:META_TITLE_KEY]; value = [[sortedSubEpisodes objectAtIndex:0] airDate]; if(value != nil) [dict setObject:value forKey:META_SHOW_AIR_DATE]; int season = [[self season] seasonNumberValue]; int ep = [self episodeNumberValue]; if(season != 0) [dict setObject:[[self season] seasonNumber] forKey:BRLocalizedString(META_SEASON_NUMBER_KEY, @"Season in metadata display")]; if(ep != 0) [dict setObject:[NSNumber numberWithInt:ep] forKey:BRLocalizedString(META_EPISODE_NUMBER_KEY, @"Epsiode in metadata display")]; if(ep != 0 && season != 0) { int lastEp = [self lastEpisodeNumberValue]; NSString *key = BRLocalizedString(META_EPISODE_AND_SEASON_KEY, @"Season / Epsiode in metadata display"); if(lastEp != nil) [dict setObject:[NSString stringWithFormat:@"%@ - %d / %d-%d", [[self tvShow] name], season, ep, lastEp] forKey:key]; else [dict setObject:[NSString stringWithFormat:@"%@ - %d / %d", [[self tvShow] name], season, lastEp] forKey:key]; } } - (NSString *)path { [self createSortedEpisodes]; return [[sortedSubEpisodes objectAtIndex:0] path]; } /*Overrides*/ - (void)addSubEpisodes:(NSSet*)value_ { [sortedSubEpisodes release]; sortedSubEpisodes = nil; [super addSubEpisodes:value_]; } - (void)removeSubEpisodes:(NSSet*)value_ { [sortedSubEpisodes release]; sortedSubEpisodes = nil; [super removeSubEpisodes:value_]; } - (void)addSubEpisodesObject:(SapphireSubEpisode*)value_ { [sortedSubEpisodes release]; sortedSubEpisodes = nil; [super addSubEpisodesObject:value_]; } - (void)removeSubEpisodesObject:(SapphireSubEpisode*)value_ { [sortedSubEpisodes release]; sortedSubEpisodes = nil; [super removeSubEpisodesObject:value_]; } @end