Changeset 2

Show
Ignore:
Timestamp:
06/22/07 16:29:28 (2 years ago)
Author:
gbooker
Message:

Tracking metadata information.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/SapphireApplianceController.h

    r1 r2  
    1515@interface SapphireApplianceController : BRMediaMenuController 
    1616{ 
    17         NSString *_dir; 
    18         NSMutableArray * _names ; 
     17        NSString                       *_dir; 
     18        NSMutableArray         * _names ; 
    1919 
     20        NSMutableDictionary     *_metaData; 
     21        NSMutableDictionary     *_metaFiles; 
     22        NSMutableDictionary     *_metaDirs; 
    2023} 
    2124 
     
    2427 
    2528- (id) initWithScene: (BRRenderScene *) scene; 
    26 - (id) initWithScene: (BRRenderScene *) scene directory: (NSString *)dir
     29- (id) initWithScene: (BRRenderScene *) scene directory: (NSString *) dir metaData: (NSMutableDictionary *)meta
    2730- (void) dealloc; 
    2831- (BOOL)isDirectory:(NSString *)path; 
  • trunk/SapphireApplianceController.m

    r1 r2  
    1010#import <BackRow/BackRow.h> 
    1111 
     12#define FILES_KEY @"Files" 
     13#define DIRS_KEY @"Dirs" 
     14 
     15#define MODIFIED_KEY @"Modified" 
     16 
    1217@implementation NSString (episodeSorting) 
    1318 
     
    2025@end 
    2126 
     27@interface SapphireApplianceController (private) 
     28- (BOOL)pruneMetaDataWithFiles:(NSArray *)files andDirectories:(NSArray *)dirs; 
     29- (BOOL)updateMetaDataWithFiles:(NSArray *)files andDirectories:(NSArray *)dirs; 
     30@end 
     31 
    2232@implementation SapphireApplianceController 
    2333 
    2434// Static set of file extensions to filter 
    2535static NSArray *extensions = nil; 
     36static NSString *metaPath = nil; 
     37static NSMutableDictionary *mainMetaDictionary = nil; 
    2638 
    2739+(void)load 
    2840{ 
    2941        extensions = [[NSArray alloc] initWithObjects:@"avi", @"mov", @"mpg", @"wmv", nil]; 
     42        metaPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/Sapphire/metaData.plist"] retain]; 
     43        mainMetaDictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:metaPath]; 
     44        if(mainMetaDictionary == nil) 
     45        { 
     46                mainMetaDictionary = [[NSMutableDictionary alloc] init]; 
     47        } 
    3048} 
    3149 
     
    3351{ 
    3452        return (@"net.pmerrill.recursivemenu.root" ); 
     53} 
     54 
     55static void makeParentDir(NSFileManager *manager, NSString *dir) 
     56{ 
     57        NSString *parent = [dir stringByDeletingLastPathComponent]; 
     58         
     59        BOOL isDir; 
     60        if(![manager fileExistsAtPath:parent isDirectory:&isDir]) 
     61                makeParentDir(manager, parent); 
     62        else if(!isDir) 
     63                //Can't work with this 
     64                return; 
     65         
     66        [manager createDirectoryAtPath:dir attributes:nil]; 
     67} 
     68 
     69+ (void)writeMetaData 
     70{ 
     71        makeParentDir([NSFileManager defaultManager], [metaPath stringByDeletingLastPathComponent]); 
     72        [mainMetaDictionary writeToFile:metaPath atomically:YES]; 
    3573} 
    3674 
     
    4684    return ( self ); 
    4785*/ 
    48         return ( [self initWithScene: scene directory:[NSHomeDirectory() stringByAppendingPathComponent:@"Movies"]] ); 
    49         [[NSFileManager defaultManager] subpathsAtPath:[NSHomeDirectory() stringByAppendingPathComponent:@"Movies"]]; 
    50 
    51  
    52 - (id) initWithScene: (BRRenderScene *) scene directory:(NSString *)dir 
    53 
     86        return ( [self initWithScene: scene directory:[NSHomeDirectory() stringByAppendingPathComponent:@"Movies"] metaData:mainMetaDictionary] ); 
     87
     88 
     89- (id) initWithScene: (BRRenderScene *) scene directory: (NSString *) dir metaData: (NSMutableDictionary *)meta; 
     90
     91        BOOL modifiedMeta = NO; 
    5492        if ( [super initWithScene: scene] == nil ) return ( nil ); 
    5593        _dir = [dir retain]; 
    5694                 
    5795        _names = [NSMutableArray new]; 
     96        _metaData = [meta retain]; 
     97        _metaFiles = [meta objectForKey:FILES_KEY]; 
     98        if(_metaFiles == nil) 
     99        { 
     100                _metaFiles = [NSMutableDictionary dictionary]; 
     101                [meta setObject:_metaFiles forKey:FILES_KEY]; 
     102                modifiedMeta = YES; 
     103        } 
     104        _metaDirs = [meta objectForKey:DIRS_KEY]; 
     105        if(_metaDirs == nil) 
     106        { 
     107                _metaDirs = [NSMutableDictionary dictionary]; 
     108                [meta setObject:_metaDirs forKey:DIRS_KEY]; 
     109                modifiedMeta = YES; 
     110        } 
    58111         
    59112        NSMutableArray *files = [NSMutableArray array]; 
     
    75128                        [_names addObject:name]; 
    76129        } 
     130        modifiedMeta |= [self pruneMetaDataWithFiles:files andDirectories:_names]; 
     131        modifiedMeta |= [self updateMetaDataWithFiles:files andDirectories:_names]; 
    77132        [_names sortUsingSelector:@selector(episodeCompare:)]; 
    78133        [files sortUsingSelector:@selector(episodeCompare:)]; 
    79134        [_names addObjectsFromArray:files]; 
     135         
     136        if(modifiedMeta) 
     137                [SapphireApplianceController writeMetaData]; 
    80138         
    81139        // set the datasource *after* you've setup your array 
     
    89147    // always remember to deallocate your resources 
    90148        [_dir release]; 
    91         [_names release] ; 
     149        [_names release]; 
     150        [_metaData release]; 
    92151    [super dealloc]; 
    93152} 
     
    98157        BOOL isDir = NO; 
    99158        return [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir] && isDir; 
     159} 
     160 
     161- (BOOL)pruneMetaDataWithFiles:(NSArray *)files andDirectories:(NSArray *)dirs 
     162{ 
     163        BOOL ret = NO; 
     164        NSSet *existingSet = [NSSet setWithArray:files]; 
     165        NSArray *metaArray = [_metaFiles allKeys]; 
     166        NSMutableSet *pruneSet = [NSMutableSet setWithArray:metaArray]; 
     167 
     168        [pruneSet minusSet:existingSet]; 
     169        if([pruneSet anyObject] != nil) 
     170        { 
     171                NSEnumerator *pruneEnum = [pruneSet objectEnumerator]; 
     172                NSString *pruneKey = nil; 
     173                while((pruneKey = [pruneEnum nextObject]) != nil) 
     174                        [_metaFiles removeObjectForKey:pruneKey]; 
     175                ret = YES;               
     176        } 
     177         
     178        existingSet = [NSSet setWithArray:dirs]; 
     179        metaArray = [_metaDirs allKeys]; 
     180        pruneSet = [NSMutableSet setWithArray:metaArray]; 
     181         
     182        [pruneSet minusSet:existingSet]; 
     183        if([pruneSet anyObject] != nil) 
     184        { 
     185                NSEnumerator *pruneEnum = [pruneSet objectEnumerator]; 
     186                NSString *pruneKey = nil; 
     187                while((pruneKey = [pruneEnum nextObject]) != nil) 
     188                        [_metaDirs removeObjectForKey:pruneKey]; 
     189                ret = YES; 
     190        } 
     191         
     192        return ret; 
     193} 
     194 
     195- (BOOL)updateMetaDataWithFiles:(NSArray *)files andDirectories:(NSArray *)dirs 
     196{ 
     197        BOOL ret = NO; 
     198        NSArray *metaArray = [_metaDirs allKeys]; 
     199        NSSet *metaSet = [NSSet setWithArray:metaArray]; 
     200        NSMutableSet *newSet = [NSMutableSet setWithArray:dirs]; 
     201         
     202        [newSet minusSet:metaSet]; 
     203        if([newSet anyObject] != nil) 
     204        { 
     205                NSEnumerator *newEnum = [newSet objectEnumerator]; 
     206                NSString *newKey = nil; 
     207                while((newKey = [newEnum nextObject]) != nil) 
     208                        [_metaDirs setObject:[NSMutableDictionary dictionary] forKey:newKey]; 
     209                ret = YES; 
     210        } 
     211 
     212        NSEnumerator *fileEnum = [files objectEnumerator]; 
     213        NSString *fileName = nil; 
     214        NSMutableArray *newFiles = [NSMutableArray array]; 
     215        while((fileName = [fileEnum nextObject]) != nil) 
     216        { 
     217                NSDictionary *fileMeta = [_metaFiles objectForKey:fileName]; 
     218                if(fileMeta == nil) 
     219                        [newFiles addObject:fileName]; 
     220                else 
     221                { 
     222                        NSString *path = [_dir stringByAppendingPathComponent:fileName]; 
     223                        NSDictionary *props = [[NSFileManager defaultManager] fileAttributesAtPath:path traverseLink:YES]; 
     224                        NSDate *modDate = [props objectForKey:NSFileModificationDate]; 
     225                        if([[fileMeta objectForKey:MODIFIED_KEY] intValue] != [modDate timeIntervalSince1970]) 
     226                                [newFiles addObject:fileName]; 
     227                } 
     228        } 
     229        //Do something in a thread to process newFiles 
     230         
     231        return ret; 
    100232} 
    101233 
     
    229361        if([self isDirectory:[_dir stringByAppendingPathComponent:name]]) 
    230362        { 
    231                 id controller = [[SapphireApplianceController alloc] initWithScene:[self scene] directory:[_dir stringByAppendingPathComponent:name]]; 
     363                id controller = [[SapphireApplianceController alloc] initWithScene:[self scene] directory:[_dir stringByAppendingPathComponent:name] metaData:[_metaDirs objectForKey:name]]; 
    232364                [[self stack] pushController:controller]; 
    233365                [controller release];