source: trunk/SapphireMovieImporter.m @ 299

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