source: trunk/SapphireMediaPreview.m @ 318

Revision 318, 10.6 KB checked in by pmerrill, 6 years ago (diff)
  • Added the ability to hide Audio info in the Media Preview.
  • Added the ability to hide Video info in the Media Preview.
Line 
1//
2//  SapphireMediaPreview.m
3//  Sapphire
4//
5//  Created by Graham Booker on 6/26/07.
6//  Copyright 2007 www.nanopi.net. All rights reserved.
7//
8
9#import "SapphireMediaPreview.h"
10#import "SapphireMetaData.h"
11#import "SapphireMedia.h"
12#import "SapphireSettings.h"
13#import <objc/objc-class.h>
14#import "SapphireFrontRowCompat.h"
15
16/*These interfaces are to access variables not available*/
17@interface BRMetadataLayer (protectedAccess)
18- (NSArray *)gimmieMetadataObjs;
19@end
20
21@implementation BRMetadataLayer (protectedAccess)
22- (NSArray *)gimmieMetadataObjs
23{
24        Class myClass = [self class];
25        Ivar ret = class_getInstanceVariable(myClass,"_metadataLabels");
26       
27        return *(NSArray * *)(((char *)self)+ret->ivar_offset);
28}
29@end
30
31@interface SapphireMediaPreview (private)
32- (void)doPopulation;
33- (NSString *)coverArtForPath;
34@end
35
36@interface BRMetadataPreviewController (compat)
37- (void)_updateMetadataLayer;
38@end
39
40@interface BRMetadataPreviewController (protectedAccess)
41- (BRMetadataLayer *)gimmieMetadataLayer;
42@end
43
44@implementation BRMetadataPreviewController (protectedAccess)
45- (BRMetadataLayer *)gimmieMetadataLayer
46{
47        Class myClass = [self class];
48        Ivar ret = class_getInstanceVariable(myClass,"_metadataLayer");
49       
50        return *(BRMetadataLayer * *)(((char *)self)+ret->ivar_offset);
51}
52@end
53
54@implementation SapphireMediaPreview
55
56/*List of extensions to look for cover art*/
57static NSSet *coverArtExtentions = nil;
58
59+ (void)initialize
60{
61        /*Initialize the set of cover art extensions*/
62        coverArtExtentions = [[NSSet alloc] initWithObjects:
63                @"jpg",
64                @"jpeg",
65                @"tif",
66                @"tiff",
67                @"png",
68                @"gif",
69                nil];
70}
71
72- (id)initWithScene:(BRRenderScene *)scene
73{
74        if([[BRMetadataPreviewController class] instancesRespondToSelector:@selector(initWithScene:)])
75                return [super initWithScene:scene];
76        else
77                return [super init];
78}
79
80- (void)dealloc
81{
82        [meta release];
83        [super dealloc];
84}
85
86/*!
87 * @brief Set the File information
88 *
89 * @param newMeta The meta data
90 */
91- (void)setMetaData:(SapphireMetaData *)newMeta
92{
93        [meta release];
94        NSString *path = [newMeta path];
95        if(path == nil)
96        {
97                meta = nil;
98                return;
99        }
100        meta = [newMeta retain];
101        /*Now that we know the file, set the asset*/
102        NSURL *url = [NSURL fileURLWithPath:[meta path]];
103        SapphireMedia *asset  =[[SapphireMedia alloc] initWithMediaURL:url];
104        [asset setImagePath:[self coverArtForPath]];
105        [self setAsset:asset];
106}
107
108/*!
109 * @brief Search for cover art for the current metadata
110 *
111 * @return The path to the found cover art
112 */
113- (NSString *)coverArtForPath
114{
115        /*See if this is a directory*/
116        if([meta isKindOfClass:[SapphireDirectoryMetaData class]])
117        {
118                NSString *ret = [(SapphireDirectoryMetaData *)meta coverArtPath];
119                if(ret != nil)
120                        return ret;
121        } else {
122                NSString *ret = [(SapphireFileMetaData *)meta coverArtPath];
123                if(ret != nil)
124                        return ret;
125        }
126        /*Fallback to default*/
127        return [[[NSBundle bundleForClass:[self class]] bundlePath] stringByAppendingString:@"/Contents/Resources/DefaultPreview.png"];
128}
129
130/*!
131 * @brief Override the loading of the cover art method
132 */
133- (void)_loadCoverArt
134{
135        [super _loadCoverArt];
136       
137        /*See if it loaded something*/
138        if([_coverArtLayer texture] != nil)
139                return;
140       
141        /*Get our cover art*/
142        NSString *path = [self coverArtForPath];
143        NSURL *url = [NSURL fileURLWithPath:path];
144        /*Create an image source*/;
145    CGImageSourceRef  sourceRef;
146        CGImageRef        imageRef = NULL;
147        sourceRef = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
148        if(sourceRef) {
149        imageRef = CGImageSourceCreateImageAtIndex(sourceRef, 0, NULL);
150        CFRelease(sourceRef);
151    }
152        if(imageRef)
153        {
154                [_coverArtLayer setImage:imageRef];
155                CFRelease(imageRef);
156        }       
157}
158
159/*!
160* @brief populate metadata for TV Shows
161 */
162- (void) populateTVShowMetadataWith:(NSMutableDictionary*)allMeta
163{
164        NSString *value = [allMeta objectForKey:META_TITLE_KEY];
165        BRMetadataLayer *metaLayer = [self gimmieMetadataLayer];
166        if(value != nil)
167        {
168                /*If there is an air date, put it in the title*/
169                NSDate *airDate = [allMeta objectForKey:META_SHOW_AIR_DATE];
170                if(airDate != nil)
171                {
172                        NSDateFormatter *format = [[NSDateFormatter alloc] init];
173                        [format setDateStyle:NSDateFormatterShortStyle];
174                        [format setTimeZone:NSDateFormatterNoStyle];
175                        value = [[format stringFromDate:airDate]stringByAppendingFormat:@" - %@", value];
176                }
177                [metaLayer setTitle:value];
178        }
179       
180        /*Get the rating*/
181        value = [allMeta objectForKey:META_RATING_KEY];
182        if(value != nil)
183                [metaLayer setRating:value];
184       
185        /*Get the description*/
186        value = [allMeta objectForKey:META_DESCRIPTION_KEY];
187        if(value != nil)
188                if([[SapphireSettings sharedSettings] displaySpoilers])
189                        [metaLayer setSummary:value];
190       
191        /*Get the copyright*/
192        value = [allMeta objectForKey:META_COPYRIGHT_KEY];
193        if(value != nil)
194                [metaLayer setCopyright:value];
195       
196        /*Get the season and epsiodes*/
197        value = [allMeta objectForKey:META_EPISODE_AND_SEASON_KEY];
198        if(value != nil)
199        {
200                /*Remove the individuals so we don't display them*/
201                [allMeta removeObjectForKey:META_EPISODE_NUMBER_KEY];
202                [allMeta removeObjectForKey:META_SEASON_NUMBER_KEY];
203        }
204       
205}
206
207/*!
208* @brief populate metadata for Movies
209 */
210- (void) populateMovieMetadataWith:(NSMutableDictionary*)allMeta
211{
212        /* Get the movie title */
213        NSString *value=nil;
214        value = [allMeta objectForKey:META_MOVIE_TITLE_KEY];
215        BRMetadataLayer *metaLayer = [self gimmieMetadataLayer];
216
217        /*Get the release date*/
218        NSDate *releaseDate = [allMeta objectForKey:META_MOVIE_RELEASE_DATE_KEY];
219        if(releaseDate != nil)
220        {
221                NSDateFormatter *format = [[NSDateFormatter alloc] init];
222                [format setDateStyle:NSDateFormatterLongStyle];
223                [format setTimeZone:NSDateFormatterNoStyle];
224                value = [NSString stringWithFormat:@"Released: %@",[format stringFromDate:releaseDate]];
225                [allMeta removeObjectForKey:META_MOVIE_RELEASE_DATE_KEY];
226                [allMeta removeObjectForKey:META_MOVIE_TITLE_KEY];
227        }
228        /* No release date, sub in the movie title */
229        [metaLayer setTitle:value];
230
231        /*Get the rating*/
232        value=nil;
233        value = [allMeta objectForKey:META_MOVIE_MPAA_RATING_KEY];
234        if(value != nil)
235                [metaLayer setRating:value];
236        /*Get the movie plot*/
237        value=nil;
238        value = [allMeta objectForKey:META_MOVIE_PLOT_KEY];
239        if(value != nil)
240                if([[SapphireSettings sharedSettings] displaySpoilers])
241                        [metaLayer setSummary:value];
242       
243        NSArray *values=nil;
244        /* Get genres */
245        values=[allMeta objectForKey:META_MOVIE_GENRES_KEY];
246        value=[NSString string];
247        if(values!=nil)
248        {
249                NSEnumerator *valuesEnum = [values objectEnumerator] ;
250                NSString *aValue=nil;
251                while((aValue = [valuesEnum nextObject]) !=nil)
252                {
253                        value=[value stringByAppendingString:[NSString stringWithFormat:@"%@, ",aValue]];
254                }
255                /* get rid of the extra comma */
256                value=[value substringToIndex:[value length]-2];
257                /* sub the array for a formatted string */
258                [allMeta setObject:value forKey:META_MOVIE_GENRES_KEY];
259        }
260        /* Get directors */
261        values=nil;
262        values=[allMeta objectForKey:META_MOVIE_DIRECTOR_KEY];
263        value=[NSString string];
264        if(values!=nil)
265        {
266                NSEnumerator *valuesEnum = [values objectEnumerator] ;
267                NSString *aValue=nil;
268                while((aValue = [valuesEnum nextObject]) !=nil)
269                {
270                        value=[value stringByAppendingString:[NSString stringWithFormat:@"%@, ",aValue]];
271                }
272                /* get rid of the extra comma */
273                value=[value substringToIndex:[value length]-2];
274                /* sub the array for a formatted string */
275                [allMeta setObject:value forKey:META_MOVIE_DIRECTOR_KEY];
276        }
277        /* Get cast */
278        values=nil;
279        values=[allMeta objectForKey:META_MOVIE_CAST_KEY];
280        value=[NSString string];
281        if(values!=nil)
282        {
283                NSEnumerator *valuesEnum = [values objectEnumerator] ;
284                NSString *aValue=nil;
285                NSString *lastToAdd;
286                if([values count]>2)
287                        lastToAdd=[values objectAtIndex:2] ;
288                while((aValue = [valuesEnum nextObject]) !=nil)
289                {
290                        value=[value stringByAppendingString:[NSString stringWithFormat:@"%@, ",aValue]];
291                        if([aValue isEqualToString:lastToAdd])break;
292                }
293                /* get rid of the extra comma */
294                value=[value substringToIndex:[value length]-2];
295                /* sub the array for a formatted string */
296                [allMeta setObject:value forKey:META_MOVIE_CAST_KEY];
297        }
298        /* Get IMDB Stats */
299        value=nil ;
300        value=[allMeta objectForKey:META_MOVIE_IMDB_RATING_KEY];
301        if(value!=nil)
302        {
303                value=[NSString stringWithFormat:@"%1.1f/10",[value floatValue]];
304                NSString *top250=nil;
305                top250=[allMeta objectForKey:META_MOVIE_IMDB_250_KEY];
306                if(top250!=nil)
307                        value=[NSString stringWithFormat:@"#%@ on Top 250 (%@)",top250,value];
308                else
309                        value=[NSString stringWithFormat:@"User Rated %@",value];
310                [allMeta removeObjectForKey:META_MOVIE_IMDB_RATING_KEY];
311                [allMeta removeObjectForKey:META_MOVIE_IMDB_250_KEY];
312                [allMeta setObject:value forKey:META_MOVIE_IMDB_STATS_KEY];
313        }
314}
315
316
317/*!
318 * @brief populate metadata for media files
319 */
320- (void)_populateMetadata
321{
322        [super _populateMetadata];
323        /*See if it loaded anything*/
324        if([[[self gimmieMetadataLayer] gimmieMetadataObjs] count])
325                return;
326       
327        [self doPopulation];
328}
329
330/*!
331 * @brief populate metadata for media files
332 */
333- (void)_updateMetadataLayer
334{
335        [super _updateMetadataLayer];
336        /*See if it loaded anything*/
337        if([[[self gimmieMetadataLayer] gimmieMetadataObjs] count] && ![SapphireFrontRowCompat usingFrontRow])
338                return;
339       
340        [self doPopulation];
341}
342
343- (void)doPopulation
344{
345        /*Get our data then*/
346        NSArray *order = nil;
347        NSMutableDictionary *allMeta = [meta getDisplayedMetaDataInOrder:&order];
348       
349        FileClass fileClass=FILE_CLASS_UNKNOWN ;
350        if([meta isKindOfClass:[SapphireDirectoryMetaData class]])
351                fileClass=FILE_CLASS_NOT_FILE;
352        else
353                fileClass=(FileClass)[(SapphireFileMetaData *) meta fileClass];
354               
355       
356        BRMetadataLayer *metaLayer = [self gimmieMetadataLayer];
357        /* TV Show Preview Handeling */
358        if(fileClass==FILE_CLASS_TV_SHOW)
359        {
360                [self  populateTVShowMetadataWith:allMeta];
361        }
362        /* Movie Preview Handeling */
363        else if(fileClass==FILE_CLASS_MOVIE)
364        {
365                [self populateMovieMetadataWith:allMeta];
366        }
367        /* Directory Preview Handeling */
368        else
369        {
370                NSString *value = [allMeta objectForKey:META_TITLE_KEY];
371                if(value != nil)
372                        [metaLayer setTitle:value];
373        }
374       
375        /* Show / Hide perian info */
376        if(![[SapphireSettings sharedSettings] displayAudio])
377                [allMeta removeObjectForKey:AUDIO_DESC_LABEL_KEY];
378        if(![[SapphireSettings sharedSettings] displayVideo])
379                [allMeta removeObjectForKey:VIDEO_DESC_LABEL_KEY];
380       
381        NSMutableArray *values = [NSMutableArray array];
382        NSMutableArray *keys = [NSMutableArray array];
383       
384        /*Put the metadata in order*/
385        NSEnumerator *keyEnum = [order objectEnumerator];
386        NSString *key = nil;
387        while((key = [keyEnum nextObject]) != nil)
388        {
389                NSString *value = [allMeta objectForKey:key];
390                if(value != nil)
391                {
392                        [values addObject:value];
393                        [keys addObject:key];
394                }
395        }
396       
397        /*And set it*/
398        [metaLayer setMetadata:values withLabels:keys];
399
400}
401
402/*!
403 * @brief Override the info about whether it has metadata
404 *
405 * @return We always have metadata
406 */
407- (BOOL)_assetHasMetadata
408{
409        return YES;
410}
411
412@end
Note: See TracBrowser for help on using the repository browser.