/* * SapphireMetaDataSupport.m * Sapphire * * Created by Graham Booker on Apr. 16, 2008. * Copyright 2008 Sapphire Development Team and/or www.nanopi.net * All rights reserved. * * This program is free software; you can redistribute it and/or modify it under the terms of the GNU * General Public License as published by the Free Software Foundation; either version 3 of the License, * or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * Public License for more details. * * You should have received a copy of the GNU General Public License along with this program; if not, * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #import "SapphireMetaDataSupport.h" #import "SapphireDirectoryMetaData.h" #import "SapphireFileMetaData.h" #import "SapphireJoinedFile.h" #import "SapphireCollectionDirectory.h" #import "SapphireMovie.h" #import "SapphireCast.h" #import "SapphireMovieTranslation.h" #import "SapphireMoviePoster.h" #import "SapphireTVTranslation.h" #import "SapphireTVShow.h" #import "SapphireMetaDataUpgrading.h" #define META_VERSION_KEY @"Version" /* Movie Translations */ #define MOVIE_TRAN_VERSION_KEY @"Version" #define MOVIE_TRAN_CURRENT_VERSION 2 /* Translation Keys */ #define MOVIE_TRAN_TRANSLATIONS_KEY @"Translations" #define MOVIE_TRAN_IMDB_LINK_KEY @"IMDB Link" #define MOVIE_TRAN_IMP_LINK_KEY @"IMP Link" #define MOVIE_TRAN_IMP_POSTERS_KEY @"IMP Posters" #define MOVIE_TRAN_SELECTED_POSTER_KEY @"Selected Poster" #define MOVIE_TRAN_AUTO_SELECT_POSTER_KEY @"Default Poster" static NSSet *coverArtExtentions = nil; NSString *searchCoverArtExtForPath(NSString *path) { NSFileManager *fm = [NSFileManager defaultManager]; NSString *directory = [path stringByDeletingLastPathComponent]; NSArray *files = [fm directoryContentsAtPath:directory]; NSString *lastComp = [path lastPathComponent]; /*Search all files*/ NSEnumerator *fileEnum = [files objectEnumerator]; NSString *file = nil; while((file = [fileEnum nextObject]) != nil) { NSString *ext = [file pathExtension]; if([ext length] && [coverArtExtentions containsObject:ext] && [lastComp isEqualToString:[file stringByDeletingPathExtension]]) return [directory stringByAppendingPathComponent:file]; } /*Didn't find one*/ return nil; } @implementation SapphireMetaDataSupport + (void)load { coverArtExtentions = [[NSSet alloc] initWithObjects: @"jpg", @"jpeg", @"tif", @"tiff", @"png", @"gif", nil]; } + (SapphireMetaDataSupport *)sharedInstance { static SapphireMetaDataSupport *shared = nil; if(shared == nil) shared = [[SapphireMetaDataSupport alloc] init]; return shared; } - (void)realWriteMetaData:(NSTimer *)timer { writeTimer = nil; NSManagedObjectContext *context = nil; if([timer isKindOfClass:[NSManagedObjectContext class]]) context = (NSManagedObjectContext *)timer; else context = [timer userInfo]; NSError *error = nil; [context save:&error]; } - (void)save:(NSManagedObjectContext *)context; { /* [writeTimer invalidate]; writeTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(realWriteMetaData:) userInfo:context repeats:NO];*/ [self realWriteMetaData:(NSTimer *)context]; } + (void)save:(NSManagedObjectContext *)context { if(context == nil) return; [[SapphireMetaDataSupport sharedInstance] save:context]; } + (void)importPlist:(NSString *)configDir intoContext:(NSManagedObjectContext *)context withDisplay:(SapphireMetaDataUpgrading *)display { NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:[configDir stringByAppendingPathComponent:@"metaData.plist"]]; NSMutableDictionary *defer = [NSMutableDictionary dictionaryWithObjectsAndKeys: [NSMutableDictionary dictionary], @"Join", nil]; int version = [[dict objectForKey:META_VERSION_KEY] intValue]; SapphireDirectoryMetaData *newDir = nil; if(version > 2) { NSDictionary *slash = [dict objectForKey:@"/"]; newDir = [SapphireDirectoryMetaData createDirectoryWithPath:@"/" parent:nil inContext:context]; [newDir insertDictionary:slash withDefer:defer andDisplay:display]; } else { newDir = [SapphireDirectoryMetaData createDirectoryWithPath:[NSHomeDirectory() stringByAppendingPathComponent:@"Movies"] parent:nil inContext:context]; [newDir insertDictionary:dict withDefer:defer andDisplay:display]; } [display setCurrentFile:BRLocalizedString(@"Upgrading Joined Files", @"")]; NSDictionary *joinDict = [defer objectForKey:@"Join"]; if(joinDict != nil) { NSEnumerator *joinEunm = [joinDict keyEnumerator]; NSString *joinedPath; while((joinedPath = [joinEunm nextObject]) != nil) { SapphireJoinedFile *joinedFile = [SapphireJoinedFile joinedFileForPath:joinedPath inContext:context]; NSArray *joinArray = [joinDict objectForKey:joinedPath]; NSEnumerator *joinedEnum = [joinArray objectEnumerator]; SapphireFileMetaData *joinFile; while((joinFile = [joinedEnum nextObject]) != nil) joinFile.joinedToFile = joinedFile; } } [display setCurrentFile:BRLocalizedString(@"Upgrading Collection Prefs", @"")]; NSDictionary *options = [dict objectForKey:@"Options"]; NSMutableSet *collections = [NSMutableSet set]; NSArray *custom = [options objectForKey:@"Directories"]; if([custom count]) [collections unionSet:[NSSet setWithArray:custom]]; NSDictionary *hidden = [options objectForKey:@"Hide"]; NSArray *keyArray = [hidden allKeys]; if([keyArray count]) [collections unionSet:[NSSet setWithArray:keyArray]]; NSDictionary *skipped = [options objectForKey:@"Skip"]; keyArray = [skipped allKeys]; if([keyArray count]) [collections unionSet:[NSSet setWithArray:keyArray]]; NSEnumerator *collectionEnum = [collections objectEnumerator]; NSString *collectionPath; while((collectionPath = [collectionEnum nextObject]) != nil) { [SapphireCollectionDirectory collectionAtPath:collectionPath mount:NO skip:[[skipped objectForKey:collectionPath] boolValue] hidden:[[hidden objectForKey:collectionPath] boolValue] inContext:context]; } //Set the mount values for all [SapphireCollectionDirectory availableCollectionDirectoriesInContext:context]; [display setCurrentFile:BRLocalizedString(@"Upgrading Movie Translations", @"")]; NSDictionary *movieTranslations = [NSDictionary dictionaryWithContentsOfFile:[configDir stringByAppendingPathComponent:@"movieData.plist"]]; NSDictionary *translations = [movieTranslations objectForKey:MOVIE_TRAN_TRANSLATIONS_KEY]; NSEnumerator *movieEnum = [translations keyEnumerator]; NSString *movie = nil; while((movie = [movieEnum nextObject]) != nil) { NSDictionary *movieDict = [translations objectForKey:movie]; SapphireMovieTranslation *trans = [SapphireMovieTranslation createMovieTranslationWithName:movie inContext:context]; trans.IMPLink = [movieDict objectForKey:MOVIE_TRAN_IMP_LINK_KEY]; NSString *IMDBLink = [movieDict objectForKey:MOVIE_TRAN_IMDB_LINK_KEY]; trans.IMDBLink = IMDBLink; int imdbNumber = [SapphireMovie imdbNumberFromString:IMDBLink]; if(imdbNumber != 0) { SapphireMovie *thisMovie = [SapphireMovie movieWithIMDB:imdbNumber inContext:context]; trans.movie = thisMovie; } NSArray *posters = [movieDict objectForKey:MOVIE_TRAN_IMP_POSTERS_KEY]; NSSet *dupCheck = [NSSet setWithArray:posters]; posters = [dupCheck allObjects]; NSString *selectedPoster = [movieDict objectForKey:MOVIE_TRAN_SELECTED_POSTER_KEY]; int i, count = [posters count]; for(i=0; i