Changeset 827

Show
Ignore:
Timestamp:
04/26/2009 05:24:48 PM (3 years ago)
Author:
gbooker
Message:

Added screen capture ability thanks to patch by wazza. Does not work on ATV since ATV is broken.
Fixes #45

Location:
branches/CoreData/SapphireFrappliance
Files:
2 added
10 modified

Legend:

Unmodified
Added
Removed
  • branches/CoreData/SapphireFrappliance/Browser/SapphireMarkMenu.m

    r818 r827  
    3333#import "SapphireConfirmPrompt.h" 
    3434#import "SapphireApplianceController.h" 
     35#import "SapphirePosterChooser.h" 
     36#import "NSImage-Extensions.h" 
     37#import "NSFileManager-Extensions.h" 
     38 
     39BOOL 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} 
    3548 
    3649@implementation SapphireMarkMenu 
     
    5164        COMMAND_CUT_PATH, 
    5265        COMMAND_DELETE_PATH, 
     66        COMMAND_CHANGE_ARTWORK, 
    5367        //File Only Commands 
    5468        COMMAND_MARK_TO_JOIN, 
     
    365379                                [NSNumber numberWithInt:COMMAND_DELETE_PATH], MARK_COMMAND, 
    366380                                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                } 
    367392        } 
    368393        else 
     
    384409} 
    385410 
    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 
    387444{ 
    388445        @try { 
     
    704761                                replaceController = [confirm autorelease]; 
    705762                        } 
     763                                break; 
     764                        case COMMAND_CHANGE_ARTWORK: 
     765                                replaceController = [self loadArtwork:fileMeta]; 
     766                                break; 
    706767                } 
    707768        } 
  • branches/CoreData/SapphireFrappliance/Extension/NSFileManager-Extensions.h

    r557 r827  
    7272- (BOOL)acceptFilePath:(NSString *)path; 
    7373 
     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; 
    7483@end 
  • branches/CoreData/SapphireFrappliance/Extension/NSFileManager-Extensions.m

    r614 r827  
    2020 
    2121#import "NSFileManager-Extensions.h" 
     22#import "SapphireMetaDataSupport.h" 
    2223 
    2324@implementation NSFileManager (SapphireExtensions) 
     
    123124} 
    124125 
     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} 
    125132@end 
  • branches/CoreData/SapphireFrappliance/MetaDataImporting/SapphirePosterChooser.h

    r696 r827  
    4242        BRBlurryImageLayer              *defaultImage;  /*!< @brief The image to use when the poster isn't loaded yet*/ 
    4343        SapphireFileMetaData    *meta;                  /*!< @brief The file's meta*/ 
     44        NSInvocation                    *refreshInvoke; /*!< @brief Should the chooser allow a refresh of the available cover art*/ 
    4445} 
     46 
     47/*! 
     48 * @brief Sets the invokation to refresh 
     49 * 
     50 * @param[in] invoke The invokation to refresh 
     51 */ 
     52- (void)setRefreshInvokation: (NSInvocation *)invoke; 
    4553 
    4654/*! 
     
    6169 * @brief Sets the posters to choose from 
    6270 * 
    63  * @param posterList The list of movies to choose from 
     71 * @param posterList The list of movies to choose from specified as paths 
    6472 */ 
    6573- (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; 
    6681 
    6782/*! 
  • branches/CoreData/SapphireFrappliance/MetaDataImporting/SapphirePosterChooser.m

    r744 r827  
    2525#import "SapphireMedia.h" 
    2626#import "SapphireMetaData.h" 
     27#import "SapphireWaitDisplay.h" 
    2728#import "SapphireDirectoryMetaData.h" 
    2829#import <SapphireCompatClasses/SapphireFrontRowCompat.h> 
    2930#import "SapphireApplianceController.h" 
     31 
     32#import "NSImage-Extensions.h" 
    3033 
    3134NSData *CreateBitmapDataFromImage(CGImageRef image, unsigned int width, unsigned int height); 
     
    9497} 
    9598 
     99- (void)setRefreshInvokation: (NSInvocation *)invoke; 
     100{ 
     101        [refreshInvoke release]; 
     102        refreshInvoke = [invoke retain]; 
     103} 
     104 
    96105- (void) resetLayout 
    97106{ 
     
    147156} 
    148157 
     158- (BRLayerController *)doRefresh 
     159{ 
     160        [refreshInvoke invoke]; 
     161        BRLayerController *ret = nil; 
     162        [refreshInvoke getReturnValue:&ret]; 
     163        return ret; 
     164} 
     165 
    149166- (void) itemSelected: (long) row 
    150167{ 
    151168        /*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        } 
    162187} 
    163188 
     
    186211    [posterMarch setIconSource: self]; 
    187212        [[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]; 
    188223} 
    189224 
     
    234269         
    235270        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)]; 
    238272        NSRect frame; 
    239273        frame.origin.x = (master.size.width - txtSize.width) * 0.5f; 
     
    274308- (long) itemCount 
    275309{ 
     310        if ( refreshInvoke != nil )  
     311                return [posters count] + 1; 
     312         
    276313        return [posters count]; 
    277314} 
     
    281318{ 
    282319        BRAdornedMenuItemLayer *result = [SapphireFrontRowCompat textMenuItemForScene:[self scene] folder:NO]; 
    283         //      if(row==0) 
    284         //              [SapphireFrontRowCompat setTitle:BRLocalizedString(@"< Refresh Posters >", @"Reload poster images") forMenu:result]; 
    285         //      else 
    286         [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]; 
    287324        return result; 
    288325} 
     
    292329        if(row > [posters count]) 
    293330                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]; 
    296336} 
    297337 
     
    438478        if(posterMarch != nil) 
    439479                return nil; 
     480 
    440481        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]; 
    449482        [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 
    454512        return [preview autorelease]; 
    455513} 
  • branches/CoreData/SapphireFrappliance/MetaDataImporting/SapphireTVShowImporter.m

    r795 r827  
    2929#import "SapphireEpisode.h" 
    3030#import "SapphireSettings.h" 
     31#import "NSImage-Extensions.h" 
     32 
    3133 
    3234/* TVRage XPATHS  */ 
     
    631633                 
    632634        /* 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]]; 
    637636                                                 
    638637        [[NSFileManager defaultManager] constructPath:previewArtPath]; 
     
    656655                [myDelegate release]; 
    657656        } 
     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        } 
    658666         
    659667        /*Import the info*/ 
  • branches/CoreData/SapphireFrappliance/MetaDataImporting/SapphireXMLFileDataImporter.m

    r804 r827  
    2323#import "SapphireMediaPreview.h" 
    2424#import "SapphireXMLData.h" 
     25#import "NSImage-Extensions.h" 
    2526#include <sys/types.h> 
    2627#include <sys/stat.h> 
     
    4647#define SEARCH_EPISODE_XML_QUERY        @"/media/searchEpisode/text()" 
    4748#define SEARCH_IMDB_XML_QUERY           @"/media/searchIMDB/text()" 
     49#define SCREENCAP_XML_QUERY                     @"/media/imageTime/text()" 
     50 
    4851//Multi Attributes               
    4952#define TITLE_XML_QUERY                         @"/media/title/text()" 
     
    177180        } 
    178181        /*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 
    179195        /*The air date*/ 
    180196        NSString *value = [newMetaData objectForKey:META_SHOW_AIR_DATE]; 
  • branches/CoreData/SapphireFrappliance/Players/SapphireMedia.h

    r696 r827  
    2828        unsigned int            resumeTime;             /*!< @brief The resume time to use, 0 to use super*/ 
    2929        NSString                        *imagePath;             /*!< @brief The cover art path to use, nil to use super*/ 
     30        NSImage                         *coverart;              /*!< @brief The cover art as image data */ 
    3031} 
    3132 
     
    5253- (void)setImagePath:(NSString *)path; 
    5354 
     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 
    5462@end 
  • branches/CoreData/SapphireFrappliance/Players/SapphireMedia.m

    r696 r827  
    2020 
    2121#import "SapphireMedia.h" 
     22#import "NSImage-Extensions.h" 
    2223#import <SapphireCompatClasses/SapphireFrontRowCompat.h> 
    2324 
     
    4041{ 
    4142        [imagePath release]; 
     43        [coverart release]; 
    4244        [super dealloc]; 
    4345} 
     
    6466} 
    6567 
     68- (void)setImage:(NSImage *)image 
     69{ 
     70        [coverart release]; 
     71        coverart = [image retain]; 
     72} 
     73 
    6674- (id)mediaType 
    6775{ 
     
    7987- (id)coverArt 
    8088{ 
    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; 
    8296} 
    8397 
  • branches/CoreData/SapphireFrappliance/Sapphire.xcodeproj/project.pbxproj

    r772 r827  
    5454                38FAFC320C012A7800853CFE /* SapphireAppliance.m in Sources */ = {isa = PBXBuildFile; fileRef = 38FAFC2F0C012A7800853CFE /* SapphireAppliance.m */; }; 
    5555                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 */; }; 
    5657                8D5B49B0048680CD000E48DA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C167DFE841241C02AAC07 /* InfoPlist.strings */; }; 
    5758                F500400B0D1998B4003FEA08 /* SapphireLeopardOnly.h in Headers */ = {isa = PBXBuildFile; fileRef = F50040090D1998B4003FEA08 /* SapphireLeopardOnly.h */; }; 
     
    358359                38FAFC300C012A7800853CFE /* SapphireAppliance.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SapphireAppliance.h; sourceTree = "<group>"; }; 
    359360                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>"; }; 
    360363                8D5B49B6048680CD000E48DA /* Sapphire.frappliance */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Sapphire.frappliance; sourceTree = BUILT_PRODUCTS_DIR; }; 
    361364                8D5B49B7048680CD000E48DA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 
     
    820823                                FE076E3E0D0CCAA40053FF1A /* NSFileManager-Extensions.h */, 
    821824                                FE076E3F0D0CCAA40053FF1A /* NSFileManager-Extensions.m */, 
     825                                805420A80F94FA7E002D2DBF /* NSImage-Extensions.h */, 
     826                                805420A90F94FA7E002D2DBF /* NSImage-Extensions.m */, 
    822827                                F571B7AC0E9C360500B7FD9D /* NSManagedObject-Extensions.h */, 
    823828                                F571B7AD0E9C360500B7FD9D /* NSManagedObject-Extensions.m */, 
     
    13541359                                F52E4E2F0F4397D700AC6C52 /* SapphireWaitDisplay.m in Sources */, 
    13551360                                F52E4EAA0F43B53F00AC6C52 /* SapphireConfirmPrompt.m in Sources */, 
     1361                                805420AA0F94FA7E002D2DBF /* NSImage-Extensions.m in Sources */, 
    13561362                        ); 
    13571363                        runOnlyForDeploymentPostprocessing = 0;