Show
Ignore:
Timestamp:
02/25/10 17:31:35 (2 years ago)
Author:
gbooker
Message:

Merged changes from the branch back to trunk

Location:
trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/SapphireFrappliance/MetaDataImporting/SapphireMovieImporter.m

    r1139 r1179  
    3232#import "SapphireURLLoader.h" 
    3333#import "SapphireScraper.h" 
     34#import "NSString-Extensions.h" 
    3435 
    3536@interface SapphireMovieImportStateData : SapphireImportStateData 
     
    3738@public 
    3839        SapphireSiteMovieScraper        *siteScraper; 
     40        SapphireMovieTranslation        *translation; 
    3941} 
    4042- (id)initWithFile:(SapphireFileMetaData *)aFile atPath:(NSString *)aPath scraper:(SapphireSiteMovieScraper *)siteScaper; 
     43- (void)setTranslation:(SapphireMovieTranslation *)aTranslation; 
     44- (SapphireMovieTranslation *)createTranslationInContext:(NSManagedObjectContext *)moc; 
    4145@end 
    4246 
     
    5761{ 
    5862        [siteScraper release]; 
     63        [translation release]; 
    5964        [super dealloc]; 
    6065} 
    6166 
     67- (void)setTranslation:(SapphireMovieTranslation *)aTranslation 
     68{ 
     69        [translation autorelease]; 
     70        translation = [aTranslation retain]; 
     71} 
     72 
     73- (SapphireMovieTranslation *)createTranslationInContext:(NSManagedObjectContext *)moc 
     74{ 
     75        SapphireMovieTranslation *tran = [SapphireMovieTranslation createMovieTranslationWithName:lookupName inContext:moc]; 
     76        [self setTranslation:tran]; 
     77        return tran; 
     78} 
     79 
    6280@end 
    6381 
     
    6583 
    6684@interface SapphireMovieImporter () 
    67 - (void)getMovieResultsForState:(SapphireMovieImportStateData *)state translation:(SapphireMovieTranslation *)tran; 
    68 - (void)getMoviePostersForState:(SapphireMovieImportStateData *)state translation:(SapphireMovieTranslation *)tran thumbElements:(NSArray *)thumbElements; 
     85- (void)getMovieResultsForState:(SapphireMovieImportStateData *)state; 
     86- (void)getMoviePostersForState:(SapphireMovieImportStateData *)state thumbElements:(NSArray *)thumbElements; 
    6987- (void)saveMoviePosterAtURL:(NSString *)url forTranslation:(SapphireMovieTranslation *)tran; 
    7088- (void)completeWithState:(SapphireMovieImportStateData *)state withStatus:(ImportState)status importComplete:(BOOL)importComplete; 
     
    7997                return self; 
    8098         
    81         NSError *error = nil; 
    8299        scraper = [[SapphireScraper scrapperWithName:@"IMDb.com"] retain]; 
    83100         
     
    102119} 
    103120 
    104 - (void)retrievedSearchResuls:(NSXMLDocument *)results forObject:(SapphireMovieImportStateData *)state 
    105 { 
     121- (void)retrievedSearchResuls:(NSXMLDocument *)results forObject:(id)stateObj 
     122{ 
     123        SapphireMovieImportStateData *state = (SapphireMovieImportStateData *)stateObj; 
    106124        [state->siteScraper setObject:nil];     //Avoid retain loop 
    107125        if(cancelled) 
     
    157175                SapphireFileMetaData *metaData = state->file; 
    158176                NSManagedObjectContext *moc = [metaData managedObjectContext]; 
    159                 NSString *lookupName = [[state->lookupName lowercaseString] stringByDeletingPathExtension]; 
    160                 SapphireMovieTranslation *tran = [SapphireMovieTranslation createMovieTranslationWithName:lookupName inContext:moc]; 
     177                SapphireMovieTranslation *tran = [state createTranslationInContext:moc]; 
    161178                [tran setIMDBLink:[[movies objectAtIndex:0] objectForKey:movieTranslationLinkKey]]; 
    162                 [self getMovieResultsForState:state translation:tran]; 
     179                [self getMovieResultsForState:state]; 
    163180        } 
    164181        else 
     
    167184                SapphireMovieChooser *chooser = [[SapphireMovieChooser alloc] initWithScene:[delegate chooserScene]]; 
    168185                [chooser setMovies:movies]; 
    169                 [chooser setFileName:state->lookupName];                 
     186                [chooser setFileName:[NSString stringByCroppingDirectoryPath:state->path toLength:3]]; 
    170187                [chooser setListTitle:BRLocalizedString(@"Select Movie Title", @"Prompt the user for title of movie")]; 
    171188                /*And display prompt*/ 
     
    176193} 
    177194 
    178 - (void)getMovieResultsForState:(SapphireMovieImportStateData *)state translation:(SapphireMovieTranslation *)tran 
    179 { 
     195- (void)getMovieResultsForState:(SapphireMovieImportStateData *)state 
     196{ 
     197        SapphireMovieTranslation *tran = state->translation; 
    180198        NSString *link = [tran IMDBLink]; 
    181199        SapphireSiteMovieScraper *siteScraper = state->siteScraper; 
     
    188206} 
    189207 
    190 - (void)retrievedMovieDetails:(NSXMLDocument *)details forObject:(SapphireMovieImportStateData *)state 
    191 { 
     208- (void)retrievedMovieDetails:(NSXMLDocument *)details forObject:(id)stateObj 
     209{ 
     210        SapphireMovieImportStateData *state = (SapphireMovieImportStateData *)stateObj; 
    192211        [state->siteScraper setObject:nil];     //Avoid retain loop 
    193212 
     
    265284                [infoIMDB setObject:movieTitle forKey:META_MOVIE_TITLE_KEY]; 
    266285         
    267         NSString *movieTranslationString = [[state->lookupName lowercaseString] stringByDeletingPathExtension]; 
    268286        SapphireFileMetaData *metaData = state->file; 
    269287        NSManagedObjectContext *moc = [metaData managedObjectContext]; 
    270         SapphireMovieTranslation *tran = [SapphireMovieTranslation movieTranslationWithName:movieTranslationString inContext:moc]; 
    271288        SapphireMovie *movie = [SapphireMovie movieWithDictionary:infoIMDB inContext:moc]; 
    272289        if(movie == nil) 
     
    276293                return; 
    277294        } 
    278         [tran setMovie:movie]; 
     295        [state->translation setMovie:movie]; 
    279296        [metaData setMovie:movie]; 
    280297         
     
    286303        BOOL canDisplay = [delegate canDisplayChooser]; 
    287304        if(canDisplay && [thumbs count]) 
    288                 [self getMoviePostersForState:state translation:tran thumbElements:thumbs]; 
     305                [self getMoviePostersForState:state thumbElements:thumbs]; 
    289306        else 
    290307                [self completeWithState:state withStatus:ImportStateUpdated importComplete:canDisplay]; 
    291308} 
    292309 
    293 - (void)getMoviePostersForState:(SapphireMovieImportStateData *)state translation:(SapphireMovieTranslation *)tran thumbElements:(NSArray *)thumbElements; 
     310- (void)getMoviePostersForState:(SapphireMovieImportStateData *)state thumbElements:(NSArray *)thumbElements; 
    294311{ 
    295312        NSMutableArray *previews = [NSMutableArray arrayWithCapacity:[thumbElements count]]; 
     313        SapphireMovieTranslation *tran = state->translation; 
    296314        if([thumbElements count]) 
    297315        { 
    298316                int index = 0; 
    299317                NSManagedObjectContext *moc = [tran managedObjectContext]; 
     318                //Redoing posters, get rid of old ones 
     319                [tran setSelectedPosterIndex:nil]; 
     320                NSEnumerator *posterEnum = [[tran postersSet] objectEnumerator]; 
     321                SapphireMoviePoster *poster; 
     322                while((poster = [posterEnum nextObject]) != nil) 
     323                        [moc deleteObject:poster]; 
     324                 
    300325                NSEnumerator *thumbEnum = [thumbElements objectEnumerator]; 
    301326                NSXMLElement *thumb; 
     
    330355                } 
    331356        } 
    332         if([previews count]) 
     357        if([tran selectedPoster]) 
     358        { 
     359                [self saveMoviePosterAtURL:[[tran selectedPoster] link] forTranslation:tran]; 
     360                [self completeWithState:state withStatus:ImportStateUpdated importComplete:YES]; 
     361        } 
     362        else if([previews count]) 
    333363        { 
    334364                SapphirePosterChooser *posterChooser = [[SapphirePosterChooser alloc] initWithScene:[delegate chooserScene]]; 
     
    342372                { 
    343373                        [posterChooser setPosters:previews]; 
    344                         [posterChooser setFileName:state->lookupName]; 
     374                        [posterChooser setFileName:[NSString stringByCroppingDirectoryPath:state->path toLength:3]]; 
    345375                        [posterChooser setFile:state->file]; 
    346376                        [posterChooser setListTitle:BRLocalizedString(@"Select Movie Poster", @"Prompt the user for poster selection")]; 
     
    430460                return ImportStateNotUpdated; 
    431461        SapphireLog(SAPPHIRE_LOG_IMPORT, SAPPHIRE_LOG_LEVEL_DEBUG, @"Going to movie import %@", path); 
    432         NSString *fileName = [path lastPathComponent]; 
     462        NSString *extLessPath = path; 
     463        if([metaData fileContainerTypeValue] != FILE_CONTAINER_TYPE_VIDEO_TS) 
     464                extLessPath = [extLessPath stringByDeletingPathExtension]; 
     465         
    433466        /*choose between file or directory name for lookup */ 
    434467        NSString *lookupName; 
    435468        if([[SapphireSettings sharedSettings] dirLookup]) 
    436                 lookupName = [[path stringByDeletingLastPathComponent] lastPathComponent]; 
    437         else 
    438                 lookupName = fileName; 
     469                lookupName = [[[path stringByDeletingLastPathComponent] lastPathComponent] lowercaseString]; 
     470        else 
     471                lookupName = [[extLessPath lastPathComponent] lowercaseString]; 
    439472         
    440473        SapphireSiteMovieScraper *siteScraper = [[[SapphireSiteMovieScraper alloc] initWithMovieScraper:scraper delegate:self loader:[SapphireApplianceController urlLoader]] autorelease]; 
    441474        SapphireMovieImportStateData *state = [[[SapphireMovieImportStateData alloc] initWithFile:metaData atPath:path scraper:siteScraper] autorelease]; 
    442475        [state setLookupName:lookupName]; 
    443         /*Get the movie title*/ 
    444         NSString *movieDataLink = nil ; 
    445476        /*Check to see if we know this movie*/ 
    446         NSString *movieTranslationString = [[lookupName lowercaseString] stringByDeletingPathExtension]; 
    447         SapphireLog(SAPPHIRE_LOG_IMPORT, SAPPHIRE_LOG_LEVEL_DETAIL, @"Searching for movie %@", movieTranslationString); 
     477         
     478        /*Look for a year in the title*/ 
     479        NSScanner *titleYearScanner = [NSScanner scannerWithString:state->lookupName]; 
     480        NSString *normalTitle = nil; 
     481        int year = 0; 
     482        BOOL success = YES; 
     483        success &= [titleYearScanner scanUpToString:@"(" intoString:&normalTitle]; 
     484        success &= [titleYearScanner scanString:@"(" intoString:nil]; 
     485        success &= [titleYearScanner scanInt:&year]; 
     486        success &= [titleYearScanner scanString:@")" intoString:nil]; 
     487         
     488        NSString *yearStr = nil; 
     489        if(success) 
     490        { 
     491                yearStr = [NSString stringWithFormat:@"%d", year]; 
     492                if([normalTitle hasSuffix:@" "]) 
     493                   normalTitle = [normalTitle substringToIndex:[normalTitle length]-1]; 
     494                [state setLookupName:normalTitle]; 
     495        } 
     496         
     497        SapphireLog(SAPPHIRE_LOG_IMPORT, SAPPHIRE_LOG_LEVEL_DETAIL, @"Searching for movie \"%@\"", state->lookupName); 
    448498        NSManagedObjectContext *moc = [metaData managedObjectContext]; 
    449         SapphireMovieTranslation *tran = [SapphireMovieTranslation movieTranslationWithName:movieTranslationString inContext:moc]; 
     499        SapphireMovieTranslation *tran = [SapphireMovieTranslation movieTranslationWithName:state->lookupName inContext:moc]; 
     500        [state setTranslation:tran]; 
    450501        int searchIMDBNumber = [metaData searchIMDBNumber]; 
    451502        if(searchIMDBNumber > 0) 
    452503        { 
    453504                if(!tran) 
    454                         tran = [SapphireMovieTranslation createMovieTranslationWithName:movieTranslationString inContext:moc]; 
     505                        tran = [state createTranslationInContext:moc]; 
    455506                [tran setIMDBLink:[NSString stringWithFormat:@"/title/tt%08d", searchIMDBNumber]]; 
    456507        } 
     
    458509        { 
    459510                BOOL nfoPathIsDir = NO; 
    460                 NSString *nfoFilePath=[[path stringByDeletingPathExtension] stringByAppendingPathExtension:@"nfo"]; 
     511                NSString *nfoFilePath=[extLessPath stringByAppendingPathExtension:@"nfo"]; 
    461512                NSString *moviePath = nil; 
    462513                if([[NSFileManager defaultManager] fileExistsAtPath:nfoFilePath isDirectory:&nfoPathIsDir] && !nfoPathIsDir) 
     
    464515                 
    465516                if([moviePath length]) 
     517                { 
     518                        if(tran == nil) 
     519                                tran = [state createTranslationInContext:moc]; 
    466520                        [tran setIMDBLink:moviePath]; 
     521                } 
    467522                else 
    468523                { 
     
    471526                                return ImportStateNotUpdated; 
    472527                         
    473                         /*Look for a year in the title*/ 
    474                         NSString *searchStr = [lookupName stringByDeletingPathExtension]; 
    475                         NSScanner *titleYearScanner = [NSScanner scannerWithString:searchStr]; 
    476                         NSString *normalTitle = nil; 
    477                         int year = 0; 
    478                         BOOL success = YES; 
    479                         success &= [titleYearScanner scanUpToString:@"(" intoString:&normalTitle]; 
    480                         NSString *junk = nil; 
    481                         success &= [titleYearScanner scanString:@"(" intoString:nil]; 
    482                         success &= [titleYearScanner scanInt:&year]; 
    483                         success &= [titleYearScanner scanString:@")" intoString:nil]; 
    484                          
    485                         NSString *yearStr = nil; 
    486                         if(!success) 
    487                         { 
    488                                 normalTitle = searchStr; 
    489                         } 
    490                         else 
    491                                 yearStr = [NSString stringWithFormat:@"%d", year]; 
    492                          
    493                         SapphireLog(SAPPHIRE_LOG_IMPORT, SAPPHIRE_LOG_LEVEL_DEBUG, @"Searching for %@ with year %@", normalTitle, yearStr); 
     528                        SapphireLog(SAPPHIRE_LOG_IMPORT, SAPPHIRE_LOG_LEVEL_DEBUG, @"Searching for %@ with year %@", state->lookupName, yearStr); 
    494529                         
    495530                        /*Ask the user what movie this is*/ 
    496531                        [siteScraper setObject:state]; 
    497                         [siteScraper searchForMovieName:normalTitle year:yearStr]; 
     532                        [siteScraper searchForMovieName:state->lookupName year:yearStr]; 
    498533                        return ImportStateBackground; 
    499534                } 
     
    504539        {        
    505540                [metaData setMovie:movie]; 
    506                 return ImportStateUpdated; 
    507         } 
    508         [self getMovieResultsForState:state translation:tran]; 
     541                if([tran selectedPoster] != nil) 
     542                        return ImportStateUpdated; 
     543                [self getMoviePostersForState:state thumbElements:[NSArray array]]; 
     544                return ImportStateBackground; 
     545        } 
     546        [self getMovieResultsForState:state]; 
    509547        return ImportStateBackground; 
    510548} 
     
    531569} 
    532570 
    533 - (BOOL)stillNeedsDisplayOfChooser:(BRLayerController <SapphireChooser> *)chooser withContext:(SapphireMovieImportStateData *)state 
    534 { 
     571- (BOOL)stillNeedsDisplayOfChooser:(BRLayerController <SapphireChooser> *)chooser withContext:(id)context 
     572{ 
     573        SapphireMovieImportStateData *state = (SapphireMovieImportStateData *)context; 
    535574        if([chooser isKindOfClass:[SapphireMovieChooser class]]) 
    536575        { 
    537                 SapphireMovieChooser *movieChooser = (SapphireMovieChooser *)chooser; 
    538576                NSManagedObjectContext *moc = [state->file managedObjectContext]; 
    539                 NSString *filename = [[[movieChooser fileName] lowercaseString] stringByDeletingPathExtension]; 
    540                 SapphireMovieTranslation *tran = [SapphireMovieTranslation movieTranslationWithName:filename inContext:moc]; 
     577                SapphireMovieTranslation *tran = [SapphireMovieTranslation movieTranslationWithName:state->lookupName inContext:moc]; 
     578                if(tran) 
     579                        [state setTranslation:tran]; 
    541580                if([tran IMDBLink]) 
    542581                { 
    543                         [self getMovieResultsForState:state translation:tran]; 
     582                        [self getMovieResultsForState:state]; 
    544583                        return NO; 
    545584                } 
     
    547586        else if([chooser isKindOfClass:[SapphirePosterChooser class]]) 
    548587        { 
    549                 SapphirePosterChooser *posterChooser = (SapphirePosterChooser *)chooser; 
    550                 NSString *filename = [[[posterChooser fileName] lowercaseString] stringByDeletingPathExtension]; 
    551                 NSManagedObjectContext *moc = [state->file managedObjectContext]; 
    552                 SapphireMovieTranslation *tran = [SapphireMovieTranslation movieTranslationWithName:filename inContext:moc]; 
     588                SapphireMovieTranslation *tran = state->translation; 
    553589                if([[tran selectedPoster] link]) 
    554590                { 
     
    561597} 
    562598 
    563 - (void)exhumedChooser:(BRLayerController <SapphireChooser> *)chooser withContext:(SapphireMovieImportStateData *)state 
    564 { 
     599- (void)exhumedChooser:(BRLayerController <SapphireChooser> *)chooser withContext:(id)context 
     600{ 
     601        SapphireMovieImportStateData *state = (SapphireMovieImportStateData *)context; 
    565602        /*See if it was a movie chooser*/ 
    566603        if([chooser isKindOfClass:[SapphireMovieChooser class]]) 
     
    585622                        /*They selected a movie title, save the translation and write it*/ 
    586623                        NSDictionary *movie = [[movieChooser movies] objectAtIndex:selection]; 
    587                         NSString *filename = [[[movieChooser fileName] lowercaseString] stringByDeletingPathExtension]; 
    588                         SapphireMovieTranslation *tran = [SapphireMovieTranslation createMovieTranslationWithName:filename inContext:moc]; 
     624                        SapphireMovieTranslation *tran = [state createTranslationInContext:moc]; 
    589625                        /* Add IMDB Key */ 
    590626                        [tran setIMDBLink:[movie objectForKey:movieTranslationLinkKey]]; 
    591627                        /*We can resume now*/ 
    592                         [self getMovieResultsForState:state translation:tran]; 
     628                        [self getMovieResultsForState:state]; 
    593629                } 
    594630                [SapphireMetaDataSupport save:moc]; 
     
    605641                else 
    606642                { 
    607                         NSString *filename = [[[posterChooser fileName] lowercaseString] stringByDeletingPathExtension]; 
    608                         SapphireMovieTranslation *tran = [SapphireMovieTranslation createMovieTranslationWithName:filename inContext:moc]; 
     643                        SapphireMovieTranslation *tran = state->translation; 
    609644                        [tran setSelectedPosterIndexValue:selectedPoster]; 
    610                         [self saveMoviePosterAtURL:[[tran posterAtIndex:selectedPoster] link] forTranslation:tran]; 
     645                        [self saveMoviePosterAtURL:[[tran selectedPoster] link] forTranslation:tran]; 
    611646                        [self completeWithState:state withStatus:ImportStateUpdated importComplete:YES]; 
    612647                } 
    613                 posterChooser = nil; 
    614648                [SapphireMetaDataSupport save:moc]; 
    615649        }