Commit a6094d46 authored by Pierre's avatar Pierre

Fix build.

parent 79d98e2c
......@@ -5,12 +5,15 @@
// Created by Pierre d'Herbemont on 7/14/10.
// Copyright 2010 __MyCompanyName__. All rights reserved.
//
#import <CoreData/CoreData.h>
@interface MLMediaLibrary : NSObject {
NSManagedObjectContext *_managedObjectContext;
NSManagedObjectModel *_managedObjectModel;
}
+ (id)sharedMediaLibrary;
- (void)addFilePaths:(NSArray *)filepaths;
@end
......@@ -7,14 +7,26 @@
//
#import "MLMediaLibrary.h"
#import "MLTitleDecrapifier.h"
#import "MLMovieInfoGrabber.h"
#import "File.h"
#import "Label.h"
#import "ShowEpisode.h"
#import "Show.h"
@interface MLMediaLibrary ()
- (NSManagedObjectContext *)managedObjectContext;
@end
@implementation MLMediaLibrary
+ (id)sharedMediaLibrary
{
static id sharedMediaLibrary = nil;
if (!sharedMediaLibrary)
if (!sharedMediaLibrary) {
sharedMediaLibrary = [[[self class] alloc] init];
[sharedMediaLibrary startUpdateDB];
}
return sharedMediaLibrary;
}
......@@ -43,19 +55,11 @@
return _managedObjectModel;
}
- (NSString *)applicationSupportFolder
- (NSURL *)databaseFolder
{
NSString *applicationSupportFolder = nil;
FSRef foundRef;
OSErr err = FSFindFolder(kUserDomain, kApplicationSupportFolderType, kDontCreateFolder, &foundRef);
VLCAssert(err == noErr, @"Can't find application support folder");
unsigned char path[1024];
FSRefMakePath(&foundRef, path, sizeof(path));
applicationSupportFolder = [NSString stringWithUTF8String:(char *)path];
applicationSupportFolder = [applicationSupportFolder stringByAppendingPathComponent:@"org.videolan.Lunettes"];
return applicationSupportFolder;
// FIXME
return [NSURL fileURLWithPath:[@"~/Library" stringByExpandingTildeInPath]];
;
}
- (NSManagedObjectContext *)managedObjectContext
......@@ -63,12 +67,9 @@
if (_managedObjectContext)
return _managedObjectContext;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *applicationSupportFolder = [self applicationSupportFolder];
if (![fileManager fileExistsAtPath:applicationSupportFolder isDirectory:NULL])
[fileManager createDirectoryAtPath:applicationSupportFolder withIntermediateDirectories:YES attributes:nil error:nil];
NSString *databaseFolder = [[self databaseFolder] absoluteString];
NSURL *url = [NSURL fileURLWithPath: [applicationSupportFolder stringByAppendingPathComponent: @"MediaLibrary.sqlite"]];
NSURL *url = [NSURL fileURLWithPath:[databaseFolder stringByAppendingPathComponent: @"MediaLibrary.sqlite"]];
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
......@@ -80,6 +81,7 @@
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator: coordinator];
} else {
#if! TARGET_OS_IPHONE
// FIXME: Deal with versioning
NSInteger ret = NSRunAlertPanel(@"Error", @"The Media Library you have on your disk is not compatible with the one Lunettes can read. Do you want to create a new one?", @"No", @"Yes", nil);
if (ret == NSOKButton)
......@@ -87,6 +89,9 @@
[fileManager removeItemAtURL:url error:nil];
NSRunInformationalAlertPanel(@"Relaunch Lunettes now", @"We need to relaunch Lunettes to proceed", @"OK", nil, nil);
[NSApp terminate:nil];
#else
abort();
#endif
}
[coordinator release];
[_managedObjectContext setUndoManager:nil];
......@@ -99,17 +104,17 @@
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(savePendingChanges) object:nil];
[[self managedObjectContext] save:nil];
#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5
#if !TARGET_OS_IPHONE && MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5
NSProcessInfo *process = [NSProcessInfo processInfo];
if ([process respondsToSelector:@selector(enableSuddenTermination)])
[process enableSuddenTermination];
#endif
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(id)context
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"hasChanges"] && object == _managedObjectContext) {
#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5
#if !TARGET_OS_IPHONE && MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5
NSProcessInfo *process = [NSProcessInfo processInfo];
if ([process respondsToSelector:@selector(disableSuddenTermination)])
[process disableSuddenTermination];
......@@ -119,73 +124,9 @@
[self performSelector:@selector(savePendingChanges) withObject:nil afterDelay:1.];
return;
}
if ([context isKindOfClass:[NSValue class]]) {
// Dispatch selector
// This is useful for NSUserDefaults observing.
[self performSelector:[context pointerValue]];
return;
}
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
/**
* Remember a movie that wasn't finished
*/
- (void)media:(VLCMedia *)media hasReadPosition:(double)position
{
VLCAssert(![[NSUserDefaults standardUserDefaults] boolForKey:kDontRememberUnfinishedMovies], @"kDontRememberUnfinishedMovies is here");
File *movie = nil;
// Try to find an entry for that media
// FIXME - cache the result?
NSFetchRequest *request = [self fetchRequestForEntity:@"File"];
[request setFetchLimit:1];
[request setPredicate:[NSPredicate predicateWithFormat:@"url LIKE[c] %@", [media.url description]]];
NSArray *results = [[self managedObjectContext] executeFetchRequest:request error:nil];
if ([results count] > 0)
movie = [results objectAtIndex:0];
// Remove/don't save if we are nearly done or if the length is less 2:30 secs.
if ([[media length] intValue] < 150000)
return;
NSNumber *no = [NSNumber numberWithBool:NO];
NSNumber *yes = [NSNumber numberWithBool:YES];
if (position > 0.95) {
if (movie) {
movie.lastPosition = [NSNumber numberWithInt:0];
movie.unread = no;
movie.currentlyWatching = no;
// Increment the play count
NSUInteger count = [movie.playCount unsignedIntValue];
movie.playCount = [NSNumber numberWithUnsignedInt:count + 1];
}
return;
}
NSNumber *oldposition = movie.lastPosition;
if (oldposition && position < [oldposition doubleValue])
return;
if (!movie) {
movie = [self createObjectForEntity:@"File"];
movie.url = [media.url description];
}
// Yes, this is a negative number. VLCTime nicely display negative time
// with "XX minutes remaining". And we are using this facility.
double remainingTime = [[[media length] numberValue] doubleValue] * (position - 1);
movie.currentlyWatching = yes;
movie.unread = no;
movie.lastPosition = [NSNumber numberWithDouble:position];
movie.remainingTime = [NSNumber numberWithDouble:remainingTime];
}
#pragma mark Media Library: Path Watcher
- (void)addNewLabelWithName:(NSString *)name
......@@ -194,24 +135,6 @@
label.name = name;
}
- (NSManagedObject *)addSDMediaItem:(VLCMedia *)media
{
NSURL *url = [media url];
NSString *title = [[media metaDictionary] objectForKey:VLCMetaInformationTitle];
File *movie = [self createObjectForEntity:@"File"];
movie.url = [url description];
NSNumber *no = [NSNumber numberWithBool:NO];
movie.currentlyWatching = no;
movie.lastPosition = [NSNumber numberWithDouble:0];
movie.remainingTime = [NSNumber numberWithDouble:0];
movie.unread = no;
movie.type = @"sd";
movie.title = title;
return movie;
}
/**
* TV Show Episodes
*/
......@@ -266,8 +189,8 @@
- (void)fetchMetaDataForShow:(Show *)show
{
// First fetch the serverTime, so that we can update each entry.
[VLCTVShowInfoGrabber fetchServerTimeAndExecuteBlock:^(NSNumber *serverDate) {
#if HAVE_BLOCK
[MLTVShowInfoGrabber fetchServerTimeAndExecuteBlock:^(NSNumber *serverDate) {
[[NSUserDefaults standardUserDefaults] setInteger:[serverDate integerValue] forKey:kLastTVDBUpdateServerTime];
......@@ -310,6 +233,9 @@
}];
}];
#else
abort();
#endif
}
- (void)addTVShowEpisodeWithInfo:(NSDictionary *)tvShowEpisodeInfo andFile:(File *)file
......@@ -351,7 +277,7 @@
{
NSNumber *yes = [NSNumber numberWithBool:YES];
NSDictionary *tvShowEpisodeInfo = [VLCTitleDecrapifier tvShowEpisodeInfoFromString:file.title];
NSDictionary *tvShowEpisodeInfo = [MLTitleDecrapifier tvShowEpisodeInfoFromString:file.title];
if (tvShowEpisodeInfo) {
[self addTVShowEpisodeWithInfo:tvShowEpisodeInfo andFile:file];
file.hasFetchedInfo = yes;
......@@ -359,7 +285,8 @@
}
// Go online and fetch info.
VLCMovieInfoGrabber *grabber = [[[VLCMovieInfoGrabber alloc] init] autorelease];
MLMovieInfoGrabber *grabber = [[[MLMovieInfoGrabber alloc] init] autorelease];
#if HAVE_BLOCK
[grabber lookUpForTitle:file.title andExecuteBlock:^(NSError *err){
if (err)
return;
......@@ -374,15 +301,19 @@
}
file.hasFetchedInfo = yes;
}];
#else
abort();
#endif
}
- (void)addMetadataItem:(NSMetadataItem *)result
- (void)addFilePath:(NSString *)filePath
{
NSString *url = [NSURL fileURLWithPath:[result valueForAttribute:@"kMDItemPath"]];
NSString *title = [result valueForAttribute:@"kMDItemDisplayName"];
NSDate *openedDate = [result valueForAttribute:@"kMDItemLastUsedDate"];
NSDate *modifiedDate = [result valueForAttribute:@"kMDItemFSContentChangeDate"];
NSNumber *size = [result valueForAttribute:@"kMDItemFSSize"];
NSString *url = [NSURL fileURLWithPath:filePath];
NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];
NSString *title = [filePath lastPathComponent];
NSDate *openedDate = nil; // FIXME kMDItemLastUsedDate
NSDate *modifiedDate = nil; // FIXME [result valueForAttribute:@"kMDItemFSContentChangeDate"];
NSNumber *size = [attributes objectForKey:NSFileSize]; // FIXME [result valueForAttribute:@"kMDItemFSSize"];
File *file = [self createObjectForEntity:@"File"];
file.url = [url description];
......@@ -402,7 +333,7 @@
file.playCount = [NSNumber numberWithDouble:1];
file.unread = no;
}
file.title = [VLCTitleDecrapifier decrapify:[title stringByDeletingPathExtension]];
file.title = [MLTitleDecrapifier decrapify:[title stringByDeletingPathExtension]];
if ([size longLongValue] < 150000000) /* 150 MB */
file.type = @"clip";
......@@ -412,20 +343,20 @@
[self fetchMetaDataForFile:file];
}
- (void)addMetadataItems:(NSArray *)metaDataItems
- (void)addFilePaths:(NSArray *)filepaths
{
NSUInteger count = [metaDataItems count];
NSUInteger count = [filepaths count];
NSMutableArray *fetchPredicates = [NSMutableArray arrayWithCapacity:count];
NSMutableDictionary *urlToObject = [NSMutableDictionary dictionaryWithCapacity:count];
NSMutableArray *filePathsToAdd = [NSMutableArray arrayWithCapacity:count];
// Prepare a fetch request for all items
for (NSMetadataItem *metaDataItem in metaDataItems) {
NSString *path = [metaDataItem valueForAttribute:@"kMDItemPath"];
for (NSString *path in filepaths) {
NSURL *url = [NSURL fileURLWithPath:path];
NSString *urlDescription = [url description];
[filePathsToAdd addObject:urlDescription];
[fetchPredicates addObject:[NSPredicate predicateWithFormat:@"url == %@", urlDescription]];
[urlToObject setObject:metaDataItem forKey:urlDescription];
[urlToObject setObject:url forKey:urlDescription];
}
NSFetchRequest *request = [self fetchRequestForEntity:@"File"];
......@@ -436,36 +367,16 @@
NSArray *dbResults = [[self managedObjectContext] executeFetchRequest:request error:nil];
NSLog(@"Done");
NSMutableArray *metaDataItemsToAdd = [NSMutableArray arrayWithArray:metaDataItems];
// Remove objects that are already in db.
for (NSManagedObjectContext *dbResult in dbResults) {
NSString *url = [dbResult valueForKey:@"url"];
[metaDataItemsToAdd removeObject:[urlToObject objectForKey:url]];
[filePathsToAdd removeObject:url];
}
// Add only the newly added items
for (NSMetadataItem *metaDataItem in metaDataItemsToAdd) {
[self addMetadataItem:metaDataItem];
}
}
- (void)gotFirstResults:(NSNotification *)notification
{
NSLog(@"Got First results");
NSMetadataQuery *query = [notification object];
NSArray *array = [query results];
[self addMetadataItems:array];
NSLog(@"Adding done");
}
- (void)gotAdditionalResults:(NSNotification *)notification
{
NSLog(@"Got Additional results");
NSMetadataQuery *query = [notification object];
NSArray *array = [query results];
[self addMetadataItems:array];
NSLog(@"Adding done");
for (NSString* path in filePathsToAdd)
[self addFilePath:path];
}
- (void)startUpdateDB
......@@ -485,69 +396,17 @@
for (Show *show in results)
[self fetchMetaDataForShow:show];
#if HAVE_BLOCK
NSInteger lastServerTime = [[NSUserDefaults standardUserDefaults] integerForKey:kLastTVDBUpdateServerTime];
[VLCTVShowInfoGrabber fetchUpdatesSinceServerTime:[NSNumber numberWithInteger:lastServerTime] andExecuteBlock:^(NSArray *updates){
[MLTVShowInfoGrabber fetchUpdatesSinceServerTime:[NSNumber numberWithInteger:lastServerTime] andExecuteBlock:^(NSArray *updates){
NSFetchRequest *request = [self fetchRequestForEntity:@"Show"];
[request setPredicate:[NSComparisonPredicate predicateWithLeftExpression:[NSExpression expressionForKeyPath:@"theTVDBID"] rightExpression:[NSExpression expressionForConstantValue:updates] modifier:NSDirectPredicateModifier type:NSInPredicateOperatorType options:0]];
NSArray *results = [[self managedObjectContext] executeFetchRequest:request error:nil];
for (Show *show in results)
[self fetchMetaDataForShow:show];
}];
#endif
/* Update every hour - FIXME: Preferences key */
[self performSelector:@selector(startUpdateDB) withObject:nil afterDelay:60 * 60];
}
- (void)setupFolderWatch
{
// Watch for modification on User Defaults.
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
static NSValue *value = nil;
if (!value)
value = [[NSValue valueWithPointer:@selector(scanFolderSettingDidChange)] retain];
[defaults addObserver:self forKeyPath:kDisableFolderScanning options:0 context:value];
[defaults addObserver:self forKeyPath:kScannedFolders options:0 context:value];
[self startWatchingFolders];
// After 10 seconds start to update TV Shows.
// FIXME - Enqueue this after folder whatch.
[self performSelector:@selector(startUpdateDB) withObject:nil afterDelay:0];
}
- (void)startWatchingFolders
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults boolForKey:kDisableFolderScanning])
return;
if (_watchedFolderQuery)
return;
_watchedFolderQuery = [[NSMetadataQuery alloc] init];
NSArray *folders = [defaults arrayForKey:kScannedFolders];
[_watchedFolderQuery setSearchScopes:folders];
[_watchedFolderQuery setPredicate:[NSPredicate predicateWithFormat:@"kMDItemContentTypeTree == 'public.movie'"]];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(gotFirstResults:) name:NSMetadataQueryDidFinishGatheringNotification object:_watchedFolderQuery];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(gotAdditionalResults:) name:NSMetadataQueryDidUpdateNotification object:_watchedFolderQuery];
[_watchedFolderQuery startQuery];
}
- (void)scanFolderSettingDidChange
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults boolForKey:kDisableFolderScanning]) {
if (_watchedFolderQuery) {
[_watchedFolderQuery stopQuery];
[_watchedFolderQuery release];
_watchedFolderQuery = nil;
}
return;
}
if (!_watchedFolderQuery)
return [self startWatchingFolders];
NSArray *folders = [defaults arrayForKey:kScannedFolders];
[_watchedFolderQuery setSearchScopes:folders];
}
@end
......@@ -57,6 +57,22 @@
};
perUserProjectItems = {
6318655911EE1EF500AB038D /* PBXTextBookmark */ = 6318655911EE1EF500AB038D /* PBXTextBookmark */;
6318658911EE2BA100AB038D /* PBXTextBookmark */ = 6318658911EE2BA100AB038D /* PBXTextBookmark */;
6318658A11EE2BA100AB038D /* PBXTextBookmark */ = 6318658A11EE2BA100AB038D /* PBXTextBookmark */;
6318658B11EE2BA100AB038D /* PBXTextBookmark */ = 6318658B11EE2BA100AB038D /* PBXTextBookmark */;
6318658C11EE2BA100AB038D /* PBXTextBookmark */ = 6318658C11EE2BA100AB038D /* PBXTextBookmark */;
6318658E11EE2BA100AB038D /* PBXTextBookmark */ = 6318658E11EE2BA100AB038D /* PBXTextBookmark */;
6318658F11EE2BA100AB038D /* PBXTextBookmark */ = 6318658F11EE2BA100AB038D /* PBXTextBookmark */;
6318659011EE2BA100AB038D /* PBXTextBookmark */ = 6318659011EE2BA100AB038D /* PBXTextBookmark */;
631865A111EE2EA800AB038D /* PBXTextBookmark */ = 631865A111EE2EA800AB038D /* PBXTextBookmark */;
631865A311EE2EA800AB038D /* PBXTextBookmark */ = 631865A311EE2EA800AB038D /* PBXTextBookmark */;
631865A411EE2EA800AB038D /* PBXTextBookmark */ = 631865A411EE2EA800AB038D /* PBXTextBookmark */;
631865A511EE2EA800AB038D /* PBXTextBookmark */ = 631865A511EE2EA800AB038D /* PBXTextBookmark */;
631865B811EE328400AB038D /* PBXTextBookmark */ = 631865B811EE328400AB038D /* PBXTextBookmark */;
631865B911EE328400AB038D /* PBXTextBookmark */ = 631865B911EE328400AB038D /* PBXTextBookmark */;
631865BA11EE328400AB038D /* PBXTextBookmark */ = 631865BA11EE328400AB038D /* PBXTextBookmark */;
631865BB11EE328400AB038D /* PBXTextBookmark */ = 631865BB11EE328400AB038D /* PBXTextBookmark */;
631865BC11EE328400AB038D /* PBXTextBookmark */ = 631865BC11EE328400AB038D /* PBXTextBookmark */;
636E9E3911ED4123002FE8A9 = 636E9E3911ED4123002FE8A9 /* PBXTextBookmark */;
636E9E3A11ED4123002FE8A9 = 636E9E3A11ED4123002FE8A9 /* PBXTextBookmark */;
636E9E3B11ED4123002FE8A9 = 636E9E3B11ED4123002FE8A9 /* PBXTextBookmark */;
......@@ -135,11 +151,189 @@
fRef = 636E9E1E11ED4054002FE8A9 /* MLMediaLibrary.m */;
name = "MLMediaLibrary.m: 552";
rLen = 0;
rLoc = 21466;
rLoc = 15692;
rType = 0;
vrLen = 2532;
vrLoc = 16669;
};
6318658911EE2BA100AB038D /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 636E9E2311ED40C2002FE8A9 /* MLMovieInfoGrabber.m */;
name = "MLMovieInfoGrabber.m: 138";
rLen = 0;
rLoc = 4651;
rType = 0;
vrLen = 2424;
vrLoc = 2640;
};
6318658A11EE2BA100AB038D /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 636E9E2511ED40C2002FE8A9 /* MLTitleDecrapifier.m */;
name = "MLTitleDecrapifier.m: 11";
rLen = 2365;
rLoc = 184;
rType = 0;
vrLen = 1696;
vrLoc = 0;
};
6318658B11EE2BA100AB038D /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 636E9E2711ED40C2002FE8A9 /* MLTVShowEpisodesInfoGrabber.m */;
name = "MLTVShowEpisodesInfoGrabber.m: 27";
rLen = 0;
rLoc = 648;
rType = 0;
vrLen = 1603;
vrLoc = 231;
};
6318658C11EE2BA100AB038D /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6318658D11EE2BA100AB038D /* NSFileManager.h */;
name = "NSFileManager.h: 35";
rLen = 3;
rLoc = 2185;
rType = 0;
vrLen = 2356;
vrLoc = 15954;
};
6318658D11EE2BA100AB038D /* NSFileManager.h */ = {
isa = PBXFileReference;
lastKnownFileType = sourcecode.c.h;
name = NSFileManager.h;
path = /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.2.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSFileManager.h;
sourceTree = "<absolute>";
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {4548, 3157}}";
sepNavSelRange = "{455, 36}";
sepNavVisRange = "{16254, 2281}";
};
};
6318658E11EE2BA100AB038D /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 636E9E1D11ED4054002FE8A9 /* MLMediaLibrary.h */;
name = "MLMediaLibrary.h: 9";
rLen = 0;
rLoc = 191;
rType = 0;
vrLen = 367;
vrLoc = 0;
};
6318658F11EE2BA100AB038D /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 636E9E1E11ED4054002FE8A9 /* MLMediaLibrary.m */;
name = "MLMediaLibrary.m: 11";
rLen = 0;
rLoc = 328;
rType = 0;
vrLen = 1730;
vrLoc = 0;
};
6318659011EE2BA100AB038D /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 636E9E1E11ED4054002FE8A9 /* MLMediaLibrary.m */;
name = "MLMediaLibrary.m: 43";
rLen = 0;
rLoc = 1371;
rType = 0;
vrLen = 2639;
vrLoc = 494;
};
631865A111EE2EA800AB038D /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 631865A211EE2EA800AB038D /* NSURL.h */;
name = "NSURL.h: 17";
rLen = 49;
rLoc = 446;
rType = 0;
vrLen = 2747;
vrLoc = 0;
};
631865A211EE2EA800AB038D /* NSURL.h */ = {
isa = PBXFileReference;
name = NSURL.h;
path = /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.2.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSURL.h;
sourceTree = "<absolute>";
};
631865A311EE2EA800AB038D /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6318658D11EE2BA100AB038D /* NSFileManager.h */;
name = "NSFileManager.h: 16";
rLen = 36;
rLoc = 455;
rType = 0;
vrLen = 2281;
vrLoc = 16254;
};
631865A411EE2EA800AB038D /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 636E9E1E11ED4054002FE8A9 /* MLMediaLibrary.m */;
name = "MLMediaLibrary.m: 57";
rLen = 0;
rLoc = 1635;
rType = 0;
vrLen = 2539;
vrLoc = 1003;
};
631865A511EE2EA800AB038D /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 636E9E1E11ED4054002FE8A9 /* MLMediaLibrary.m */;
name = "MLMediaLibrary.m: 394";
rLen = 0;
rLoc = 14506;
rType = 0;
vrLen = 2502;
vrLoc = 13291;
};
631865B811EE328400AB038D /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 63D0CB2A11EE15CD00A2801F /* ShowEpisode.m */;
name = "ShowEpisode.m: 30";
rLen = 0;
rLoc = 673;
rType = 0;
vrLen = 919;
vrLoc = 0;
};
631865B911EE328400AB038D /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 63D0CA8F11EE11ED00A2801F /* CXMLDocument.m */;
name = "CXMLDocument.m: 229";
rLen = 0;
rLoc = 6567;
rType = 0;
vrLen = 1339;
vrLoc = 5812;
};
631865BA11EE328400AB038D /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 636E9E1D11ED4054002FE8A9 /* MLMediaLibrary.h */;
name = "MLMediaLibrary.h: 18";
rLen = 0;
rLoc = 404;
rType = 0;
vrLen = 410;
vrLoc = 0;
};
631865BB11EE328400AB038D /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 636E9E1E11ED4054002FE8A9 /* MLMediaLibrary.m */;
name = "MLMediaLibrary.m: 344";
rLen = 42;
rLoc = 12722;
rType = 0;
vrLen = 1499;
vrLoc = 12198;
};
631865BC11EE328400AB038D /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 636E9E1E11ED4054002FE8A9 /* MLMediaLibrary.m */;
name = "MLMediaLibrary.m: 27";
rLen = 0;
rLoc = 600;
rType = 0;
vrLen = 1777;
vrLoc = 1325;
};
636E9D9B11ED3F12002FE8A9 /* Source Control */ = {
isa = PBXSourceControlManager;
fallbackIsa = XCSourceControlManager;
......@@ -157,15 +351,15 @@
636E9E1D11ED4054002FE8A9 /* MLMediaLibrary.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {960, 428}}";
sepNavSelRange = "{161, 0}";
sepNavVisRange = "{0, 238}";
sepNavSelRange = "{404, 0}";
sepNavVisRange = "{0, 410}";
};
};
636E9E1E11ED4054002FE8A9 /* MLMediaLibrary.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1656, 6116}}";
sepNavSelRange = "{21466, 0}";
sepNavVisRange = "{16669, 2532}";
sepNavIntBoundsRect = "{{0, 0}, {1194, 4620}}";
sepNavSelRange = "{600, 0}";
sepNavVisRange = "{1325, 1777}";
};
};
636E9E2211ED40C2002FE8A9 /* MLMovieInfoGrabber.h */ = {
......@@ -177,9 +371,9 @@
};
636E9E2311ED40C2002FE8A9 /* MLMovieInfoGrabber.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {960, 1661}}";
sepNavIntBoundsRect = "{{0, 0}, {960, 1749}}";
sepNavSelRange = "{4651, 0}";
sepNavVisRange = "{3760, 1304}";
sepNavVisRange = "{2640, 2424}";
};
};
636E9E2411ED40C2002FE8A9 /* MLTitleDecrapifier.h */ = {
......@@ -191,9 +385,9 @@
};
636E9E2511ED40C2002FE8A9 /* MLTitleDecrapifier.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {900, 924}}";
sepNavSelRange = "{0, 0}";
sepNavVisRange = "{0, 951}";
sepNavIntBoundsRect = "{{0, 0}, {960, 935}}";
sepNavSelRange = "{184, 2365}";
sepNavVisRange = "{0, 1696}";
};
};
636E9E2611ED40C2002FE8A9 /* MLTVShowEpisodesInfoGrabber.h */ = {
......@@ -205,9 +399,9 @@
};
636E9E2711ED40C2002FE8A9 /* MLTVShowEpisodesInfoGrabber.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {960, 1430}}";
sepNavSelRange = "{1072, 10}";
sepNavVisRange = "{53, 1014}";
sepNavIntBoundsRect = "{{0, 0}, {960, 1452}}";
sepNavSelRange = "{648, 0}";
sepNavVisRange = "{231, 1603}";
};
};
636E9E2811ED40C2002FE8A9 /* MLTVShowInfoGrabber.h */ = {
......@@ -313,7 +507,7 @@
fRef = 636E9E1D11ED4054002FE8A9 /* MLMediaLibrary.h */;
name = "MLMediaLibrary.h: 8";
rLen = 0;
rLoc = 161;
rLoc = 191;
rType = 0;
vrLen = 238;
vrLoc = 0;
......@@ -343,7 +537,7 @@
fRef = 636E9E1E11ED4054002FE8A9 /* MLMediaLibrary.m */;
name = "MLMediaLibrary.m: 20";
rLen = 0;
rLoc = 21466;
rLoc = 15692;
rType = 0;
vrLen = 415;
vrLoc = 0;
......@@ -353,7 +547,7 @@
fRef = 636E9E1E11ED4054002FE8A9 /* MLMediaLibrary.m */;
name = "MLMediaLibrary.m: 20";
rLen = 0;
rLoc = 21466;
rLoc = 15692;
rType = 0;
vrLen = 415;
vrLoc = 0;
......@@ -363,7 +557,7 @@
fRef = 636E9E1E11ED4054002FE8A9 /* MLMediaLibrary.m */;
name = "MLMediaLibrary.m: 20";
rLen = 0;
rLoc = 21466;
rLoc = 15692;
rType = 0;
vrLen = 415;
vrLoc = 0;
......@@ -423,6 +617,13 @@
vrLen = 852;
vrLoc = 0;
};
63D0CA8F11EE11ED00A2801F /* CXMLDocument.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {1080, 2750}}";
sepNavSelRange = "{6567, 0}";
sepNavVisRange = "{5812, 1339}";
};
};
63D0CA9D11EE11ED00A2801F /* CXMLNode_XPathExtensions.m */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {960, 891}}";
......@@ -814,8 +1015,8 @@
63D0CB2A11EE15CD00A2801F /* ShowEpisode.m */ = {