source: trunk/SapphireMovieImporter.m @ 252

Revision 252, 25.1 KB checked in by pmerrill, 6 years ago (diff)
  • Added a media preview for movie specific metadata.
  • Code cleanup.


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_RESULT_RELEASE_DATE_XPATH  @"//div[@class='info']"
28#define IMDB_RESTULT_CAST_NAMES_XPATH   @"//div[@class='info']/table/tr/td/a"
29/* IMP XPATHS */
30#define IMP_POSTER_CANDIDATES_XPATH             @"//img/@src"
31
32
33
34
35/*Delegate class to download cover art*/
36@interface SapphireMovieDataMenuDownloadDelegate : NSObject
37{
38        NSString *destination;
39        NSArray *requestList ;
40        NSMutableArray *delegates ;
41        long downloadsLeft ;
42}
43- (id)initWithRequest:(NSArray*)reqList withDestination:(NSString *)dest;
44- (void) downloadDidFinish: (NSURLDownload *) download;
45- (long) downloadsCompleted;
46- (long) downloadsQueued;
47- (void)downloadMoviePosters ;
48@end
49
50@implementation SapphireMovieDataMenuDownloadDelegate
51/*!
52* @brief Initialize a cover art downloader
53 *
54 * @param reqList The list of url requests to try
55 * @param dest The path to save the file
56 */
57- (id)initWithRequest:(NSArray*)reqList withDestination:(NSString *)dest;
58{
59        self = [super init];
60        if(!self)
61                return nil;
62        delegates = [NSMutableArray new];
63        destination = [dest retain];
64        requestList = [reqList retain];
65        downloadsLeft=[requestList count] ;
66        return self;   
67}
68
69/*!
70* @brief Fire the delegate to start downloading the posters
71 *
72 */
73-(void)downloadMoviePosters
74{
75        NSEnumerator *reqEnum = [requestList objectEnumerator] ;
76        NSString *req = nil ;
77        while((req = [reqEnum nextObject]) !=nil)
78        {
79                NSURL *posterURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.IMPAwards.com%@",req]];
80                NSString *fullDestination = [NSString stringWithFormat:@"%@/%@", destination, [req lastPathComponent]];
81                NSURLRequest *request = [NSURLRequest requestWithURL:posterURL];
82                NSURLDownload *currentDownload = [[NSURLDownload alloc] initWithRequest:request delegate:self] ;
83                [currentDownload setDestination:fullDestination allowOverwrite:YES];
84                [delegates addObject:currentDownload];
85                [currentDownload release];
86        }
87}
88
89- (void) downloadDidFinish: (NSURLDownload *) download
90{
91        downloadsLeft--;
92}
93
94- (long) downloadsCompleted
95{
96        if(downloadsLeft == 0)
97        {
98                [delegates release];
99                delegates = nil;
100                return 0;
101        }
102        else
103        {
104                return [requestList count] - downloadsLeft;
105        }
106}
107
108- (long) downloadsQueued
109{
110                return [requestList count];
111}
112
113- (void)dealloc
114{
115        [destination release];
116        [requestList release];
117        [delegates 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        }
244        if([candidatePosterLinks count])
245        {
246                /* download all posters to the scratch folder */
247                NSString *posterBuffer = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/Sapphire/Poster_Buffer"];
248                [[NSFileManager defaultManager] createDirectoryAtPath:posterBuffer attributes:nil];
249                SapphireMovieDataMenuDownloadDelegate *myDelegate = [[SapphireMovieDataMenuDownloadDelegate alloc] initWithRequest:candidatePosterLinks withDestination:posterBuffer];
250                [myDelegate downloadMoviePosters] ;
251                [myDelegate autorelease];
252        }
253        return candidatePosterLinks;
254}
255
256/*!
257* @brief Get the posters from IMPAwards.com
258 *
259 * @param posterLinks The Movie's IMP Poster links
260 * @return selected poster link
261 */
262- (void)getPostersForMovie:(NSString *)movieTitle withPath:(NSString*)moviePath
263{
264        NSString *fileName = [[moviePath lastPathComponent] lowercaseString] ;
265        NSArray *posters = [[movieTranslations objectForKey:fileName] objectForKey:IMP_POSTERS_KEY];
266        if([posters count])
267        {
268                /* download all posters to the scratch folder */
269                NSString *posterBuffer = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/Sapphire/Poster_Buffer"];
270                [[NSFileManager defaultManager] createDirectoryAtPath:posterBuffer attributes:nil];
271                SapphireMovieDataMenuDownloadDelegate *myDelegate = [[SapphireMovieDataMenuDownloadDelegate alloc] initWithRequest:posters withDestination:posterBuffer];
272                [myDelegate downloadMoviePosters] ;
273                [myDelegate autorelease];
274        }
275}
276
277
278/*!
279* @brief Fetch information for a movie
280 *
281 * @param movieTitleLink The IMDB link extention (part of the show's URL)
282 * @param moviePath The movie file's location
283 * @return A cached dictionary of the movie info
284 */
285- (NSMutableDictionary *)getMetaForMovie:(NSString *)movieTitleLink withPath:(NSString*)moviePath
286{
287        NSError *error = nil;
288        NSMutableDictionary *ret = [NSMutableDictionary dictionary];
289       
290        /* Gather IMDB Data */
291        /*Get the movie html*/
292        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.IMDB.com%@",movieTitleLink]];
293        NSXMLDocument *document = [[NSXMLDocument alloc] initWithContentsOfURL:url options:NSXMLDocumentTidyHTML error:&error];
294       
295        /* Get the movie title */
296        NSString *movieTitle= [[document objectsForXQuery:IMDB_RESULT_TITLE_YEAR_XPATH error:&error] objectAtIndex:0];
297        NSScanner *metaTrimmer=[NSScanner scannerWithString:movieTitle];
298        [metaTrimmer scanUpToString:@"(" intoString:&movieTitle];
299        movieTitle=[movieTitle substringToIndex:[movieTitle length]-1];
300       
301        /* Get the release date */
302        NSArray *rawData=[document objectsForXQuery:IMDB_RESULT_RELEASE_DATE_XPATH error:&error];
303        NSDate * releaseDate=nil ;
304        NSString * plot=nil;
305        NSArray * directors=nil;
306        NSArray * writers=nil;
307        NSArray * genres=nil;
308        if([rawData count])
309        {
310                NSEnumerator *resultEnum = [rawData objectEnumerator];
311                NSXMLElement *result = nil;
312                while((result = [resultEnum nextObject]) != nil)
313                {
314                        NSString *dataCandidate=[result stringValue];
315
316                        if([dataCandidate length])
317                        {
318                                NSString * dataType=nil;
319                                NSScanner * trimmer=[NSScanner scannerWithString:dataCandidate];
320                                [trimmer scanUpToString:@"\n" intoString:&dataType];
321                                if([dataType hasPrefix:@"Release"])
322                                {
323                                        [trimmer scanUpToString:@"(" intoString:&dataCandidate];
324                                        releaseDate=[NSDate dateWithNaturalLanguageString:dataCandidate];
325
326                                }
327                                else if([dataType hasPrefix:@"Writers"])
328                                {
329                                        writers=[NSArray array];
330                                        while(![trimmer isAtEnd])
331                                        {
332                                                NSString * aWriter=nil;
333                                                [trimmer scanUpToString:@"\n" intoString:&aWriter];
334                                                writers=[writers arrayByAddingObject:aWriter];
335                                        }
336                                       
337                                }
338                                else if([dataType hasPrefix:@"Director"])
339                                {
340                                        directors=[NSArray array];
341                                        while(![trimmer isAtEnd])
342                                        {
343                                                NSString * aDirector=nil;
344                                                [trimmer scanUpToString:@"\n" intoString:&aDirector];
345                                                directors=[directors arrayByAddingObject:aDirector];
346                                        }
347                                       
348                                }
349                                else if([dataType hasPrefix:@"Genre"])
350                                {
351
352                                        genres=[NSArray array];
353                                        while(![trimmer isAtEnd])
354                                        {
355                                                NSString *aGenre=nil;
356                                                [trimmer scanUpToString:@"/" intoString:&aGenre];
357                                                if(aGenre)
358                                                {
359                                                        if([aGenre isEqualToString:@"/"])
360                                                                continue ;
361                                                        else if([aGenre hasSuffix:@"more\n"])
362                                                                aGenre=[aGenre substringToIndex:[aGenre length]-6];
363                                                        else if([aGenre hasSuffix:@" "])
364                                                                aGenre=[aGenre substringToIndex:[aGenre length]-1];
365                                                        genres=[genres arrayByAddingObject:aGenre];
366                                                }
367                                                else
368                                                {
369                                                        [trimmer scanUpToString:@" " intoString:&aGenre];
370                                                }
371                                        }
372                                }
373                                else if([dataType hasPrefix:@"Plot Outline"])
374                                {
375                                        while(![trimmer isAtEnd])
376                                        {
377                                                NSString * aPlot=nil;
378                                                [trimmer scanUpToString:@"more\n" intoString:&aPlot];
379                                                if(aPlot)
380                                                        plot=aPlot;
381                                                else
382                                                        break;
383                                               
384                                        }
385                                }
386                                else
387                                        continue ;
388                        }
389                        else
390                                continue ;
391                }
392
393               
394        }
395       
396        /* Get the cast list */
397        NSArray *rawCast=[document objectsForXQuery:IMDB_RESTULT_CAST_NAMES_XPATH error:&error];
398        NSArray *completeCast=nil ;
399        if([rawCast count])
400        {
401                NSArray *results=nil;
402                NSEnumerator *resultEnum = [rawCast objectEnumerator];
403                NSXMLElement *result = nil;
404                while((result = [resultEnum nextObject]) != nil)
405                {
406                        NSString *castName=nil;
407                        castName=[result stringValue];
408                        if([castName length])
409                        {
410                                NSString * castURL=[[[result attributeForName:@"href"]stringValue]lowercaseString];
411                                if([castURL hasPrefix:@"/name/"])
412                                {
413                                        if(!results)
414                                                results=[NSArray arrayWithObject:castName];
415                                        else
416                                                results=[results arrayByAddingObject:castName];
417                                }
418                                else continue ;
419                        }
420                        else
421                        continue ;
422                }
423                completeCast=results ;
424        }
425       
426       
427        /* populate metadata to return */
428        if(directors)
429                [ret setObject:directors forKey:META_MOVIE_DIRECTOR_KEY];
430        if(plot)
431                [ret setObject:plot forKey:META_MOVIE_PLOT_KEY];
432        if(releaseDate)
433                [ret setObject:releaseDate forKey:META_MOVIE_RELEASE_DATE_KEY];
434        if(genres)
435                [ret setObject:genres forKey:META_MOVIE_GENRES_KEY];
436        if(completeCast)
437                [ret setObject:completeCast forKey:META_MOVIE_CAST_KEY];
438        if(movieTitle)
439                [ret setObject:movieTitle forKey:META_MOVIE_TITLE_KEY];
440        return ret;
441}
442
443
444
445/*!
446* @brief Searches for a movie based on the filename
447 *
448 * @param searchStr Part of the filename to use in the show search
449 * @return An array of possible results
450 */
451- (NSArray *)searchResultsForMovie:(NSString *)searchStr
452{
453        /* prep the search string */
454        searchStr = [searchStr stringByDeletingPathExtension];
455        searchStr = [searchStr stringByReplacingAllOccurancesOf:@"_" withString:@" "];
456        searchStr = [searchStr stringByReplacingAllOccurancesOf:@"." withString:@" "];
457        searchStr = [searchStr stringByReplacingAllOccurancesOf:@"-" withString:@" "];
458        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.imdb.com/find?s=all&q=%@", [searchStr URLEncode]]];
459        NSError * error = nil;
460        BOOL uniqueResult=NO ;
461        NSArray * results = nil;
462        NSMutableArray *ret=nil;
463        NSXMLDocument *document = [[NSXMLDocument alloc] initWithContentsOfURL:url options:NSXMLDocumentTidyHTML error:&error];
464        NSXMLElement *root = [document rootElement];   
465        NSString *resultTitle=[[[root objectsForXQuery:@"//title" error:&error]objectAtIndex:0] stringValue];
466       
467        if([resultTitle isEqualToString:@"IMDb Search"])/*Make sure we didn't get back a unique result */
468        {
469                results = [root objectsForXQuery:IMDB_SEARCH_XPATH error:&error];
470                ret = [NSMutableArray arrayWithCapacity:[results count]];
471        }
472        else /* IMDB directly linked to a unique movie title */
473        {
474                uniqueResult=YES ;
475                ret = [NSMutableArray arrayWithCapacity:1];
476                results = [root objectsForXQuery:IMDB_UNIQUE_SEARCH_XPATH error:&error];               
477        }       
478               
479        if([results count])
480        {
481                /*Get each result*/
482                NSEnumerator *resultEnum = [results objectEnumerator];
483                NSXMLElement *result = nil;
484                while((result = [resultEnum nextObject]) != nil)
485                {
486                        if(uniqueResult)/*Check for a unique title link*/
487                        {
488                                NSURL *resultURL = [NSURL URLWithString:[[[result objectsForXQuery:IMDB_UNIQUE_SEARCH_XPATH error:&error] objectAtIndex:0] stringValue]] ;
489                                if(resultURL == nil)
490                                        continue;
491                                NSString *URLSubPath =[resultURL path] ;
492                                if([URLSubPath hasPrefix:@"/rg/title-tease/"])
493                                {
494                                        URLSubPath=[[URLSubPath stringByReplacingAllOccurancesOf:@"/rg/title-tease/" withString:@""]stringByDeletingLastPathComponent];
495                                        NSScanner * snipPrefix=[NSScanner scannerWithString:URLSubPath];
496                                        NSString *snip=nil ;
497                                        [snipPrefix scanUpToString:@"/" intoString:&snip] ;
498                                        URLSubPath=[URLSubPath stringByReplacingAllOccurancesOf:snip withString:@""];
499                                        [ret addObject:[NSDictionary dictionaryWithObjectsAndKeys:
500                                                resultTitle, @"name",
501                                                URLSubPath, IMDB_LINK_KEY,
502                                                nil]];
503                                        return ret ;
504                                }
505                        }
506                        else
507                        {
508                                /*Add the result to the list*/
509                                NSURL *resultURL = [NSURL URLWithString:[[[result objectsForXQuery:IMDB_RESULT_LINK_XPATH error:&error] objectAtIndex:0] stringValue]] ;
510                                NSString * resultTitleValue=[result stringValue];
511                                if(resultURL == nil)
512                                        continue;
513                                /*Skip Video Game titles (VG) */
514                                else if([resultTitleValue hasSuffix:@" (VG) "])
515                                        continue ;
516                                [ret addObject:[NSDictionary dictionaryWithObjectsAndKeys:
517                                        [[result objectsForXQuery:IMDB_RESULT_NAME_XPATH error:&error] objectAtIndex:0], @"name",
518                                        [resultURL path], IMDB_LINK_KEY,
519                                        nil]];
520                        }
521                }
522                if(!uniqueResult)return ret;
523        }
524        return nil ;
525}
526
527
528/*!
529* @brief Write our setings out
530 */
531- (void)writeSettings
532{
533        NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
534                movieTranslations, TRANSLATIONS_KEY,
535                nil];
536        [settings writeToFile:settingsPath atomically:YES];
537}
538
539/*!
540* @brief verify file extention of a file
541 *
542 * @param filePAth The file's path
543 * @return YES if candidate, NO otherwise
544 */
545- (BOOL)isMovieCandidate:(NSString*)fileExt
546{
547        if([[SapphireMetaData videoExtensions] member:fileExt])
548                return YES;
549        else return NO ;
550}
551
552/*!
553* @brief Import a single File
554 *
555 * @param metaData The file to import
556 * @return YES if imported, NO otherwise
557 */
558- (BOOL) importMetaData:(SapphireFileMetaData *)metaData
559{
560        currentData = metaData;
561        /*Check to see if it is already imported*/
562        if([metaData importedTimeFromSource:META_IMDB_IMPORT_KEY])
563                return NO;
564        /*Get path*/
565        NSString *path = [metaData path];
566        if(![self isMovieCandidate:[path pathExtension]])
567                return NO;
568        /*Get fineName*/
569        NSString *fileName = [path lastPathComponent];
570        if([metaData fileClass]==FILE_CLASS_TV_SHOW) /* File is a TV Show - skip it */
571                return NO ;
572       
573        /*Get the movie title*/
574        NSString *movieDataLink = nil ;
575        /*Check to see if we know this movie*/
576        NSMutableDictionary *dict=[movieTranslations objectForKey:[fileName lowercaseString]];
577        if(dict == nil)
578        {
579                /*Ask the user what movie this is*/
580                NSArray *movies = [self searchResultsForMovie:fileName];
581                /*Pause for the user's input*/
582                [dataMenu pause];
583                /*Bring up the prompt*/
584                SapphireMovieChooser *chooser = [[SapphireMovieChooser alloc] initWithScene:[dataMenu scene]];
585                [chooser setMovies:movies];
586                [chooser setFileName:fileName];         
587                [chooser setListTitle:BRLocalizedString(@"Select Movie Title", @"Prompt the user for title of movie")];
588                /*And display prompt*/
589                [[dataMenu stack] pushController:chooser];
590                [chooser release];
591                return NO ;
592                //Data will be ready for access on the next call
593        }
594
595        NSString * selectedPoster=nil ;
596        selectedPoster=[dict objectForKey:SELECTED_POSTER_KEY] ;
597        if(!selectedPoster && [dict objectForKey:IMP_POSTERS_KEY])
598        {
599                /* Posters were downloaded, let the user choose one */
600                [dataMenu pause];
601                SapphirePosterChooser * chooser=[[SapphirePosterChooser alloc] initWithScene:[dataMenu scene]];
602                [[dataMenu scene] renderScene];
603                NSArray *posters=[dict objectForKey:IMP_POSTERS_KEY];
604                [chooser setPosters:posters] ;
605                [chooser setFileName:fileName];
606                [chooser setMovieTitle:@"Movie Title"];
607                [chooser setListTitle:BRLocalizedString(@"Select Movie Poster", @"Prompt the user for poster selection")];
608                [[dataMenu stack] pushController:chooser];
609                [chooser release];
610                return NO;
611        }
612        if(selectedPoster && [dict objectForKey:IMP_POSTERS_KEY])
613        {
614                /* Lets move the selected poster to the corresponding Cover Art Directory */
615                NSFileManager *fileAgent=[NSFileManager alloc];
616                NSString * poster=[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/Sapphire/Poster_Buffer"];
617                poster=[poster stringByAppendingPathComponent:[selectedPoster lastPathComponent]];
618                NSString * coverart=[[path stringByDeletingLastPathComponent]stringByAppendingPathComponent:@"Cover Art"];
619                coverart=[coverart stringByAppendingPathComponent:[fileName stringByDeletingPathExtension]];
620                coverart=[coverart stringByAppendingPathExtension:[poster pathExtension]];
621                /* the fileAgent will do nothing if the file has already been moved or removed */               
622                [fileAgent movePath:poster toPath:coverart handler:self] ;
623                /* Lets clean up the Poster_Buffer */
624                NSArray *oldPosters = [dict objectForKey:IMP_POSTERS_KEY];
625                if([oldPosters count])
626                {
627                        NSEnumerator *resultEnum = [oldPosters objectEnumerator];
628                        NSString *result = nil;
629                        while((result = [resultEnum nextObject]) != nil)
630                        {
631                                BOOL isDir=NO ;
632                                NSString *removeFile=[NSString stringWithFormat:@"%@/%@",[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/Sapphire/Poster_Buffer"],[result lastPathComponent]];
633                                [fileAgent fileExistsAtPath:removeFile isDirectory:&isDir];
634                                if(!isDir)[fileAgent removeFileAtPath:removeFile handler:self] ;
635                        }
636                }
637                [fileAgent release];
638//              return NO;
639        }
640       
641        /*Import the info*/
642        /*IMDB Data */
643        NSMutableDictionary *infoIMDB = nil;
644        movieDataLink=[dict objectForKey:IMDB_LINK_KEY];
645        infoIMDB = [self getMetaForMovie:movieDataLink withPath:path];
646        if(!infoIMDB)
647                return NO;
648        [infoIMDB removeObjectForKey:IMDB_LINK_KEY];
649        [metaData importInfo:infoIMDB fromSource:META_IMDB_IMPORT_KEY withTime:[[NSDate date] timeIntervalSince1970]];
650        [metaData setFileClass:FILE_CLASS_MOVIE];
651        /*We imported something*/
652        return YES;
653}
654
655
656/*!
657* @brief The completion text to display
658 *
659 * @return The completion text to display
660 */
661- (NSString *)completionText
662{
663        return BRLocalizedString(@"All availble Movie data has been imported", @"The Movie import is complete");
664}
665
666/*!
667* @brief The initial text to display
668 *
669 * @return The initial text to display
670 */
671- (NSString *)initialText
672{
673        return BRLocalizedString(@"Movie Meta Data", @"Title");
674}
675
676/*!
677* @brief The informative text to display
678 *
679 * @return The informative text to display
680 */
681- (NSString *)informativeText
682{
683        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");
684}
685
686/*!
687* @brief The button title
688 *
689 * @return The button title
690 */
691- (NSString *)buttonTitle
692{
693        return BRLocalizedString(@"Start Fetching Data", @"Button");
694}
695
696/*!
697* @brief The data menu was exhumed
698 *
699 * @param controller The Controller which was on top
700 */
701- (void) wasExhumedByPoppingController: (BRLayerController *) controller
702{
703        /*See if it was a movie chooser*/
704        if([controller isKindOfClass:[SapphireMovieChooser class]])
705        {
706                /*Get the user's selection*/
707                SapphireMovieChooser *chooser = (SapphireMovieChooser *)controller;
708                int selection = [chooser selection];
709                if(selection == MOVIE_CHOOSE_CANCEL)
710                        /*They aborted, skip*/
711                        [dataMenu skipNextItem];
712                else if(selection == MOVIE_CHOOSE_NOT_MOVIE)
713                {
714                        /*They said it is not a movie, so put in empty data so they are not asked again*/
715                        [currentData importInfo:[NSMutableDictionary dictionary] fromSource:META_IMDB_IMPORT_KEY withTime:[[NSDate date] timeIntervalSince1970]];
716                        if ([currentData fileClass] != FILE_CLASS_TV_SHOW)
717                                [currentData setFileClass:FILE_CLASS_UNKNOWN];
718                }
719                else if(selection==MOVIE_CHOOSE_OTHER)
720                {
721                        [currentData importInfo:[NSMutableDictionary dictionary] fromSource:META_IMDB_IMPORT_KEY withTime:[[NSDate date] timeIntervalSince1970]];
722                        [currentData setFileClass:FILE_CLASS_OTHER] ;
723                }
724                else if(selection==MOVIE_CHOOSE_TV_SHOW)
725                {
726                        [currentData importInfo:[NSMutableDictionary dictionary] fromSource:META_IMDB_IMPORT_KEY withTime:[[NSDate date] timeIntervalSince1970]];
727                        [currentData setFileClass:FILE_CLASS_TV_SHOW] ;
728                }
729                else
730                {
731                        /*They selected a movie title, save the translation and write it*/
732                        NSDictionary *movie = [[chooser movies] objectAtIndex:selection];
733                        NSString *filename = [[chooser fileName] lowercaseString];
734                        NSMutableDictionary * transDict = [movieTranslations objectForKey:filename];
735                        if(transDict == nil)
736                        {
737                                transDict=[NSMutableDictionary new] ;
738                                [movieTranslations setObject:transDict forKey:filename];
739                                [transDict release];
740                        }
741                        /* Add IMDB Key */
742                        [transDict setObject:[movie objectForKey:IMDB_LINK_KEY] forKey:IMDB_LINK_KEY];
743                        NSString *posterPath=nil ;
744                        /* Get the IMP Key with the IMDB Posters page */
745                        posterPath=[self getPosterPath:[transDict objectForKey:IMDB_LINK_KEY]] ;
746                        if(posterPath!=nil)
747                        {
748                                [transDict setObject:posterPath forKey:IMP_LINK_KEY];
749                                /*We got a posterPath, get the posterLinks */
750                                NSArray *posterLinks=nil ;
751                                /* User already selected a poster, skip */
752                                if(![transDict objectForKey:SELECTED_POSTER_KEY]) posterLinks=[self getPosterLinks:posterPath];
753                                if(posterLinks!=nil)
754                                {
755                                        /* Add the poster links */
756                                        [transDict setObject:posterLinks forKey:IMP_POSTERS_KEY];
757                                }
758                                /* Add another method via chooser incase IMDB doesn't have an IMP link */
759                        }
760                }
761                [self writeSettings];
762                /*We can resume now*/
763                [dataMenu resume];
764        }
765        else if([controller isKindOfClass:[SapphirePosterChooser class]])
766        {
767                SapphirePosterChooser *chooser = (SapphirePosterChooser *)controller;
768                int selectedPoster = [chooser selectedPoster];
769                if(selectedPoster == POSTER_CHOOSE_CANCEL)
770                        /*They aborted, skip*/
771                        [dataMenu skipNextItem];
772                else
773                {
774                        NSString *selected = [[chooser posters] objectAtIndex:selectedPoster];
775                        NSMutableDictionary * transDict = [movieTranslations objectForKey:[[chooser fileName]lowercaseString]];
776                        if(transDict == nil)
777                        {
778                                transDict=[NSMutableDictionary new] ;
779                                [movieTranslations setObject:transDict forKey:[[chooser fileName]lowercaseString]];
780                                [transDict release];
781                        }
782                        [transDict setObject:selected forKey:SELECTED_POSTER_KEY];
783                }
784                [self writeSettings];
785                /*We can resume now*/
786                [dataMenu resume];
787        }
788        else
789                return;
790}
791
792@end
Note: See TracBrowser for help on using the repository browser.