Changeset 827
- Timestamp:
- 04/26/2009 05:24:48 PM (3 years ago)
- Location:
- branches/CoreData/SapphireFrappliance
- Files:
-
- 2 added
- 10 modified
-
Browser/SapphireMarkMenu.m (modified) (5 diffs)
-
Extension/NSFileManager-Extensions.h (modified) (1 diff)
-
Extension/NSFileManager-Extensions.m (modified) (2 diffs)
-
Extension/NSImage-Extensions.h (added)
-
Extension/NSImage-Extensions.m (added)
-
MetaDataImporting/SapphirePosterChooser.h (modified) (2 diffs)
-
MetaDataImporting/SapphirePosterChooser.m (modified) (9 diffs)
-
MetaDataImporting/SapphireTVShowImporter.m (modified) (3 diffs)
-
MetaDataImporting/SapphireXMLFileDataImporter.m (modified) (3 diffs)
-
Players/SapphireMedia.h (modified) (2 diffs)
-
Players/SapphireMedia.m (modified) (4 diffs)
-
Sapphire.xcodeproj/project.pbxproj (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/CoreData/SapphireFrappliance/Browser/SapphireMarkMenu.m
r818 r827 33 33 #import "SapphireConfirmPrompt.h" 34 34 #import "SapphireApplianceController.h" 35 #import "SapphirePosterChooser.h" 36 #import "NSImage-Extensions.h" 37 #import "NSFileManager-Extensions.h" 38 39 BOOL allowCoverArtChange( NSString * const path ) 40 { 41 if ( [[NSFileManager defaultManager] hasVIDEO_TS:path] ) 42 return NO; 43 44 const NSSet * const disallowedFormats = [[NSSet alloc] initWithObjects:@"mkv", @"flv", nil]; 45 46 return ![disallowedFormats containsObject:[path pathExtension]]; 47 } 35 48 36 49 @implementation SapphireMarkMenu … … 51 64 COMMAND_CUT_PATH, 52 65 COMMAND_DELETE_PATH, 66 COMMAND_CHANGE_ARTWORK, 53 67 //File Only Commands 54 68 COMMAND_MARK_TO_JOIN, … … 365 379 [NSNumber numberWithInt:COMMAND_DELETE_PATH], MARK_COMMAND, 366 380 nil]]; 381 // Allow cover art change for all formats except for DVD, .mkv, and .flv 382 // QTMovie is broken on the ATV, don't do it there 383 if ( [SapphireFrontRowCompat usingFrontRow] && ![SapphireFrontRowCompat usingTakeTwo] && allowCoverArtChange( [meta path] ) ) 384 { 385 [marks addObject: 386 [NSDictionary dictionaryWithObjectsAndKeys: 387 BRLocalizedString(@"Change artwork", @"Change artwork"), MARK_NAME, 388 BRLocalizedString(@"Select displayed artwork", @""), MARK_DESCRIPTION, 389 [NSNumber numberWithInt:COMMAND_CHANGE_ARTWORK], MARK_COMMAND, 390 nil]]; 391 } 367 392 } 368 393 else … … 384 409 } 385 410 386 - (NSController *)doJoin:(SapphireWaitDisplay *)wait 411 - (BRLayerController *)loadArtwork:(SapphireFileMetaData *)fileMeta 412 { 413 NSInvocation *invoke = [NSInvocation invocationWithMethodSignature: [self methodSignatureForSelector: @selector(doChangeArtwork:)]]; 414 [invoke setSelector: @selector(doChangeArtwork:)]; 415 [invoke setTarget: self]; 416 417 SapphireWaitDisplay *wait = [[SapphireWaitDisplay alloc] initWithScene: [self scene] 418 title: BRLocalizedString(@"Getting artwork selection", @"Getting artwork selection") 419 invokation: invoke]; 420 421 [invoke setArgument: &fileMeta atIndex: 2]; 422 return [wait autorelease]; 423 } 424 425 - (BRLayerController *)doChangeArtwork:(SapphireFileMetaData *)fileMeta 426 { 427 SapphirePosterChooser *controller = [[SapphirePosterChooser alloc] initWithScene:[self scene]]; 428 429 [controller setListTitle:BRLocalizedString(@"Select cover art", @"Select cover art")]; 430 [controller setMovieTitle:@" "]; 431 [controller setFile:fileMeta]; 432 [controller setPosterImages:[NSImage imagesFromMovie:[fileMeta path] forArraySize:10]]; 433 434 NSInvocation *invoke = [NSInvocation invocationWithMethodSignature: [self methodSignatureForSelector:@selector(loadArtwork:)]]; 435 [invoke setSelector:@selector(loadArtwork:)]; 436 [invoke setTarget: self]; 437 [invoke setArgument:&fileMeta atIndex:2]; 438 [controller setRefreshInvokation:invoke]; 439 440 return [controller autorelease]; 441 } 442 443 - (BRLayerController *)doJoin:(SapphireWaitDisplay *)wait 387 444 { 388 445 @try { … … 704 761 replaceController = [confirm autorelease]; 705 762 } 763 break; 764 case COMMAND_CHANGE_ARTWORK: 765 replaceController = [self loadArtwork:fileMeta]; 766 break; 706 767 } 707 768 } -
branches/CoreData/SapphireFrappliance/Extension/NSFileManager-Extensions.h
r557 r827 72 72 - (BOOL)acceptFilePath:(NSString *)path; 73 73 74 /*! 75 * @brief Returns the cover art path for a TV show & season 76 * 77 * @param[in] show TV Show name 78 * @param[in] seasonNum Season number 79 * 80 * @return cover art path 81 */ 82 + (NSString *)previewArtPathForTV:(NSString *)show season:(unsigned int)seasonNum; 74 83 @end -
branches/CoreData/SapphireFrappliance/Extension/NSFileManager-Extensions.m
r614 r827 20 20 21 21 #import "NSFileManager-Extensions.h" 22 #import "SapphireMetaDataSupport.h" 22 23 23 24 @implementation NSFileManager (SapphireExtensions) … … 123 124 } 124 125 126 + (NSString *)previewArtPathForTV:(NSString *)show season:(unsigned int)seasonNum 127 { 128 return [NSString stringWithFormat:@"%@/@TV/%@/%@", [SapphireMetaDataSupport collectionArtPath], 129 show, 130 [NSString stringWithFormat:@"Season %d", seasonNum]]; 131 } 125 132 @end -
branches/CoreData/SapphireFrappliance/MetaDataImporting/SapphirePosterChooser.h
r696 r827 42 42 BRBlurryImageLayer *defaultImage; /*!< @brief The image to use when the poster isn't loaded yet*/ 43 43 SapphireFileMetaData *meta; /*!< @brief The file's meta*/ 44 NSInvocation *refreshInvoke; /*!< @brief Should the chooser allow a refresh of the available cover art*/ 44 45 } 46 47 /*! 48 * @brief Sets the invokation to refresh 49 * 50 * @param[in] invoke The invokation to refresh 51 */ 52 - (void)setRefreshInvokation: (NSInvocation *)invoke; 45 53 46 54 /*! … … 61 69 * @brief Sets the posters to choose from 62 70 * 63 * @param posterList The list of movies to choose from 71 * @param posterList The list of movies to choose from specified as paths 64 72 */ 65 73 - (void)setPosters:(NSArray *)posterList; 74 75 /*! 76 * @brief Sets the posters to choose from 77 * 78 * @param posterList The cover art to choose from specified as image objects 79 */ 80 - (void)setPosterImages:(NSArray *)posterList; 66 81 67 82 /*! -
branches/CoreData/SapphireFrappliance/MetaDataImporting/SapphirePosterChooser.m
r744 r827 25 25 #import "SapphireMedia.h" 26 26 #import "SapphireMetaData.h" 27 #import "SapphireWaitDisplay.h" 27 28 #import "SapphireDirectoryMetaData.h" 28 29 #import <SapphireCompatClasses/SapphireFrontRowCompat.h> 29 30 #import "SapphireApplianceController.h" 31 32 #import "NSImage-Extensions.h" 30 33 31 34 NSData *CreateBitmapDataFromImage(CGImageRef image, unsigned int width, unsigned int height); … … 94 97 } 95 98 99 - (void)setRefreshInvokation: (NSInvocation *)invoke; 100 { 101 [refreshInvoke release]; 102 refreshInvoke = [invoke retain]; 103 } 104 96 105 - (void) resetLayout 97 106 { … … 147 156 } 148 157 158 - (BRLayerController *)doRefresh 159 { 160 [refreshInvoke invoke]; 161 BRLayerController *ret = nil; 162 [refreshInvoke getReturnValue:&ret]; 163 return ret; 164 } 165 149 166 - (void) itemSelected: (long) row 150 167 { 151 168 /*User made a selection*/ 152 // if(selection==0) 153 // { 154 /*User requested a menu refresh*/ 155 // [self resetLayout]; 156 // } 157 // else 158 // { 159 selectedPoster = row; 160 [[self stack] popController]; 161 // } 169 if ( refreshInvoke != nil && row == [posters count] ) 170 { 171 NSInvocation *invoke = [NSInvocation invocationWithMethodSignature: [self methodSignatureForSelector: @selector(doRefresh)]]; 172 [invoke setSelector: @selector(doRefresh)]; 173 [invoke setTarget: self]; 174 175 SapphireWaitDisplay *wait = [[SapphireWaitDisplay alloc] initWithScene: [self scene] 176 title: BRLocalizedString(@"Getting artwork selection", @"Getting artwork selection") 177 invokation: invoke]; 178 [[self stack] swapController:wait]; 179 } 180 else 181 { 182 selectedPoster = row; 183 if ( [[posters objectAtIndex:selectedPoster] isKindOfClass:[NSImage class]] ) 184 [[posters objectAtIndex:row] writeToFile:[meta coverArtPath] atomically:YES]; 185 [[self stack] popController]; 186 } 162 187 } 163 188 … … 186 211 [posterMarch setIconSource: self]; 187 212 [[self list] setDatasource:self]; 213 } 214 215 - (void)setPosterImages:(NSArray *)posterList 216 { 217 posters = [posterList retain]; 218 219 [posterMarch release]; 220 posterMarch = nil; 221 222 [[self list] setDatasource: self]; 188 223 } 189 224 … … 234 269 235 270 NSRect master = [SapphireFrontRowCompat frameOfController:self]; 236 [fileInfoText setMaximumSize:NSMakeSize(master.size.width * 2.0f/3.0f, master.size.height * 0.4f)]; 237 NSSize txtSize = [fileInfoText renderedSize]; 271 NSSize txtSize = [SapphireFrontRowCompat textControl:fileInfoText renderedSizeWithMaxSize:NSMakeSize(master.size.width * 2.0f/3.0f, master.size.height * 0.4f)]; 238 272 NSRect frame; 239 273 frame.origin.x = (master.size.width - txtSize.width) * 0.5f; … … 274 308 - (long) itemCount 275 309 { 310 if ( refreshInvoke != nil ) 311 return [posters count] + 1; 312 276 313 return [posters count]; 277 314 } … … 281 318 { 282 319 BRAdornedMenuItemLayer *result = [SapphireFrontRowCompat textMenuItemForScene:[self scene] folder:NO]; 283 // if(row==0)284 // [SapphireFrontRowCompat setTitle:BRLocalizedString(@"< Refresh Posters >", @"Reload posterimages") forMenu:result];285 //else286 [SapphireFrontRowCompat setTitle:[NSString stringWithFormat:@"Version %2d",row+1] forMenu:result];320 if ( refreshInvoke != nil && row == [posters count] ) 321 [SapphireFrontRowCompat setTitle:BRLocalizedString(@"Refresh", @"Reload images") forMenu:result]; 322 else 323 [SapphireFrontRowCompat setTitle:[NSString stringWithFormat:@"Version %2d",row+1] forMenu:result]; 287 324 return result; 288 325 } … … 292 329 if(row > [posters count]) 293 330 return nil; 294 else 295 return [NSString stringWithFormat:@"Version %2d",row+1]; 331 332 if (refreshInvoke != nil && row == [posters count]) 333 return BRLocalizedString(@"Refresh", @"Reload images"); 334 335 return [NSString stringWithFormat:@"Version %2d",row+1]; 296 336 } 297 337 … … 438 478 if(posterMarch != nil) 439 479 return nil; 480 440 481 SapphireMediaPreview *preview = [[SapphireMediaPreview alloc] initWithScene:[self scene]]; 441 SapphireMedia *asset = [[SapphireMedia alloc] initWithMediaURL:[NSURL fileURLWithPath:@"none"]];442 NSString *poster = [posters objectAtIndex:row];443 NSString *posterDest=[NSString stringWithFormat:@"%@/%@",444 [applicationSupportDir() stringByAppendingPathComponent:@"Poster_Buffer"],445 [poster lastPathComponent]];446 [preview setShowsMetadataImmediately:NO];447 SapphireDirectoryMetaData *parent = [meta parent];448 [preview setMetaData:meta inMetaData:parent];449 482 [preview setShowsMetadataImmediately:YES]; 450 [asset setImagePath:posterDest]; 451 [preview setAsset:asset]; 452 [asset release]; 453 483 484 if ( row < [posters count] ) 485 { 486 [preview setMetaData:meta inMetaData:[meta parent]]; 487 488 SapphireMedia *asset = [[SapphireMedia alloc] initWithMediaURL:[NSURL fileURLWithPath:@"none"]]; 489 id poster = [posters objectAtIndex:row]; 490 491 if ( [poster isKindOfClass:[NSString class]] ) 492 { 493 NSString *posterDest = [NSString stringWithFormat:@"%@/%@", [applicationSupportDir() stringByAppendingPathComponent:@"Poster_Buffer"], 494 [poster lastPathComponent]]; 495 [asset setImagePath: posterDest]; 496 } 497 else 498 { 499 [asset setImage: poster]; 500 } 501 502 [preview setAsset:asset]; 503 [asset release]; 504 } 505 else if ( row == [posters count] ) 506 { 507 NSMutableDictionary *refreshMeta = [[NSMutableDictionary alloc] init]; 508 [refreshMeta setObject: BRLocalizedString( @"Refresh the artwork selection", @"Refresh the artwork selection" ) forKey: META_TITLE_KEY]; 509 [preview setUtilityData: refreshMeta]; 510 } 511 454 512 return [preview autorelease]; 455 513 } -
branches/CoreData/SapphireFrappliance/MetaDataImporting/SapphireTVShowImporter.m
r795 r827 29 29 #import "SapphireEpisode.h" 30 30 #import "SapphireSettings.h" 31 #import "NSImage-Extensions.h" 32 31 33 32 34 /* TVRage XPATHS */ … … 631 633 632 634 /* Lets process the cover art directory structure */ 633 NSString * previewArtPath=[NSString stringWithFormat:@"%@/@TV/%@/%@", 634 [SapphireMetaDataSupport collectionArtPath], 635 [info objectForKey:META_SHOW_NAME_KEY], 636 [NSString stringWithFormat:@"Season %d",[[info objectForKey:META_SEASON_NUMBER_KEY] intValue]]]; 635 NSString * previewArtPath = [NSFileManager previewArtPathForTV:[info objectForKey:META_SHOW_NAME_KEY] season:[[info objectForKey:META_SEASON_NUMBER_KEY] intValue]]; 637 636 638 637 [[NSFileManager defaultManager] constructPath:previewArtPath]; … … 656 655 [myDelegate release]; 657 656 } 657 else if(!imageExists) 658 { 659 //QTMovie is broken on ATV, don't fetch images there 660 if ([SapphireFrontRowCompat usingFrontRow] && ![SapphireFrontRowCompat usingTakeTwo] && [metaData fileContainerType] == FILE_CONTAINER_TYPE_QT_MOVIE) 661 { 662 // NSImage-Extensions 663 [[NSImage imageFromMovie:path] writeToFile:imageDestination atomically:YES]; 664 } 665 } 658 666 659 667 /*Import the info*/ -
branches/CoreData/SapphireFrappliance/MetaDataImporting/SapphireXMLFileDataImporter.m
r804 r827 23 23 #import "SapphireMediaPreview.h" 24 24 #import "SapphireXMLData.h" 25 #import "NSImage-Extensions.h" 25 26 #include <sys/types.h> 26 27 #include <sys/stat.h> … … 46 47 #define SEARCH_EPISODE_XML_QUERY @"/media/searchEpisode/text()" 47 48 #define SEARCH_IMDB_XML_QUERY @"/media/searchIMDB/text()" 49 #define SCREENCAP_XML_QUERY @"/media/imageTime/text()" 50 48 51 //Multi Attributes 49 52 #define TITLE_XML_QUERY @"/media/title/text()" … … 177 180 } 178 181 /*Special cases*/ 182 /* Screen Cap */ 183 NSArray *imageCaps = [root objectsForXQuery:SCREENCAP_XML_QUERY error:&error]; 184 if ( [imageCaps count] && [metaData fileContainerType] == FILE_CONTAINER_TYPE_QT_MOVIE ) 185 { 186 unsigned int hour; 187 unsigned int minute; 188 unsigned int second; 189 190 sscanf( [[[imageCaps objectAtIndex:0] stringValue] cString], "%u:%u:%u", &hour, &minute, &second ); 191 NSData * image = [NSImage imageFromMovie: [metaData path] atTime: ((60*60*hour) + (60*minute) + second)]; 192 [image writeToFile:[metaData coverArtPath] atomically:YES]; 193 } 194 179 195 /*The air date*/ 180 196 NSString *value = [newMetaData objectForKey:META_SHOW_AIR_DATE]; -
branches/CoreData/SapphireFrappliance/Players/SapphireMedia.h
r696 r827 28 28 unsigned int resumeTime; /*!< @brief The resume time to use, 0 to use super*/ 29 29 NSString *imagePath; /*!< @brief The cover art path to use, nil to use super*/ 30 NSImage *coverart; /*!< @brief The cover art as image data */ 30 31 } 31 32 … … 52 53 - (void)setImagePath:(NSString *)path; 53 54 55 /*! 56 * @brief Sets the image for cover art so it can be displayed 57 * 58 * param[in] image The cover art as an NSImage object 59 */ 60 - (void)setImage:(NSImage *)image; 61 54 62 @end -
branches/CoreData/SapphireFrappliance/Players/SapphireMedia.m
r696 r827 20 20 21 21 #import "SapphireMedia.h" 22 #import "NSImage-Extensions.h" 22 23 #import <SapphireCompatClasses/SapphireFrontRowCompat.h> 23 24 … … 40 41 { 41 42 [imagePath release]; 43 [coverart release]; 42 44 [super dealloc]; 43 45 } … … 64 66 } 65 67 68 - (void)setImage:(NSImage *)image 69 { 70 [coverart release]; 71 coverart = [image retain]; 72 } 73 66 74 - (id)mediaType 67 75 { … … 79 87 - (id)coverArt 80 88 { 81 return [SapphireFrontRowCompat imageAtPath:imagePath]; 89 if (imagePath) 90 return [SapphireFrontRowCompat imageAtPath:imagePath]; 91 92 if (coverart) 93 return [SapphireFrontRowCompat coverartAsImage:[coverart asImageRef]]; 94 95 return nil; 82 96 } 83 97 -
branches/CoreData/SapphireFrappliance/Sapphire.xcodeproj/project.pbxproj
r772 r827 54 54 38FAFC320C012A7800853CFE /* SapphireAppliance.m in Sources */ = {isa = PBXBuildFile; fileRef = 38FAFC2F0C012A7800853CFE /* SapphireAppliance.m */; }; 55 55 38FAFC330C012A7800853CFE /* SapphireBrowser.m in Sources */ = {isa = PBXBuildFile; fileRef = 38FAFC310C012A7800853CFE /* SapphireBrowser.m */; }; 56 805420AA0F94FA7E002D2DBF /* NSImage-Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 805420A90F94FA7E002D2DBF /* NSImage-Extensions.m */; }; 56 57 8D5B49B0048680CD000E48DA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C167DFE841241C02AAC07 /* InfoPlist.strings */; }; 57 58 F500400B0D1998B4003FEA08 /* SapphireLeopardOnly.h in Headers */ = {isa = PBXBuildFile; fileRef = F50040090D1998B4003FEA08 /* SapphireLeopardOnly.h */; }; … … 358 359 38FAFC300C012A7800853CFE /* SapphireAppliance.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SapphireAppliance.h; sourceTree = "<group>"; }; 359 360 38FAFC310C012A7800853CFE /* SapphireBrowser.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = SapphireBrowser.m; sourceTree = "<group>"; }; 361 805420A80F94FA7E002D2DBF /* NSImage-Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSImage-Extensions.h"; sourceTree = "<group>"; }; 362 805420A90F94FA7E002D2DBF /* NSImage-Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSImage-Extensions.m"; sourceTree = "<group>"; }; 360 363 8D5B49B6048680CD000E48DA /* Sapphire.frappliance */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Sapphire.frappliance; sourceTree = BUILT_PRODUCTS_DIR; }; 361 364 8D5B49B7048680CD000E48DA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; … … 820 823 FE076E3E0D0CCAA40053FF1A /* NSFileManager-Extensions.h */, 821 824 FE076E3F0D0CCAA40053FF1A /* NSFileManager-Extensions.m */, 825 805420A80F94FA7E002D2DBF /* NSImage-Extensions.h */, 826 805420A90F94FA7E002D2DBF /* NSImage-Extensions.m */, 822 827 F571B7AC0E9C360500B7FD9D /* NSManagedObject-Extensions.h */, 823 828 F571B7AD0E9C360500B7FD9D /* NSManagedObject-Extensions.m */, … … 1354 1359 F52E4E2F0F4397D700AC6C52 /* SapphireWaitDisplay.m in Sources */, 1355 1360 F52E4EAA0F43B53F00AC6C52 /* SapphireConfirmPrompt.m in Sources */, 1361 805420AA0F94FA7E002D2DBF /* NSImage-Extensions.m in Sources */, 1356 1362 ); 1357 1363 runOnlyForDeploymentPostprocessing = 0;
