From 32561e6b6c0b2e569f1dcb295c0afad3847c685b Mon Sep 17 00:00:00 2001 From: taglia Date: Tue, 17 Jan 2012 01:06:03 +0800 Subject: [PATCH] Movie scanner implemented Implemented scanner to find audio and subtitle languages (downstream code to use this information not implemented yet) Changed HBBPreset to use NSASCIIStringEncoding rather than NSUTF8StringEncoding to avoid awkward retry for random failures --- HandBrakeBatch.xcodeproj/project.pbxproj | 6 ++ .../UserInterfaceState.xcuserstate | Bin 67849 -> 69714 bytes HandBrakeBatch/HBBPresets.m | 92 ++++++++---------- HandBrakeBatch/HBBProgressController.m | 5 + HandBrakeBatch/HBBVideoScan.h | 26 +++++ HandBrakeBatch/HBBVideoScan.m | 83 ++++++++++++++++ 6 files changed, 163 insertions(+), 49 deletions(-) create mode 100644 HandBrakeBatch/HBBVideoScan.h create mode 100644 HandBrakeBatch/HBBVideoScan.m diff --git a/HandBrakeBatch.xcodeproj/project.pbxproj b/HandBrakeBatch.xcodeproj/project.pbxproj index 3764e4e..838d0a2 100644 --- a/HandBrakeBatch.xcodeproj/project.pbxproj +++ b/HandBrakeBatch.xcodeproj/project.pbxproj @@ -18,6 +18,7 @@ 0E6C285C14C288BC004A0FE5 /* iso639-2.db in Resources */ = {isa = PBXBuildFile; fileRef = 0E6C285B14C288BC004A0FE5 /* iso639-2.db */; }; 0E6C285F14C289DE004A0FE5 /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E6C285E14C289DE004A0FE5 /* libsqlite3.dylib */; }; 0E6C286214C29515004A0FE5 /* HBBLangData.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E6C286114C29515004A0FE5 /* HBBLangData.m */; }; + 0E933F9D14C47C8000A5BB1D /* HBBVideoScan.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E933F9C14C47C8000A5BB1D /* HBBVideoScan.m */; }; 0E987E2113E4062C00A99716 /* Preferences.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0E987E2013E4062C00A99716 /* Preferences.xib */; }; 0E987E2413E4083900A99716 /* HBBPreferencesController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E987E2313E4083900A99716 /* HBBPreferencesController.m */; }; 0E9B490A136C874000FCDC68 /* Icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 0E9B4909136C874000FCDC68 /* Icon.icns */; }; @@ -78,6 +79,8 @@ 0E6C285E14C289DE004A0FE5 /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = SDKs/MacOSX10.6.sdk/usr/lib/libsqlite3.dylib; sourceTree = DEVELOPER_DIR; }; 0E6C286014C29515004A0FE5 /* HBBLangData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBBLangData.h; sourceTree = ""; }; 0E6C286114C29515004A0FE5 /* HBBLangData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBBLangData.m; sourceTree = ""; }; + 0E933F9B14C47C8000A5BB1D /* HBBVideoScan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBBVideoScan.h; sourceTree = ""; }; + 0E933F9C14C47C8000A5BB1D /* HBBVideoScan.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBBVideoScan.m; sourceTree = ""; }; 0E987E2013E4062C00A99716 /* Preferences.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = Preferences.xib; sourceTree = ""; }; 0E987E2213E4083900A99716 /* HBBPreferencesController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBBPreferencesController.h; sourceTree = ""; }; 0E987E2313E4083900A99716 /* HBBPreferencesController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBBPreferencesController.m; sourceTree = ""; }; @@ -202,6 +205,8 @@ 0E49A76713764A1500FB3B77 /* HBBPresets.m */, 0E108B69136C47F200168057 /* HBBProgressController.h */, 0E108B6A136C47F200168057 /* HBBProgressController.m */, + 0E933F9B14C47C8000A5BB1D /* HBBVideoScan.h */, + 0E933F9C14C47C8000A5BB1D /* HBBVideoScan.m */, 0E549260136C49BD0094563F /* xib */, 0EEC80461369B4EA00D05124 /* Supporting Files */, ); @@ -309,6 +314,7 @@ 0E49A76813764A1500FB3B77 /* HBBPresets.m in Sources */, 0E987E2413E4083900A99716 /* HBBPreferencesController.m in Sources */, 0E6C286214C29515004A0FE5 /* HBBLangData.m in Sources */, + 0E933F9D14C47C8000A5BB1D /* HBBVideoScan.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/HandBrakeBatch.xcodeproj/project.xcworkspace/xcuserdata/taglia.xcuserdatad/UserInterfaceState.xcuserstate b/HandBrakeBatch.xcodeproj/project.xcworkspace/xcuserdata/taglia.xcuserdatad/UserInterfaceState.xcuserstate index 8282475d5ddef559aa172d8e3d74266db12ba82e..e19b3430eff238a4202234ed99ccc8298a36277d 100644 GIT binary patch literal 69714 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 Fe*nY2BlZ9Q literal 67849 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 L+yDB#_ws)MP`lz$ diff --git a/HandBrakeBatch/HBBPresets.m b/HandBrakeBatch/HBBPresets.m index 4b1bf40..8a016e2 100644 --- a/HandBrakeBatch/HBBPresets.m +++ b/HandBrakeBatch/HBBPresets.m @@ -37,57 +37,52 @@ - (void)initPresets { // Check if HB's custom presets are present // If presets are present, let's parse them - // Sometimes the "manicure.rb" script returns an empty list. We try 5 times to be sure this won't be visible by the user (unless the preset file is corrupted) - int retries = 5; if ([[NSFileManager defaultManager] fileExistsAtPath:presetPath]) { - do { - // Initialize NSTask - NSTask *simpleTask = [[NSTask alloc] init]; - NSPipe *outputPipe = [NSPipe pipe]; - [simpleTask setStandardOutput: outputPipe]; - [simpleTask setStandardError: [simpleTask standardOutput]]; - [simpleTask setLaunchPath: @"/usr/bin/ruby"]; - - // Get path of manicure.rb - NSString *manicure = [[NSBundle mainBundle] pathForResource:@"manicure" ofType:@"rb"]; - [simpleTask setCurrentDirectoryPath:[manicure stringByDeletingLastPathComponent]]; - - // Build argument array - NSArray *arguments = [NSArray arrayWithObjects:manicure, @"-p", nil]; - [simpleTask setArguments: arguments]; - - // Run task - [simpleTask launch]; - [simpleTask waitUntilExit]; - - NSFileHandle *output = [outputPipe fileHandleForReading]; - NSData *data = [output readDataToEndOfFile]; - NSString *rawOutput = [NSString stringWithUTF8String:[data bytes]]; - NSArray *outputLines = [rawOutput componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; - - for (NSString *currentLine in outputLines) { - // Ignore empty lines and folders (all preset lines contain a +) - // Only one level of folders is supported - if ([currentLine length] > 4) { - int offset; - - if ([currentLine characterAtIndex:0] == '+') - offset=0; - else if ([currentLine characterAtIndex:3] == '+') - offset=3; - else - continue; + // Initialize NSTask + NSTask *simpleTask = [[NSTask alloc] init]; + NSPipe *outputPipe = [NSPipe pipe]; + [simpleTask setStandardOutput: outputPipe]; + [simpleTask setStandardError: [simpleTask standardOutput]]; + [simpleTask setLaunchPath: @"/usr/bin/ruby"]; + + // Get path of manicure.rb + NSString *manicure = [[NSBundle mainBundle] pathForResource:@"manicure" ofType:@"rb"]; + [simpleTask setCurrentDirectoryPath:[manicure stringByDeletingLastPathComponent]]; + + // Build argument array + NSArray *arguments = [NSArray arrayWithObjects:manicure, @"-p", nil]; + [simpleTask setArguments: arguments]; + + // Run task + [simpleTask launch]; + [simpleTask waitUntilExit]; + + NSFileHandle *output = [outputPipe fileHandleForReading]; + NSData *data = [output readDataToEndOfFile]; + NSString *rawOutput = [NSString stringWithCString:[data bytes] encoding:NSASCIIStringEncoding]; + NSArray *outputLines = [rawOutput componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; + + for (NSString *currentLine in outputLines) { + // Ignore empty lines and folders (all preset lines contain a +) + // Only one level of folders is supported + if ([currentLine length] > 4) { + int offset; + + if ([currentLine characterAtIndex:0] == '+') + offset=0; + else if ([currentLine characterAtIndex:3] == '+') + offset=3; + else + continue; - NSRange separator = [currentLine rangeOfString:@": "]; + NSRange separator = [currentLine rangeOfString:@": "]; - NSString *name = [[currentLine substringToIndex:separator.location] substringFromIndex:offset+2]; - NSString *args = [currentLine substringFromIndex:separator.location+separator.length]; + NSString *name = [[currentLine substringToIndex:separator.location] substringFromIndex:offset+2]; + NSString *args = [currentLine substringFromIndex:separator.location+separator.length]; - [tempDict setObject:args forKey:name]; - } - } - retries--; - } while (retries > 0 && [tempDict count] == 0); + [tempDict setObject:args forKey:name]; + } + } } // Preset file probably corrupted @@ -95,8 +90,7 @@ - (void)initPresets { for (NSString *currentPreset in defaultPresets) { [tempDict setObject:[NSString stringWithFormat:@"--preset %@", currentPreset] forKey:currentPreset]; } - if (retries == 0) - NSBeginAlertSheet(@"Unable to read HandBrake custom presets", @"Ok", nil, nil, nil, nil, NULL, NULL, NULL, @"The custom preset file might be corrupted, the application will show the default presets only."); + NSBeginAlertSheet(@"Unable to read HandBrake custom presets", @"Ok", nil, nil, nil, nil, NULL, NULL, NULL, @"The custom preset file might be corrupted, the application will show the default presets only."); } // Initialize the preset dictionary diff --git a/HandBrakeBatch/HBBProgressController.m b/HandBrakeBatch/HBBProgressController.m index 5295c9c..349138d 100644 --- a/HandBrakeBatch/HBBProgressController.m +++ b/HandBrakeBatch/HBBProgressController.m @@ -11,6 +11,7 @@ #import #import "HBBProgressController.h" #import "HBBPresets.h" +#import "HBBVideoScan.h" #define FILES_OK 0 #define FILE_EXISTS 1 @@ -68,6 +69,10 @@ -(void) prepareTask { NSString *inputFilePath = [[currentQueue objectAtIndex:0] inputPath]; + // Scan input file + HBBVideoScan *scanner = [[HBBVideoScan alloc] initWithFile:inputFilePath]; + [scanner scan]; + NSString *outputFilePath = [outputFolder stringByAppendingPathComponent:[[[inputFilePath stringByDeletingPathExtension] stringByAppendingPathExtension:fileExtension] lastPathComponent]]; // Deal with EyeTV files diff --git a/HandBrakeBatch/HBBVideoScan.h b/HandBrakeBatch/HBBVideoScan.h new file mode 100644 index 0000000..350c1b9 --- /dev/null +++ b/HandBrakeBatch/HBBVideoScan.h @@ -0,0 +1,26 @@ +// +// HBBVideoScan.h +// HandBrakeBatch +// +// Created by Cesare Tagliaferri on 16/01/2012. +// This file is part of the HandBrakeBatch source code. +// Homepage: . +// It may be used under the terms of the GNU General Public License. +// + +#import + +@interface HBBVideoScan : NSObject { + NSString *fileName; + NSMutableArray *audioLanguages; + NSMutableArray *subtitleLanguages; +} + +@property (assign)NSString *fileName; +@property (readonly)NSArray *audioLanguages; +@property (readonly)NSArray *subtitleLanguages; + +-(id)initWithFile:(NSString *)path; +-(void)scan; + +@end diff --git a/HandBrakeBatch/HBBVideoScan.m b/HandBrakeBatch/HBBVideoScan.m new file mode 100644 index 0000000..ce1b939 --- /dev/null +++ b/HandBrakeBatch/HBBVideoScan.m @@ -0,0 +1,83 @@ +// +// HBBVideoScan.m +// HandBrakeBatch +// +// Created by Cesare Tagliaferri on 16/01/2012. +// This file is part of the HandBrakeBatch source code. +// Homepage: . +// It may be used under the terms of the GNU General Public License. +// + +#import "HBBVideoScan.h" + +@implementation HBBVideoScan + +@synthesize fileName, audioLanguages, subtitleLanguages; + +-(id)initWithFile:(NSString *)path { + self = [self init]; + + [self setFileName:path]; + + return self; +} + +- (id)init { + self = [super init]; + + if (self) { + audioLanguages = [[NSMutableArray alloc] init]; + subtitleLanguages = [[NSMutableArray alloc] init]; + } + + return self; +} + +-(void)scan { + NSTask *task = [[NSTask alloc] init]; + NSPipe *stdOutPipe = [NSPipe pipe]; + + [task setStandardOutput:stdOutPipe]; + [task setStandardError: [task standardOutput]]; + + // No perf issues here, so we always use the 32 bit version + [task setLaunchPath:[[NSBundle mainBundle] pathForResource:@"HandBrakeCLI_32" ofType:@""]]; + + // Setting arguments + [task setArguments:[NSArray arrayWithObjects:@"--scan", @"-i", fileName, nil]]; + + // Executing scan + [task launch]; + [task waitUntilExit]; + + NSData *output = [[stdOutPipe fileHandleForReading] readDataToEndOfFile]; + + NSString *stringData = [NSString stringWithCString:[output bytes] encoding:NSASCIIStringEncoding]; + + NSArray *outputLines = [stringData componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; + + NSUInteger audioIndex = [outputLines indexOfObject:@" + audio tracks:"]; + NSUInteger subtitleIndex = [outputLines indexOfObject:@" + subtitle tracks:"]; + + // Reset languages + [audioLanguages removeAllObjects]; + [subtitleLanguages removeAllObjects]; + + while ([[outputLines objectAtIndex:++audioIndex] characterAtIndex:4] == '+') { + NSRange range = [[outputLines objectAtIndex:audioIndex] rangeOfString:@"iso639-2: "]; + [audioLanguages addObject:[[outputLines objectAtIndex:audioIndex] substringWithRange:NSMakeRange(range.location + range.length, 3)]]; + } + while ([[outputLines objectAtIndex:++subtitleIndex] characterAtIndex:4] == '+') { + NSRange range = [[outputLines objectAtIndex:audioIndex] rangeOfString:@"iso639-2: "]; + [audioLanguages addObject:[[outputLines objectAtIndex:audioIndex] substringWithRange:NSMakeRange(range.location + range.length, 3)]]; + } + + for (NSString *aLang in audioLanguages) { + NSLog(@"Audio language found: %@", aLang); + } + for (NSString *sLang in subtitleLanguages) { + NSLog(@"Subtitle language found: %@", sLang); + } +} + +@end