source: trunk/SapphireMovieImporter.m @ 243

Revision 243, 23.9 KB checked in by pmerrill, 7 years ago (diff)
  • Updating code for audit
  • some previous bugs fixed
Line 
1//
2//  SapphireMovieImporter.m
3//  Sapphire
4//
5//  Created by Patrick Merrill on 9/10/07.
6//  Copyright 2007 www.nanopi.net. All rights reserved.
7//
8
9#import "SapphireMovieImporter.h"
10#import "SapphireMetaData.h"
11#import "NSString-Extensions.h"
12#import "SapphireMovieChooser.h"
13#import "SapphirePosterChooser.h"
14/* Translation Keys */
15#define TRANSLATIONS_KEY                        @"Translations"
16#define IMDB_LINK_KEY                           @"IMDB Link"
17#define IMP_LINK_KEY                            @"IMP Link"
18#define IMP_POSTERS_KEY                         @"IMP Posters"
19#define SELECTED_POSTER_KEY                     @"Selected Poster"
20 /* IMDB XPATHS */
21#define IMDB_SEARCH_XPATH                               @"//td[starts-with(a/@href,'/title')]"
22#define IMDB_UNIQUE_SEARCH_XPATH                @"//a[@class='tn15more inline']/@href"
23#define IMDB_RESULT_LINK_XPATH                  @"a/@href"
24#define IMDB_POSTER_LINK_XPATH                  @"//ul/li/a/@href"
25#define IMDB_RESULT_NAME_XPATH                  @"normalize-space(string())"
26#define IMDB_RESULT_TITLE_YEAR_XPATH    @"//div[@id='tn15title']/h1/replace(string(), '\n', '')"
27#define IMDB_RESTULT_CAST_NAMES_XPATH   @"//div[@class='info']/table/tr/td/a"
28/* IMP XPATHS */
29#define IMP_POSTER_CANDIDATES_XPATH             @"//img/@src"
30
31
32
33
34/*Delegate class to download cover art*/
35@interface SapphireMovieDataMenuDownloadDelegate : NSObject
36{
37        NSString *destination;
38        NSArray *requestList ;
39        NSArray *delegates ;
40        long downloadsLeft ;
41}
42- (id)initWithRequest:(NSArray*)reqList withDestination:(NSString *)dest;
43- (void) downloadDidFinish: (NSURLDownload *) download;
44- (long) downloadsCompleted;
45- (long) downloadsQueued;
46- (void)downloadMoviePosters ;
47@end
48
49@implementation SapphireMovieDataMenuDownloadDelegate
50/*!
51* @brief Initialize a cover art downloader
52 *
53 * @param reqList The list of url requests to try
54 * @param dest The path to save the file
55 */
56- (id)initWithRequest:(NSArray*)reqList withDestination:(NSString *)dest;
57{
58        self = [super init];
59        if(!self)
60                return nil;
61        delegates=[NSArray array];
62        destination = [dest retain];
63        requestList = [reqList retain];
64        downloadsLeft=[requestList count] ;
65        return self;   
66}
67
68/*!
69* @brief Fire the delegate to start downloading the posters
70 *
71 */
72-(void)downloadMoviePosters
73{
74        NSEnumerator *reqEnum= [requestList objectEnumerator] ;
75        NSString *req=nil ;
76        while((req=[reqEnum nextObject]) !=nil)
77        {
78                NSURL *posterURL=[NSURL URLWithString:[NSString stringWithFormat:@"http://www.IMPAwards.com%@",req]];
79                NSString *fullDestination=[NSString stringWithFormat:@"%@/%@",destination,[req lastPathComponent]];
80                NSURLRequest * request=[NSURLRequest requestWithURL:posterURL];
81                NSURLDownload *currentDownload=[[NSURLDownload alloc] initWithRequest:request delegate:self] ;
82                [currentDownload setDestination:fullDestination allowOverwrite:YES];
83                delegates=[delegates arrayByAddingObject:currentDownload];
84        }
85}
86
87- (void) downloadDidFinish: (NSURLDownload *) download
88{
89        long tmpVar=downloadsLeft ;
90        downloadsLeft=tmpVar-1;
91}
92
93- (long) downloadsCompleted
94{
95        long tmpVar=downloadsLeft ;
96        if(tmpVar==0)
97        {
98                [delegates release];
99                return tmpVar;
100        }
101        else
102        {
103                long tmpVar2=[requestList count];
104                return tmpVar2-tmpVar;
105        }
106}
107
108- (long) downloadsQueued
109{
110                long tmpVar2=[requestList count];
111                return tmpVar2;
112}
113
114- (void)dealloc
115{
116        [destination release];
117        [requestList release];
118        [super dealloc];
119}
120@end
121
122@interface SapphireMovieImporter (private)
123- (void)writeSettings;
124@end
125
126@implementation SapphireMovieImporter
127
128- (id) initWithSavedSetting:(NSString *)path
129{
130        self = [super init];
131        if(!self)
132                return nil;
133       
134        /*Get the settings*/
135        settingsPath = [path retain];
136        NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:path];
137        /*Get or create the show translation dict*/
138        movieTranslations = [[settings objectForKey:TRANSLATIONS_KEY] mutableCopy];
139        if(movieTranslations == nil)
140                movieTranslations = [NSMutableDictionary new];
141        /*Cached movie info*/
142        movieInfo = [NSMutableDictionary new];
143       
144        return self;
145}
146
147- (void)dealloc
148{
149        [dataMenu release];
150        [movieTranslations release];
151        [movieInfo release];
152        [settingsPath release];
153        [super dealloc];
154}
155
156/*!
157* @brief Sets the importer's data menu
158 *
159 * @param theDataMenu The importer's menu
160 */
161- (void)setImporterDataMenu:(SapphireImporterDataMenu *)theDataMenu
162{
163        [dataMenu release];
164        dataMenu = [theDataMenu retain];
165}
166
167/*!
168* @brief Gets IMPAwards.com Poster page link
169 *
170 * @param candidateIMDBLink The functions IMDB Posters Path
171 */
172- (NSString *)getPosterPath:(NSString *)candidateIMDBLink
173{
174        NSError *error = nil ;
175        NSURL * url=[NSURL URLWithString:[NSString stringWithFormat:@"http://www.imdb.com%@/posters",candidateIMDBLink]] ;
176        NSXMLDocument *document = [[NSXMLDocument alloc] initWithContentsOfURL:url options:NSXMLDocumentTidyHTML error:&error];
177        NSXMLElement *root = [document rootElement];
178
179        /*Get the results list*/
180        NSArray *results = [root objectsForXQuery:IMDB_POSTER_LINK_XPATH error:&error];
181        if([results count])
182        {
183                /*Get each result*/
184                NSEnumerator *resultEnum = [results objectEnumerator];
185                NSXMLElement *result = nil;
186                while((result = [resultEnum nextObject]) != nil)
187                {
188                        /*Add the result to the list*/                 
189                        NSString *resultURL =[[result stringValue] lowercaseString];
190                        if(resultURL == nil)
191                                continue;
192                        else if([resultURL hasPrefix:@"http://www.impawards.com"])/* See if the link is to IMP */
193                        {
194                                NSString * foundPosterLink =[resultURL stringByReplacingAllOccurancesOf:@"http://www.impawards.com" withString:@""];
195                                return foundPosterLink;
196                        }
197                }               
198        }
199        return nil;
200}
201
202/*!
203* @brief Compile IMPAwards.com Poster link list
204 *
205 * @param posterPageLink The Movie's IMP Poster link extention
206 * @return An array of canidate poster images
207 */
208- (NSArray *)getPosterLinks:(NSString *)posterPageLink
209{
210        NSError *error = nil ;
211        NSURL * url=[NSURL URLWithString:[NSString stringWithFormat:@"http://www.IMPAwards.com%@",posterPageLink]] ;
212        NSXMLDocument *document = [[NSXMLDocument alloc] initWithContentsOfURL:url options:NSXMLDocumentTidyHTML error:&error];
213        NSXMLElement *root = [document rootElement];
214        NSArray * candidatePosterLinks=[NSArray arrayWithObjects:nil] ;
215        NSString * yearPathComponent=[posterPageLink stringByDeletingLastPathComponent];
216       
217        /*Get the results list*/
218        NSArray *results = [root objectsForXQuery:IMP_POSTER_CANDIDATES_XPATH error:&error];
219        if([results count])
220        {
221                /*Get each result*/
222                NSEnumerator *resultEnum = [results objectEnumerator];
223                NSXMLElement *result = nil;
224                while((result = [resultEnum nextObject]) != nil)
225                {
226                        /*Add the result to the list*/                 
227                        NSString *resultURL =[[result stringValue] lowercaseString];
228                        if(resultURL == nil)
229                                continue;
230                        if([resultURL hasPrefix:@"posters/"]) /* get the displayed poster link */
231                        {
232                                NSString * subPath=[resultURL substringFromIndex:7];
233                                subPath=[NSString stringWithFormat:[NSString stringWithFormat:@"%@/posters%@",yearPathComponent,subPath]];
234                                candidatePosterLinks=[candidatePosterLinks arrayByAddingObject:subPath];
235                        }
236                        else if([resultURL hasPrefix:@"thumbs/"]) /* get the displayed poster link */
237                        {
238                                NSString * subPath=[resultURL substringFromIndex:11];
239                                subPath=[NSString stringWithFormat:[NSString stringWithFormat:@"%@/posters/%@",yearPathComponent,subPath]];
240                                candidatePosterLinks=[candidatePosterLinks arrayByAddingObject:subPath];
241                        }
242                }
243        }
244return candidatePosterLinks;
245}
246
247/*!
248* @brief Get the posters from IMPAwards.com
249 *
250 * @param posterLinks The Movie's IMP Poster links
251 * @return selected poster link
252 */
253- (void)getPostersForMovie:(NSString *)movieTitle withPath:(NSString*)moviePath
254{
255        NSString *fileName=[[moviePath lastPathComponent]lowercaseString] ;
256        NSArray *posters=[[movieTranslations objectForKey:[fileName lowercaseString]]objectForKey:IMP_POSTERS_KEY];
257        if([posters count])
258        {
259                /* download all posters to the scratch folder */
260                NSString * posterBuffer=[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/Sapphire/Poster_Buffer"];
261                [[NSFileManager defaultManager] createDirectoryAtPath:posterBuffer attributes:nil];
262                SapphireMovieDataMenuDownloadDelegate *myDelegate=[[SapphireMovieDataMenuDownloadDelegate alloc] initWithRequest:posters withDestination:posterBuffer];
263                [myDelegate downloadMoviePosters] ;
264                [myDelegate autorelease];
265
266               
267//              BOOL wait=YES ;
268//              BRTextControl * posterProgress=[[BRTextControl alloc] initWithScene: [dataMenu scene]];
269//              [posterProgress setTextAttributes: [[BRThemeInfo sharedTheme] paragraphTextAttributes]];
270//              NSRect  frame = [[dataMenu masterLayer] frame];
271//              frame.origin.y = frame.size.height / 1.10f;
272//              frame.origin.x = (frame.size.width / 4.0f) ;
273//              [posterProgress setFrame: frame];
274//              [dataMenu addControl: posterProgress];
275               
276//              while(wait)
277//              {
278//                      [posterProgress setText:[NSString stringWithFormat:@"Fetching Poster(s) (%d/%d)",[myDelegate downloadsCompleted],[myDelegate downloadsQueued]]];
279//                      [[dataMenu scene] renderScene];
280//                      if([myDelegate downloadsCompleted]==[posters count])wait=NO;
281//              }
282                /* Need some kinda wait here to ensure the delegates have completed downloading the posters */
283//              while(![myDelegate downloadsCompleted])continue;
284                /* Now have the user pick a poster */
285//              [dataMenu pause];
286//              SapphirePosterChooser * chooser=[[SapphirePosterChooser alloc] initWithScene:[dataMenu scene]];
287//              [[dataMenu scene] renderScene];
288//              [chooser setPosters:posters] ;
289//              [chooser setFileName:fileName];
290//              [chooser setMovieTitle:movieTitle];
291//              [chooser setListTitle:BRLocalizedString(@"Select Movie Poster", @"Prompt the user for poster selection")];
292//              [[dataMenu stack] pushController:chooser];
293//              [chooser release];
294                NSMutableDictionary * transDict = [movieTranslations objectForKey:[fileName lowercaseString]];
295                if(transDict == nil)
296                {
297                        transDict=[NSMutableDictionary new] ;
298                        [movieTranslations setObject:transDict forKey:[fileName lowercaseString]];
299                        [transDict release];
300                }
301                [transDict setObject:@"Primed" forKey:SELECTED_POSTER_KEY];
302                [self writeSettings];
303        }
304}
305
306
307/*!
308* @brief Fetch information for a movie
309 *
310 * @param movieTitleLink The IMDB link extention (part of the show's URL)
311 * @param moviePath The movie file's location
312 * @return A cached dictionary of the movie info
313 */
314- (NSMutableDictionary *)getMetaForMovie:(NSString *)movieTitleLink withPath:(NSString*)moviePath
315{
316        NSError *error = nil;
317        NSMutableDictionary *ret = [NSMutableDictionary dictionary];
318       
319        /* Gather IMDB Data */
320        /*Get the movie html*/
321        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.IMDB.com%@",movieTitleLink]];
322        NSXMLDocument *document = [[NSXMLDocument alloc] initWithContentsOfURL:url options:NSXMLDocumentTidyHTML error:&error];
323       
324        /* Get the movie title */
325        NSString *movieTitle= [[document objectsForXQuery:IMDB_RESULT_TITLE_YEAR_XPATH error:&error] objectAtIndex:0];
326        NSScanner *metaTrimmer=[NSScanner scannerWithString:movieTitle];
327        [metaTrimmer scanUpToString:@"(" intoString:&movieTitle];
328        movieTitle=[movieTitle substringToIndex:[movieTitle length]-1];
329       
330        /* Get the cast list */
331        NSArray *rawCast=[document objectsForXQuery:IMDB_RESTULT_CAST_NAMES_XPATH error:&error];
332        NSArray *completeCast=nil ;
333        if([rawCast count])
334        {
335                NSArray *results=nil;
336                NSEnumerator *resultEnum = [rawCast objectEnumerator];
337                NSXMLElement *result = nil;
338                while((result = [resultEnum nextObject]) != nil)
339                {
340                        NSString *castName=nil;
341                        castName=[result stringValue];
342                        if([castName length])
343                        {
344                                NSString * castURL=[[[result attributeForName:@"href"]stringValue]lowercaseString];
345                                if([castURL hasPrefix:@"/name/"])
346                                {
347                                        if(!results)
348                                                results=[NSArray arrayWithObject:castName];
349                                        else
350                                                results=[results arrayByAddingObject:castName];
351                                }
352                                else continue ;
353                        }
354                        else
355                        continue ;
356                }
357                completeCast=results ;
358        }
359       
360       
361        /* populate metadata to return */
362        [ret setObject:completeCast forKey:META_MOVIE_CAST_KEY];
363        [ret setObject:movieTitle forKey:META_MOVIE_TITLE_KEY];
364        return ret;
365}
366
367
368
369/*!
370* @brief Searches for a movie based on the filename
371 *
372 * @param searchStr Part of the filename to use in the show search
373 * @return An array of possible results
374 */
375- (NSArray *)searchResultsForMovie:(NSString *)searchStr
376{
377        /* prep the search string */
378        searchStr = [searchStr stringByDeletingPathExtension];
379        searchStr = [searchStr stringByReplacingAllOccurancesOf:@"_" withString:@" "];
380        searchStr = [searchStr stringByReplacingAllOccurancesOf:@"." withString:@" "];
381        searchStr = [searchStr stringByReplacingAllOccurancesOf:@"-" withString:@" "];
382        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.imdb.com/find?s=all&q=%@", [searchStr URLEncode]]];
383        NSError * error = nil;
384        BOOL uniqueResult=NO ;
385        NSArray * results = nil;
386        NSMutableArray *ret=nil;
387        NSXMLDocument *document = [[NSXMLDocument alloc] initWithContentsOfURL:url options:NSXMLDocumentTidyHTML error:&error];
388        NSXMLElement *root = [document rootElement];   
389        NSString *resultTitle=[[[root objectsForXQuery:@"//title" error:&error]objectAtIndex:0] stringValue];
390       
391        if([resultTitle isEqualToString:@"IMDb Search"])/*Make sure we didn't get back a unique result */
392        {
393                results = [root objectsForXQuery:IMDB_SEARCH_XPATH error:&error];
394                ret = [NSMutableArray arrayWithCapacity:[results count]];
395                //Need to clean out (VG) entries <Video Game>
396                //Need to clean out (TV) entries <Television> ?
397        }
398        else /* IMDB directly linked to a unique movie title */
399        {
400                uniqueResult=YES ;
401                ret = [NSMutableArray arrayWithCapacity:1];
402                results = [root objectsForXQuery:IMDB_UNIQUE_SEARCH_XPATH error:&error];               
403        }       
404               
405        if([results count])
406        {
407                /*Get each result*/
408                NSEnumerator *resultEnum = [results objectEnumerator];
409                NSXMLElement *result = nil;
410                while((result = [resultEnum nextObject]) != nil)
411                {
412                        if(uniqueResult)/*Check for a unique title link*/
413                        {
414                                NSURL *resultURL = [NSURL URLWithString:[[[result objectsForXQuery:IMDB_UNIQUE_SEARCH_XPATH error:&error] objectAtIndex:0] stringValue]] ;
415                                if(resultURL == nil)
416                                        continue;
417                                NSString *URLSubPath =[resultURL path] ;
418                                if([URLSubPath hasPrefix:@"/rg/title-tease/"])
419                                {
420                                        URLSubPath=[[URLSubPath stringByReplacingAllOccurancesOf:@"/rg/title-tease/" withString:@""]stringByDeletingLastPathComponent];
421                                        NSScanner * snipPrefix=[NSScanner scannerWithString:URLSubPath];
422                                        NSString *snip=nil ;
423                                        [snipPrefix scanUpToString:@"/" intoString:&snip] ;
424                                        URLSubPath=[URLSubPath stringByReplacingAllOccurancesOf:snip withString:@""];
425                                        [ret addObject:[NSDictionary dictionaryWithObjectsAndKeys:
426                                                resultTitle, @"name",
427                                                URLSubPath, IMDB_LINK_KEY,
428                                                nil]];
429                                        return ret ;
430                                }
431                        }
432                        else
433                        {
434                                /*Add the result to the list*/
435                                NSURL *resultURL = [NSURL URLWithString:[[[result objectsForXQuery:IMDB_RESULT_LINK_XPATH error:&error] objectAtIndex:0] stringValue]] ;
436                                if(resultURL == nil)
437                                        continue;
438                                [ret addObject:[NSDictionary dictionaryWithObjectsAndKeys:
439                                        [[result objectsForXQuery:IMDB_RESULT_NAME_XPATH error:&error] objectAtIndex:0], @"name",
440                                        [resultURL path], IMDB_LINK_KEY,
441                                        nil]];
442                        }
443                }
444                if(!uniqueResult)return ret;
445        }
446        return nil ;
447}
448
449
450/*!
451* @brief Write our setings out
452 */
453- (void)writeSettings
454{
455        NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
456                movieTranslations, TRANSLATIONS_KEY,
457                nil];
458        [settings writeToFile:settingsPath atomically:YES];
459}
460
461/*!
462* @brief verify file extention of a file
463 *
464 * @param filePAth The file's path
465 * @return YES if candidate, NO otherwise
466 */
467- (BOOL)isMovieCandidate:(NSString*)fileExt
468{
469        if([[SapphireMetaData videoExtensions] member:fileExt])
470                return YES;
471        else return NO ;
472}
473
474/*!
475* @brief Import a single File
476 *
477 * @param metaData The file to import
478 * @return YES if imported, NO otherwise
479 */
480- (BOOL) importMetaData:(SapphireFileMetaData *)metaData
481{
482//      if(previousChooser)
483//      {
484//              [dataMenu pause];
485//              [[dataMenu stack] pushController:previousChooser];
486//              [previousChooser release];
487//              return NO;
488//      }
489       
490        currentData = metaData;
491        /*Check to see if it is already imported*/
492        if([metaData importedTimeFromSource:META_IMDB_IMPORT_KEY])
493                return NO;
494        /*Get path*/
495        NSString *path = [metaData path];
496        if(![self isMovieCandidate:[path pathExtension]])
497                return NO;
498        /*Get fineName*/
499        NSString *fileName = [path lastPathComponent];
500        if([metaData fileClass]==FILE_CLASS_TV_SHOW) /* File is a TV Show - skip it */
501                return NO ;
502       
503        /*Get the movie title*/
504        NSString *movieDataLink = nil ;
505        /*Check to see if we know this movie*/
506        NSMutableDictionary *dict=[movieTranslations objectForKey:[fileName lowercaseString]];
507        if(dict == nil)
508        {
509                /*Ask the user what movie this is*/
510                NSArray *movies = [self searchResultsForMovie:fileName];
511                /*Pause for the user's input*/
512                [dataMenu pause];
513                /*Bring up the prompt*/
514                SapphireMovieChooser *chooser = [[SapphireMovieChooser alloc] initWithScene:[dataMenu scene]];
515                [chooser setMovies:movies];
516                [chooser setFileName:fileName];         
517                [chooser setListTitle:BRLocalizedString(@"Select Movie Title", @"Prompt the user for title of movie")];
518                /*And display prompt*/
519                [[dataMenu stack] pushController:chooser];
520                [chooser release];
521                return NO ;
522                //Data will be ready for access on the next call
523        }
524
525        NSString * selectedPoster=nil ;
526        selectedPoster=[dict objectForKey:SELECTED_POSTER_KEY] ;
527        if(!selectedPoster && [dict objectForKey:IMP_POSTERS_KEY])
528        {
529                /* We still need to download the posters */
530                [self getPostersForMovie:@"Movie Title" withPath:path];
531//              [dataMenu resume];
532                return NO ;
533        }
534        if([selectedPoster isEqualToString:@"Primed"])
535        {
536                /* Posters were downloaded, let the user choose one */
537                [dataMenu pause];
538                SapphirePosterChooser * chooser=[[SapphirePosterChooser alloc] initWithScene:[dataMenu scene]];
539                [[dataMenu scene] renderScene];
540                NSArray *posters=[dict objectForKey:IMP_POSTERS_KEY];
541                [chooser setPosters:posters] ;
542                [chooser setFileName:fileName];
543                [chooser setMovieTitle:@"Movie Title"];
544                [chooser setListTitle:BRLocalizedString(@"Select Movie Poster", @"Prompt the user for poster selection")];
545        //      if(!previousChooser)
546        //      {
547        //              previousChooser=[chooser retain];
548        //      }
549        //      else
550        //      [[dataMenu stack] pushController:previousChooser];
551                [[dataMenu stack] pushController:chooser];
552                [chooser release];
553                return NO;
554        }
555        if(![selectedPoster isEqualToString:@"Primed"])
556        {
557                /* Lets move the selected poster to the corresponding Cover Art Directory */
558                NSFileManager *fileAgent=[NSFileManager alloc];
559                NSString * poster=[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/Sapphire/Poster_Buffer"];
560                poster=[poster stringByAppendingPathComponent:[selectedPoster lastPathComponent]];
561                NSString * coverart=[[path stringByDeletingLastPathComponent]stringByAppendingPathComponent:@"Cover Art"];
562                coverart=[coverart stringByAppendingPathComponent:[fileName stringByDeletingPathExtension]];
563                coverart=[coverart stringByAppendingPathExtension:[poster pathExtension]];
564                /* the fileAgent will do nothing if the file has already been moved or removed */               
565                [fileAgent movePath:poster toPath:coverart handler:self] ;
566                /* Lets clean up the Poster_Buffer */
567                NSArray *oldPosters = [dict objectForKey:IMP_POSTERS_KEY];
568                if([oldPosters count])
569                {
570                        NSEnumerator *resultEnum = [oldPosters objectEnumerator];
571                        NSString *result = nil;
572                        while((result = [resultEnum nextObject]) != nil)
573                        {
574                                NSString *removeFile=[NSString stringWithFormat:@"%@/%@",[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/Sapphire/Poster_Buffer"],[result lastPathComponent]];
575                                [fileAgent removeFileAtPath:removeFile handler:self] ;
576                        }
577                }
578                [fileAgent release];
579                return NO;
580        }
581       
582        /*Import the info*/
583        /*IMDB Data */
584        NSMutableDictionary *infoIMDB = nil;
585        movieDataLink=[dict objectForKey:IMDB_LINK_KEY];
586        infoIMDB = [self getMetaForMovie:movieDataLink withPath:path];
587        if(!infoIMDB)
588                return NO;
589        [infoIMDB removeObjectForKey:IMDB_LINK_KEY];
590        [metaData importInfo:infoIMDB fromSource:META_IMDB_IMPORT_KEY withTime:[[NSDate date] timeIntervalSince1970]];
591        [metaData setFileClass:FILE_CLASS_MOVIE];
592        /*We imported something*/
593        return YES;
594}
595
596
597/*!
598* @brief The completion text to display
599 *
600 * @return The completion text to display
601 */
602- (NSString *)completionText
603{
604        return BRLocalizedString(@"All availble Movie data has been imported", @"The Movie import is complete");
605}
606
607/*!
608* @brief The initial text to display
609 *
610 * @return The initial text to display
611 */
612- (NSString *)initialText
613{
614        return BRLocalizedString(@"Movie Meta Data", @"Title");
615}
616
617/*!
618* @brief The informative text to display
619 *
620 * @return The informative text to display
621 */
622- (NSString *)informativeText
623{
624        return BRLocalizedString(@"This tool will attempt to fetch information about your Movie files from the Internet (IMDB/IMPAwards).  This procedure may take quite some time and could ask you questions.  You may cancel at any time.", @"Description of the movie import");
625}
626
627/*!
628* @brief The button title
629 *
630 * @return The button title
631 */
632- (NSString *)buttonTitle
633{
634        return BRLocalizedString(@"Start Fetching Data", @"Button");
635}
636
637/*!
638* @brief The data menu was exhumed
639 *
640 * @param controller The Controller which was on top
641 */
642- (void) wasExhumedByPoppingController: (BRLayerController *) controller
643{
644        /*See if it was a movie chooser*/
645        if([controller isKindOfClass:[SapphireMovieChooser class]])
646        {
647                /*Get the user's selection*/
648                SapphireMovieChooser *chooser = (SapphireMovieChooser *)controller;
649                int selection = [chooser selection];
650                if(selection == MOVIE_CHOOSE_CANCEL)
651                        /*They aborted, skip*/
652                        [dataMenu skipNextItem];
653                else if(selection == MOVIE_CHOOSE_NOT_MOVIE)
654                {
655                        /*They said it is not a movie, so put in empty data so they are not asked again*/
656                        [currentData importInfo:[NSMutableDictionary dictionary] fromSource:META_IMDB_IMPORT_KEY withTime:[[NSDate date] timeIntervalSince1970]];
657                        if ([currentData fileClass] != FILE_CLASS_TV_SHOW)
658                                [currentData setFileClass:FILE_CLASS_UNKNOWN];
659                }
660                else if(selection==MOVIE_CHOOSE_OTHER)
661                {
662                        [currentData importInfo:[NSMutableDictionary dictionary] fromSource:META_IMDB_IMPORT_KEY withTime:[[NSDate date] timeIntervalSince1970]];
663                        [currentData setFileClass:FILE_CLASS_OTHER] ;
664                }
665                else if(selection==MOVIE_CHOOSE_TV_SHOW)
666                {
667                        [currentData importInfo:[NSMutableDictionary dictionary] fromSource:META_IMDB_IMPORT_KEY withTime:[[NSDate date] timeIntervalSince1970]];
668                        [currentData setFileClass:FILE_CLASS_TV_SHOW] ;
669                }
670                else
671                {
672                        /*They selected a movie title, save the translation and write it*/
673                        NSDictionary *movie = [[chooser movies] objectAtIndex:selection];
674                        NSMutableDictionary * transDict = [movieTranslations objectForKey:[[chooser fileName] lowercaseString]];
675                        if(transDict == nil)
676                        {
677                                transDict=[NSMutableDictionary new] ;
678                                [movieTranslations setObject:transDict forKey:[[chooser fileName] lowercaseString]];
679                                [transDict release];
680                        }
681                        /* Add IMDB Key */
682                        [transDict setObject:[movie objectForKey:IMDB_LINK_KEY] forKey:IMDB_LINK_KEY];
683                        NSString *posterPath=nil ;
684                        /* Get the IMP Key with the IMDB Posters page */
685                        posterPath=[self getPosterPath:[transDict objectForKey:IMDB_LINK_KEY]] ;
686                        if(posterPath!=nil)
687                        {
688                                [transDict setObject:posterPath forKey:IMP_LINK_KEY];
689                                /*We got a posterPath, get the posterLinks */
690                                NSArray *posterLinks=nil ;
691                                /* User already selected a poster, skip */
692                                if(![transDict objectForKey:SELECTED_POSTER_KEY]) posterLinks=[self getPosterLinks:posterPath];
693                                if(posterLinks!=nil)
694                                {
695                                        /* Add the poster links */
696                                        [transDict setObject:posterLinks forKey:IMP_POSTERS_KEY];
697                                }
698                                /* Add another method via chooser incase IMDB doesn't have an IMP link */
699                        }
700                }
701                [self writeSettings];
702                /*We can resume now*/
703                [dataMenu resume];
704        }
705        else if([controller isKindOfClass:[SapphirePosterChooser class]])
706        {
707                SapphirePosterChooser *chooser = (SapphirePosterChooser *)controller;
708                int selectedPoster = [chooser selectedPoster];
709                if(selectedPoster == POSTER_CHOOSE_CANCEL)
710                        /*They aborted, skip*/
711                        [dataMenu skipNextItem]; //Should this be done?
712                else
713                {
714                        NSString *selected = [[chooser posters] objectAtIndex:selectedPoster];
715                        NSMutableDictionary * transDict = [movieTranslations objectForKey:[[chooser fileName]lowercaseString]];
716                        if(transDict == nil)
717                        {
718                                transDict=[NSMutableDictionary new] ;
719                                [movieTranslations setObject:transDict forKey:[[chooser fileName]lowercaseString]];
720                                [transDict release];
721                        }
722                        [transDict setObject:selected forKey:SELECTED_POSTER_KEY];
723                //      [transDict removeObjectForKey:IMP_POSTERS_KEY];
724                }
725                [self writeSettings];
726                /*We can resume now*/
727                [dataMenu resume];
728        }
729        else
730                return;
731}
732
733@end
Note: See TracBrowser for help on using the repository browser.