- Timestamp:
- 02/25/10 17:31:35 (2 years ago)
- Location:
- trunk
- Files:
-
- 2 modified
-
. (modified) (1 prop)
-
SapphireFrappliance/MetaDataImporting/SapphireMovieImporter.m (modified) (25 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk
-
Property
svn:mergeinfo set
to
/branches/PlayerFramework merged eligible
-
Property
svn:mergeinfo set
to
-
trunk/SapphireFrappliance/MetaDataImporting/SapphireMovieImporter.m
r1139 r1179 32 32 #import "SapphireURLLoader.h" 33 33 #import "SapphireScraper.h" 34 #import "NSString-Extensions.h" 34 35 35 36 @interface SapphireMovieImportStateData : SapphireImportStateData … … 37 38 @public 38 39 SapphireSiteMovieScraper *siteScraper; 40 SapphireMovieTranslation *translation; 39 41 } 40 42 - (id)initWithFile:(SapphireFileMetaData *)aFile atPath:(NSString *)aPath scraper:(SapphireSiteMovieScraper *)siteScaper; 43 - (void)setTranslation:(SapphireMovieTranslation *)aTranslation; 44 - (SapphireMovieTranslation *)createTranslationInContext:(NSManagedObjectContext *)moc; 41 45 @end 42 46 … … 57 61 { 58 62 [siteScraper release]; 63 [translation release]; 59 64 [super dealloc]; 60 65 } 61 66 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 62 80 @end 63 81 … … 65 83 66 84 @interface SapphireMovieImporter () 67 - (void)getMovieResultsForState:(SapphireMovieImportStateData *)state translation:(SapphireMovieTranslation *)tran;68 - (void)getMoviePostersForState:(SapphireMovieImportStateData *)state t ranslation:(SapphireMovieTranslation *)tran thumbElements:(NSArray *)thumbElements;85 - (void)getMovieResultsForState:(SapphireMovieImportStateData *)state; 86 - (void)getMoviePostersForState:(SapphireMovieImportStateData *)state thumbElements:(NSArray *)thumbElements; 69 87 - (void)saveMoviePosterAtURL:(NSString *)url forTranslation:(SapphireMovieTranslation *)tran; 70 88 - (void)completeWithState:(SapphireMovieImportStateData *)state withStatus:(ImportState)status importComplete:(BOOL)importComplete; … … 79 97 return self; 80 98 81 NSError *error = nil;82 99 scraper = [[SapphireScraper scrapperWithName:@"IMDb.com"] retain]; 83 100 … … 102 119 } 103 120 104 - (void)retrievedSearchResuls:(NSXMLDocument *)results forObject:(SapphireMovieImportStateData *)state 105 { 121 - (void)retrievedSearchResuls:(NSXMLDocument *)results forObject:(id)stateObj 122 { 123 SapphireMovieImportStateData *state = (SapphireMovieImportStateData *)stateObj; 106 124 [state->siteScraper setObject:nil]; //Avoid retain loop 107 125 if(cancelled) … … 157 175 SapphireFileMetaData *metaData = state->file; 158 176 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]; 161 178 [tran setIMDBLink:[[movies objectAtIndex:0] objectForKey:movieTranslationLinkKey]]; 162 [self getMovieResultsForState:state translation:tran];179 [self getMovieResultsForState:state]; 163 180 } 164 181 else … … 167 184 SapphireMovieChooser *chooser = [[SapphireMovieChooser alloc] initWithScene:[delegate chooserScene]]; 168 185 [chooser setMovies:movies]; 169 [chooser setFileName: state->lookupName];186 [chooser setFileName:[NSString stringByCroppingDirectoryPath:state->path toLength:3]]; 170 187 [chooser setListTitle:BRLocalizedString(@"Select Movie Title", @"Prompt the user for title of movie")]; 171 188 /*And display prompt*/ … … 176 193 } 177 194 178 - (void)getMovieResultsForState:(SapphireMovieImportStateData *)state translation:(SapphireMovieTranslation *)tran 179 { 195 - (void)getMovieResultsForState:(SapphireMovieImportStateData *)state 196 { 197 SapphireMovieTranslation *tran = state->translation; 180 198 NSString *link = [tran IMDBLink]; 181 199 SapphireSiteMovieScraper *siteScraper = state->siteScraper; … … 188 206 } 189 207 190 - (void)retrievedMovieDetails:(NSXMLDocument *)details forObject:(SapphireMovieImportStateData *)state 191 { 208 - (void)retrievedMovieDetails:(NSXMLDocument *)details forObject:(id)stateObj 209 { 210 SapphireMovieImportStateData *state = (SapphireMovieImportStateData *)stateObj; 192 211 [state->siteScraper setObject:nil]; //Avoid retain loop 193 212 … … 265 284 [infoIMDB setObject:movieTitle forKey:META_MOVIE_TITLE_KEY]; 266 285 267 NSString *movieTranslationString = [[state->lookupName lowercaseString] stringByDeletingPathExtension];268 286 SapphireFileMetaData *metaData = state->file; 269 287 NSManagedObjectContext *moc = [metaData managedObjectContext]; 270 SapphireMovieTranslation *tran = [SapphireMovieTranslation movieTranslationWithName:movieTranslationString inContext:moc];271 288 SapphireMovie *movie = [SapphireMovie movieWithDictionary:infoIMDB inContext:moc]; 272 289 if(movie == nil) … … 276 293 return; 277 294 } 278 [ tran setMovie:movie];295 [state->translation setMovie:movie]; 279 296 [metaData setMovie:movie]; 280 297 … … 286 303 BOOL canDisplay = [delegate canDisplayChooser]; 287 304 if(canDisplay && [thumbs count]) 288 [self getMoviePostersForState:state t ranslation:tran thumbElements:thumbs];305 [self getMoviePostersForState:state thumbElements:thumbs]; 289 306 else 290 307 [self completeWithState:state withStatus:ImportStateUpdated importComplete:canDisplay]; 291 308 } 292 309 293 - (void)getMoviePostersForState:(SapphireMovieImportStateData *)state t ranslation:(SapphireMovieTranslation *)tran thumbElements:(NSArray *)thumbElements;310 - (void)getMoviePostersForState:(SapphireMovieImportStateData *)state thumbElements:(NSArray *)thumbElements; 294 311 { 295 312 NSMutableArray *previews = [NSMutableArray arrayWithCapacity:[thumbElements count]]; 313 SapphireMovieTranslation *tran = state->translation; 296 314 if([thumbElements count]) 297 315 { 298 316 int index = 0; 299 317 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 300 325 NSEnumerator *thumbEnum = [thumbElements objectEnumerator]; 301 326 NSXMLElement *thumb; … … 330 355 } 331 356 } 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]) 333 363 { 334 364 SapphirePosterChooser *posterChooser = [[SapphirePosterChooser alloc] initWithScene:[delegate chooserScene]]; … … 342 372 { 343 373 [posterChooser setPosters:previews]; 344 [posterChooser setFileName: state->lookupName];374 [posterChooser setFileName:[NSString stringByCroppingDirectoryPath:state->path toLength:3]]; 345 375 [posterChooser setFile:state->file]; 346 376 [posterChooser setListTitle:BRLocalizedString(@"Select Movie Poster", @"Prompt the user for poster selection")]; … … 430 460 return ImportStateNotUpdated; 431 461 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 433 466 /*choose between file or directory name for lookup */ 434 467 NSString *lookupName; 435 468 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]; 439 472 440 473 SapphireSiteMovieScraper *siteScraper = [[[SapphireSiteMovieScraper alloc] initWithMovieScraper:scraper delegate:self loader:[SapphireApplianceController urlLoader]] autorelease]; 441 474 SapphireMovieImportStateData *state = [[[SapphireMovieImportStateData alloc] initWithFile:metaData atPath:path scraper:siteScraper] autorelease]; 442 475 [state setLookupName:lookupName]; 443 /*Get the movie title*/444 NSString *movieDataLink = nil ;445 476 /*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); 448 498 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]; 450 501 int searchIMDBNumber = [metaData searchIMDBNumber]; 451 502 if(searchIMDBNumber > 0) 452 503 { 453 504 if(!tran) 454 tran = [ SapphireMovieTranslation createMovieTranslationWithName:movieTranslationString inContext:moc];505 tran = [state createTranslationInContext:moc]; 455 506 [tran setIMDBLink:[NSString stringWithFormat:@"/title/tt%08d", searchIMDBNumber]]; 456 507 } … … 458 509 { 459 510 BOOL nfoPathIsDir = NO; 460 NSString *nfoFilePath=[ [path stringByDeletingPathExtension]stringByAppendingPathExtension:@"nfo"];511 NSString *nfoFilePath=[extLessPath stringByAppendingPathExtension:@"nfo"]; 461 512 NSString *moviePath = nil; 462 513 if([[NSFileManager defaultManager] fileExistsAtPath:nfoFilePath isDirectory:&nfoPathIsDir] && !nfoPathIsDir) … … 464 515 465 516 if([moviePath length]) 517 { 518 if(tran == nil) 519 tran = [state createTranslationInContext:moc]; 466 520 [tran setIMDBLink:moviePath]; 521 } 467 522 else 468 523 { … … 471 526 return ImportStateNotUpdated; 472 527 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); 494 529 495 530 /*Ask the user what movie this is*/ 496 531 [siteScraper setObject:state]; 497 [siteScraper searchForMovieName: normalTitle year:yearStr];532 [siteScraper searchForMovieName:state->lookupName year:yearStr]; 498 533 return ImportStateBackground; 499 534 } … … 504 539 { 505 540 [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]; 509 547 return ImportStateBackground; 510 548 } … … 531 569 } 532 570 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; 535 574 if([chooser isKindOfClass:[SapphireMovieChooser class]]) 536 575 { 537 SapphireMovieChooser *movieChooser = (SapphireMovieChooser *)chooser;538 576 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]; 541 580 if([tran IMDBLink]) 542 581 { 543 [self getMovieResultsForState:state translation:tran];582 [self getMovieResultsForState:state]; 544 583 return NO; 545 584 } … … 547 586 else if([chooser isKindOfClass:[SapphirePosterChooser class]]) 548 587 { 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; 553 589 if([[tran selectedPoster] link]) 554 590 { … … 561 597 } 562 598 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; 565 602 /*See if it was a movie chooser*/ 566 603 if([chooser isKindOfClass:[SapphireMovieChooser class]]) … … 585 622 /*They selected a movie title, save the translation and write it*/ 586 623 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]; 589 625 /* Add IMDB Key */ 590 626 [tran setIMDBLink:[movie objectForKey:movieTranslationLinkKey]]; 591 627 /*We can resume now*/ 592 [self getMovieResultsForState:state translation:tran];628 [self getMovieResultsForState:state]; 593 629 } 594 630 [SapphireMetaDataSupport save:moc]; … … 605 641 else 606 642 { 607 NSString *filename = [[[posterChooser fileName] lowercaseString] stringByDeletingPathExtension]; 608 SapphireMovieTranslation *tran = [SapphireMovieTranslation createMovieTranslationWithName:filename inContext:moc]; 643 SapphireMovieTranslation *tran = state->translation; 609 644 [tran setSelectedPosterIndexValue:selectedPoster]; 610 [self saveMoviePosterAtURL:[[tran posterAtIndex:selectedPoster] link] forTranslation:tran];645 [self saveMoviePosterAtURL:[[tran selectedPoster] link] forTranslation:tran]; 611 646 [self completeWithState:state withStatus:ImportStateUpdated importComplete:YES]; 612 647 } 613 posterChooser = nil;614 648 [SapphireMetaDataSupport save:moc]; 615 649 }
