From e67454d3c1877dea64591ead229d88ec670eb686 Mon Sep 17 00:00:00 2001 From: Marcos Alvarez Date: Mon, 9 Sep 2013 11:56:45 +0200 Subject: [PATCH 01/15] Fixed the problem with not playing videos. --- LBYouTubeView/LBYouTubeExtractor.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LBYouTubeView/LBYouTubeExtractor.m b/LBYouTubeView/LBYouTubeExtractor.m index fb91e45..b621b52 100644 --- a/LBYouTubeView/LBYouTubeExtractor.m +++ b/LBYouTubeView/LBYouTubeExtractor.m @@ -132,7 +132,7 @@ -(NSURL*)extractYouTubeURLFromFile:(NSString *)html error:(NSError *__autoreleas *error = decodingError; } else { - NSArray* videos = [[[JSONCode objectForKey:@"content"] objectForKey:@"video"] objectForKey:@"fmt_stream_map"]; + NSArray* videos = [[[JSONCode objectForKey:@"content"] objectForKey:@"player_data"] objectForKey:@"fmt_stream_map"]; NSString* streamURL = nil; if (videos.count) { NSString* streamURLKey = @"url"; From a59f3230da40f0bd9d940c1f0d190d31fd77378a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20Marqui=CC=81nez=20Ferra=CC=81ndiz?= Date: Sat, 28 Sep 2013 13:32:46 +0200 Subject: [PATCH 02/15] Add support for Vevo videos with encrypted signatures --- LBYouTubeView/LBYouTubeExtractor.h | 2 ++ LBYouTubeView/LBYouTubeExtractor.m | 36 ++++++++++++++++++++++++++---- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/LBYouTubeView/LBYouTubeExtractor.h b/LBYouTubeView/LBYouTubeExtractor.h index e2d2be7..8da6f0e 100644 --- a/LBYouTubeView/LBYouTubeExtractor.h +++ b/LBYouTubeView/LBYouTubeExtractor.h @@ -31,6 +31,8 @@ typedef enum { @property (nonatomic, weak) IBOutlet id delegate; @property (nonatomic, strong) LBYouTubeExtractorCompletionBlock completionBlock; @property (nonatomic, strong) NSString* extractionExpression; +@property (nonatomic, strong) NSString* signatureExtractionExpression; +@property (nonatomic, strong) NSArray* signAlgo; -(id)initWithURL:(NSURL*)videoURL quality:(LBYouTubeVideoQuality)quality; -(id)initWithID:(NSString*)videoID quality:(LBYouTubeVideoQuality)quality; diff --git a/LBYouTubeView/LBYouTubeExtractor.m b/LBYouTubeView/LBYouTubeExtractor.m index 9c4c770..e341c87 100644 --- a/LBYouTubeView/LBYouTubeExtractor.m +++ b/LBYouTubeView/LBYouTubeExtractor.m @@ -16,6 +16,8 @@ NSInteger const LBYouTubePlayerExtractorErrorCodeNoStreamURL = 2; NSInteger const LBYouTubePlayerExtractorErrorCodeNoJSONData = 3; +static NSString* algoJson = @"[80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 0, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 63]"; + @interface LBYouTubeExtractor () @property (nonatomic, strong) NSURLConnection* connection; @@ -37,6 +39,8 @@ -(id)initWithURL:(NSURL *)videoURL quality:(LBYouTubeVideoQuality)videoQuality { self.youTubeURL = videoURL; self.quality = videoQuality; self.extractionExpression = @"(?!\\\\\")http[^\"]*?itag=[^\"]*?(?=\\\\\")"; + self.signatureExtractionExpression = @"(?<=sig\\\\\": \\\\\")[^\"]*?(?=\\\\\")"; + self.signAlgo = [NSJSONSerialization JSONObjectWithData:[algoJson dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil]; } return self; } @@ -89,25 +93,38 @@ -(NSURL*)extractYouTubeURLFromFile:(NSString *)html error:(NSError *__autoreleas NSString* string = html; NSRegularExpression* regex = [[NSRegularExpression alloc] initWithPattern:self.extractionExpression options:NSRegularExpressionCaseInsensitive error:error]; + NSRegularExpression* sig_regex = [[NSRegularExpression alloc] initWithPattern:self.signatureExtractionExpression options:NSRegularExpressionCaseInsensitive error:nil]; NSArray* videos = [regex matchesInString:string options:0 range:NSMakeRange(0, [string length])]; + NSArray* sigs = [sig_regex matchesInString:string options:0 range:NSMakeRange(0, [string length])]; if (videos.count > 0) { NSTextCheckingResult* checkingResult = nil; + NSTextCheckingResult* sigCheckingResult = nil; + unsigned int index = 0; if (self.quality == LBYouTubeVideoQualityLarge) { - checkingResult = [videos objectAtIndex:0]; + index = 0; } else if (self.quality == LBYouTubeVideoQualityMedium) { - unsigned int index = MIN(videos.count-1, 1U); - checkingResult= [videos objectAtIndex:index]; + index = MIN(videos.count-1, 1U); } else { - checkingResult = [videos lastObject]; + index = [videos count] - 1; } + checkingResult = [videos objectAtIndex:index]; + NSMutableString* streamURL = [NSMutableString stringWithString: [string substringWithRange:checkingResult.range]]; [streamURL replaceOccurrencesOfString:@"\\\\u0026" withString:@"&" options:NSCaseInsensitiveSearch range:NSMakeRange(0, streamURL.length)]; [streamURL replaceOccurrencesOfString:@"\\\\\\" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, streamURL.length)]; + + // Check the signature: + if ([sigs count] > 0) { + sigCheckingResult = [sigs objectAtIndex:index]; + NSString* encrSyg = [string substringWithRange:sigCheckingResult.range]; + NSString* sig = [self decryptSignature:encrSyg]; + [streamURL appendString:[@"&signature=" stringByAppendingString:sig]]; + } return [NSURL URLWithString:streamURL]; } @@ -117,6 +134,17 @@ -(NSURL*)extractYouTubeURLFromFile:(NSString *)html error:(NSError *__autoreleas return nil; } +-(NSString *)decryptSignature:(NSString *)signature +{ + NSMutableString* res = [NSMutableString string]; + for (int i=0; i<[self.signAlgo count]; i++) { + NSNumber* index = [self.signAlgo objectAtIndex:i]; + NSRange range = {[index integerValue], 1}; + [res insertString:[signature substringWithRange:range] atIndex:i]; + } + return [NSString stringWithString:res]; +} + -(void)didSuccessfullyExtractYouTubeURL:(NSURL *)videoURL { if (self.delegate) { [self.delegate youTubeExtractor:self didSuccessfullyExtractYouTubeURL:videoURL]; From 6282bea6ffb0f579b5c6b6390d85b8118a163758 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20Marqui=CC=81nez=20Ferra=CC=81ndiz?= Date: Sat, 28 Sep 2013 13:41:40 +0200 Subject: [PATCH 03/15] Allow to set the signature expression and algo in the init methods of LBYouTubePlayerViewController --- LBYouTubeView/LBYouTubePlayerViewController.h | 2 ++ LBYouTubeView/LBYouTubePlayerViewController.m | 23 ++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/LBYouTubeView/LBYouTubePlayerViewController.h b/LBYouTubeView/LBYouTubePlayerViewController.h index 16fde05..1bc78b8 100644 --- a/LBYouTubeView/LBYouTubePlayerViewController.h +++ b/LBYouTubeView/LBYouTubePlayerViewController.h @@ -19,8 +19,10 @@ -(id)initWithYouTubeURL:(NSURL*)youTubeURL quality:(LBYouTubeVideoQuality)quality; -(id)initWithYouTubeURL:(NSURL*)youTubeURL quality:(LBYouTubeVideoQuality)quality extractionExpression:(NSString*)expression; +-(id)initWithYouTubeURL:(NSURL*)youTubeURL quality:(LBYouTubeVideoQuality)quality extractionExpression:(NSString*)expression signatureExtracionExpression:(NSString*)signatureExpression signatureAlgo:(NSArray*)algo; -(id)initWithYouTubeID:(NSString*)youTubeID quality:(LBYouTubeVideoQuality)quality; -(id)initWithYouTubeID:(NSString*)youTubeID quality:(LBYouTubeVideoQuality)quality extractionExpression:(NSString*)expression; +-(id)initWithYouTubeID:(NSString*)youTubeID quality:(LBYouTubeVideoQuality)quality extractionExpression:(NSString*)expression signatureExtracionExpression:(NSString*)signatureExpression signatureAlgo:(NSArray*)algo; @end @protocol LBYouTubePlayerControllerDelegate diff --git a/LBYouTubeView/LBYouTubePlayerViewController.m b/LBYouTubeView/LBYouTubePlayerViewController.m index 95bdab3..8b06e73 100644 --- a/LBYouTubeView/LBYouTubePlayerViewController.m +++ b/LBYouTubeView/LBYouTubePlayerViewController.m @@ -22,13 +22,24 @@ -(id)initWithYouTubeURL:(NSURL *)youTubeURL quality:(LBYouTubeVideoQuality)quali } -(id)initWithYouTubeURL:(NSURL *)youTubeURL quality:(LBYouTubeVideoQuality)quality extractionExpression:(NSString*)expression { - self = [super initWithContentURL:nil]; + return [self initWithYouTubeURL:youTubeURL quality:quality extractionExpression:expression signatureExtracionExpression:nil signatureAlgo:nil]; +} + +-(id)initWithYouTubeURL:(NSURL*)youTubeURL quality:(LBYouTubeVideoQuality)quality extractionExpression:(NSString*)expression signatureExtracionExpression:(NSString*)signatureExpression signatureAlgo:(NSArray*)algo; +{ + self = [super initWithContentURL:nil]; if (self) { self.extractor = [[LBYouTubeExtractor alloc] initWithURL:youTubeURL quality:quality]; self.extractor.delegate = self; if (expression) { self.extractor.extractionExpression = expression; } + if (signatureExpression) { + self.extractor.signatureExtractionExpression = signatureExpression; + } + if (algo) { + self.extractor.signAlgo = algo; + } [self.extractor startExtracting]; } return self; @@ -39,6 +50,9 @@ -(id)initWithYouTubeID:(NSString *)youTubeID quality:(LBYouTubeVideoQuality)qual } -(id)initWithYouTubeID:(NSString *)youTubeID quality:(LBYouTubeVideoQuality)quality extractionExpression:(NSString*)expression { + return [self initWithYouTubeID:youTubeID quality:quality extractionExpression:expression signatureExtracionExpression:nil signatureAlgo:nil]; +} +-(id)initWithYouTubeID:(NSString*)youTubeID quality:(LBYouTubeVideoQuality)quality extractionExpression:(NSString*)expression signatureExtracionExpression:(NSString*)signatureExpression signatureAlgo:(NSArray*)algo { self = [super initWithContentURL:nil]; if (self) { self.extractor = [[LBYouTubeExtractor alloc] initWithID:youTubeID quality:quality]; @@ -46,6 +60,13 @@ -(id)initWithYouTubeID:(NSString *)youTubeID quality:(LBYouTubeVideoQuality)qual if (expression) { self.extractor.extractionExpression = expression; } + if (signatureExpression) { + self.extractor.signatureExtractionExpression = signatureExpression; + } + if (algo) { + self.extractor.signAlgo = algo; + } + [self.extractor startExtracting]; } return self; From a3f0e05fa7543c141d0d952b183802b92333a93b Mon Sep 17 00:00:00 2001 From: Michael Rimestad Date: Thu, 3 Oct 2013 16:56:55 +0200 Subject: [PATCH 04/15] Added Ability to decode signature key using the json function from the HTML. Will require IOS7 as javascriptcore framework is used. Another option is to use a web view to call the function. --- LBYouTubeView/LBYouTubeExtractor.m | 277 ++++++++++++++++++++++++++++- 1 file changed, 276 insertions(+), 1 deletion(-) diff --git a/LBYouTubeView/LBYouTubeExtractor.m b/LBYouTubeView/LBYouTubeExtractor.m index e341c87..a36e99a 100644 --- a/LBYouTubeView/LBYouTubeExtractor.m +++ b/LBYouTubeView/LBYouTubeExtractor.m @@ -7,6 +7,7 @@ // #import "LBYouTubeExtractor.h" +#import static NSString* const kUserAgent = @"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3"; @@ -122,7 +123,47 @@ -(NSURL*)extractYouTubeURLFromFile:(NSString *)html error:(NSError *__autoreleas if ([sigs count] > 0) { sigCheckingResult = [sigs objectAtIndex:index]; NSString* encrSyg = [string substringWithRange:sigCheckingResult.range]; - NSString* sig = [self decryptSignature:encrSyg]; + + NSString* sig = nil; + + //Get the javascript function used to decode the encoded key! + NSRegularExpression * regexp = [[NSRegularExpression alloc] initWithPattern:@"signature=([a-zA-Z]+)" options:NSRegularExpressionCaseInsensitive error:error]; + NSRange signature_range = [regexp rangeOfFirstMatchInString:string options:0 range:NSMakeRange(0, [string length])]; + + //If we have a function name refrence, continue trying to pass + if(signature_range.location != NSNotFound) + { + NSString * signature_functionName = [string substringWithRange:NSMakeRange(signature_range.location+10, signature_range.length-10)]; + //NSLog(@"got signature_functionName = %@", signature_functionName); + + //We need to extrach the javascript part of the HTML document contaning the function. + regexp = [[NSRegularExpression alloc] initWithPattern:[NSString stringWithFormat:@"function %@\\(([a-z,]+)\\)\\{([^}]+)\\}", signature_functionName] options:0 error:error]; + + NSRange function_range = [regexp rangeOfFirstMatchInString:string options:0 range:NSMakeRange(0, [string length])]; + + if(function_range.location != NSNotFound) + { + //NSString * jsCode = @"function Gp(a){a=a.split("");a=a.reverse();a=a.slice(1);var b=a[0];a[0]=a[68%a.length];a[68]=b;return a.join("")}"; + NSString * jsCode = [string substringWithRange:function_range]; + JSContext *context = [[JSContext alloc] initWithVirtualMachine:[[JSVirtualMachine alloc] init]]; + + [context evaluateScript:jsCode]; + + JSValue * func = context[signature_functionName]; + NSArray * args = @[encrSyg]; + JSValue * ret =[func callWithArguments:args]; + + if([ret isString]) + sig = [ret toString]; + } + } + + //if we are unable to grap the json, fall back to static decrypt algo. + if(!sig){ + NSLog(@"Unable to get decoded key from JSon, falling back to static method"); + sig = [self decryptSignature:encrSyg]; + } + [streamURL appendString:[@"&signature=" stringByAppendingString:sig]]; } @@ -145,6 +186,240 @@ -(NSString *)decryptSignature:(NSString *)signature return [NSString stringWithString:res]; } +-(NSString *)_static_decrypt_signature:(NSString *)signature{ + // if age_gate{ + // # The videos with age protection use another player, so the + // # algorithms can be different. + // if len(s) == 86: + // return s[2:63] + s[82] + s[64:82] + s[63] + // } + NSLog(@"length %d", signature.length); + + switch (signature.length) { + case 93: + { + return [NSString stringWithFormat:@"%@%@%@", + [self stringRange:signature andStart:86 andStop:29], + [self stringRange:signature charAtIndex:88], + [self stringRange:signature andStart:28 andStop:5]]; + //return s[86:29:-1] + s[88] + s[28:5:-1] + } + break; + case 92: + { + return [NSString stringWithFormat:@"%@%@%@%@%@%@%@%@", + [self stringRange:signature charAtIndex:25], + [self stringRange:signature andStart:3 andStop:25], + [self stringRange:signature charAtIndex:0], + [self stringRange:signature andStart:26 andStop:42], + [self stringRange:signature charAtIndex:79], + [self stringRange:signature andStart:43 andStop:79], + [self stringRange:signature charAtIndex:91], + [self stringRange:signature andStart:80 andStop:83]]; + } + //return s[25] + s[3:25] + s[0] + s[26:42] + s[79] + s[43:79] + s[91] + s[80:83]; + break; + case 91: + { + return [NSString stringWithFormat:@"%@%@%@", + [self stringRange:signature andStart:84 andStop:27], + [self stringRange:signature charAtIndex:86], + [self stringRange:signature andStart:26 andStop:5]]; + } + //return s[84:27:-1] + s[86] + s[26:5:-1] + break; + case 90: + return [NSString stringWithFormat:@"%@%@%@%@%@%@%@%@", + [self stringRange:signature charAtIndex:25], + [self stringRange:signature andStart:3 andStop:25], + [self stringRange:signature charAtIndex:2], + [self stringRange:signature andStart:26 andStop:40], + [self stringRange:signature charAtIndex:77], + [self stringRange:signature andStart:41 andStop:77], + [self stringRange:signature charAtIndex:89], + [self stringRange:signature andStart:78 andStop:81]]; + + //return s[25] + s[3:25] + s[2] + s[26:40] + s[77] + s[41:77] + s[89] + s[78:81] + break; + case 89: + return [NSString stringWithFormat:@"%@%@%@%@%@", + [self stringRange:signature andStart:84 andStop:78], + [self stringRange:signature charAtIndex:87], + [self stringRange:signature andStart:77 andStop:60], + [self stringRange:signature charAtIndex:0], + [self stringRange:signature andStart:59 andStop:3]]; + //return s[84:78:-1] + s[87] + s[77:60:-1] + s[0] + s[59:3:-1] + break; + case 88: + return [NSString stringWithFormat:@"%@%@%@%@%@%@%@%@", + [self stringRange:signature andStart:7 andStop:28], + [self stringRange:signature charAtIndex:87], + [self stringRange:signature andStart:29 andStop:45], + [self stringRange:signature charAtIndex:55], + [self stringRange:signature andStart:46 andStop:55], + [self stringRange:signature charAtIndex:2], + [self stringRange:signature andStart:56 andStop:87], + [self stringRange:signature charAtIndex:28]]; + //return s[7:28] + s[87] + s[29:45] + s[55] + s[46:55] + s[2] + s[56:87] + s[28] + break; + case 87: + return [NSString stringWithFormat:@"%@%@%@%@%@%@%@", + [self stringRange:signature andStart:6 andStop:27], + [self stringRange:signature charAtIndex:4], + [self stringRange:signature andStart:28 andStop:39], + [self stringRange:signature charAtIndex:27], + [self stringRange:signature andStart:40 andStop:59], + [self stringRange:signature charAtIndex:2], + [self stringRange:signature andStart:60 andStop:87]]; + //return s[6:27] + s[4] + s[28:39] + s[27] + s[40:59] + s[2] + s[60:] + break; + case 86: + return [NSString stringWithFormat:@"%@%@%@%@%@%@%@", + [self stringRange:signature andStart:80 andStop:72], + [self stringRange:signature charAtIndex:16], + [self stringRange:signature andStart:71 andStop:39], + [self stringRange:signature charAtIndex:72], + [self stringRange:signature andStart:38 andStop:16], + [self stringRange:signature charAtIndex:82], + [self stringRange:signature andStart:15 andStop:-1]]; + //return s[80:72:-1] + s[16] + s[71:39:-1] + s[72] + s[38:16:-1] + s[82] + s[15::-1] + break; + case 85: + return [NSString stringWithFormat:@"%@%@%@%@%@", + [self stringRange:signature andStart:3 andStop:11], + [self stringRange:signature charAtIndex:0], + [self stringRange:signature andStart:12 andStop:55], + [self stringRange:signature charAtIndex:84], + [self stringRange:signature andStart:56 andStop:84]]; + //return s[3:11] + s[0] + s[12:55] + s[84] + s[56:84] + break; + case 84: + return [NSString stringWithFormat:@"%@%@%@%@%@%@%@", + [self stringRange:signature andStart:78 andStop:70], + [self stringRange:signature charAtIndex:14], + [self stringRange:signature andStart:69 andStop:37], + [self stringRange:signature charAtIndex:70], + [self stringRange:signature andStart:36 andStop:14], + [self stringRange:signature charAtIndex:80], + [self stringRange:signature andStart:13 andStop:-1]]; + //return s[78:70:-1] + s[14] + s[69:37:-1] + s[70] + s[36:14:-1] + s[80] + s[:14][::-1] + break; + case 83: + { + return [NSString stringWithFormat:@"%@%@%@%@", + [self stringRange:signature andStart:80 andStop:63], + [self stringRange:signature charAtIndex:0], + [self stringRange:signature andStart:62 andStop:0], + [self stringRange:signature charAtIndex:63]]; + //return s[80:63:-1] + s[0] + s[62:0:-1] + s[63] + } + break; + case 82: + return [NSString stringWithFormat:@"%@%@%@%@", + [self stringRange:signature charAtIndex:12], + [self stringRange:signature andStart:79 andStop:12], + [self stringRange:signature charAtIndex:80], + [self stringRange:signature andStart:11 andStop:-1]]; + //return s[12] + s[79:12:-1] + s[80] + s[11::-1] + break; + case 81: + return [NSString stringWithFormat:@"%@%@%@%@%@%@%@%@%@%@%@%@%@", + [self stringRange:signature charAtIndex:56], + [self stringRange:signature andStart:79 andStop:56], + [self stringRange:signature charAtIndex:41], + [self stringRange:signature andStart:55 andStop:41], + [self stringRange:signature charAtIndex:80], + [self stringRange:signature andStart:40 andStop:34], + [self stringRange:signature charAtIndex:0], + [self stringRange:signature andStart:33 andStop:29], + [self stringRange:signature charAtIndex:34], + [self stringRange:signature andStart:28 andStop:9], + [self stringRange:signature charAtIndex:29], + [self stringRange:signature andStart:8 andStop:0], + [self stringRange:signature charAtIndex:9]]; + //return s[56] + s[79:56:-1] + s[41] + s[55:41:-1] + s[80] + s[40:34:-1] + s[0] + s[33:29:-1] + s[34] + s[28:9:-1] + s[29] + s[8:0:-1] + s[9] + break; + case 80: + return [NSString stringWithFormat:@"%@%@%@%@%@", + [self stringRange:signature andStart:1 andStop:19], + [self stringRange:signature charAtIndex:0], + [self stringRange:signature andStart:20 andStop:68], + [self stringRange:signature charAtIndex:19], + [self stringRange:signature andStart:69 andStop:80]]; + //return s[1:19] + s[0] + s[20:68] + s[19] + s[69:80] + break; + case 79: + return [NSString stringWithFormat:@"%@%@%@%@%@%@%@%@%@%@%@%@%@", + [self stringRange:signature charAtIndex:54], + [self stringRange:signature andStart:77 andStop:54], + [self stringRange:signature charAtIndex:39], + [self stringRange:signature andStart:53 andStop:39], + [self stringRange:signature charAtIndex:78], + [self stringRange:signature andStart:38 andStop:34], + [self stringRange:signature charAtIndex:0], + [self stringRange:signature andStart:33 andStop:29], + [self stringRange:signature charAtIndex:34], + [self stringRange:signature andStart:28 andStop:9], + [self stringRange:signature charAtIndex:29], + [self stringRange:signature andStart:8 andStop:0], + [self stringRange:signature charAtIndex:9]]; + //return s[54] + s[77:54:-1] + s[39] + s[53:39:-1] + s[78] + s[38:34:-1] + s[0] + s[33:29:-1] + s[34] + s[28:9:-1] + s[29] + s[8:0:-1] + s[9] + break; + + default: + return nil; + break; + } + +} + +-(NSString *) stringRange:(NSString *)string andStart:(int)start andStop:(int)stop +{ + if(stop < start) + { + NSMutableString *rtr = [NSMutableString new]; + // unichar buf[1]; + + if(start <= string.length && stop >= -1) + { + while (start > stop) { + unichar uch = [string characterAtIndex:start--]; + [rtr appendString:[NSString stringWithCharacters:&uch length:1]]; + } + + return rtr; + } + return [NSString new]; + + } + else if(start < string.length && stop <= string.length && stop > start) + { + NSMutableString *rtr=[NSMutableString stringWithCapacity:stop-start]; + + while (start < stop) { + unichar uch = [string characterAtIndex:start++]; + [rtr appendString:[NSString stringWithCharacters:&uch length:1]]; + } + return rtr; + } + + return [NSString new]; +} + +-(NSString *) stringRange:(NSString *)string charAtIndex:(int)index +{ + //NSMutableString *rtr=[NSMutableString new]; + // unichar buf[1]; + if(index < string.length) + { + unichar uch = [string characterAtIndex:index]; + return [NSString stringWithCharacters:&uch length:1]; + } + return [NSString new]; +} + + + -(void)didSuccessfullyExtractYouTubeURL:(NSURL *)videoURL { if (self.delegate) { [self.delegate youTubeExtractor:self didSuccessfullyExtractYouTubeURL:videoURL]; From 2a632789f3ff8fb3334edde05c65516dc7acdd8a Mon Sep 17 00:00:00 2001 From: Michael Rimestad Date: Fri, 4 Oct 2013 12:02:51 +0200 Subject: [PATCH 05/15] Changed the signatureExtractionExpression away from a Look-behind assertion to improve performance. Went from 4.2 sec down to 0.2. Result should be the same. --- LBYouTubeView/LBYouTubeExtractor.m | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/LBYouTubeView/LBYouTubeExtractor.m b/LBYouTubeView/LBYouTubeExtractor.m index a36e99a..e0eb9bb 100644 --- a/LBYouTubeView/LBYouTubeExtractor.m +++ b/LBYouTubeView/LBYouTubeExtractor.m @@ -40,7 +40,7 @@ -(id)initWithURL:(NSURL *)videoURL quality:(LBYouTubeVideoQuality)videoQuality { self.youTubeURL = videoURL; self.quality = videoQuality; self.extractionExpression = @"(?!\\\\\")http[^\"]*?itag=[^\"]*?(?=\\\\\")"; - self.signatureExtractionExpression = @"(?<=sig\\\\\": \\\\\")[^\"]*?(?=\\\\\")"; + self.signatureExtractionExpression = @"(\\\\\\\"sig\\\\\\\": \\\\\\\"[^\"]+\\\\\")"; self.signAlgo = [NSJSONSerialization JSONObjectWithData:[algoJson dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil]; } return self; @@ -113,13 +113,12 @@ -(NSURL*)extractYouTubeURLFromFile:(NSString *)html error:(NSError *__autoreleas index = [videos count] - 1; } checkingResult = [videos objectAtIndex:index]; - NSMutableString* streamURL = [NSMutableString stringWithString: [string substringWithRange:checkingResult.range]]; [streamURL replaceOccurrencesOfString:@"\\\\u0026" withString:@"&" options:NSCaseInsensitiveSearch range:NSMakeRange(0, streamURL.length)]; [streamURL replaceOccurrencesOfString:@"\\\\\\" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, streamURL.length)]; - - // Check the signature: + + // Check the signature: if ([sigs count] > 0) { sigCheckingResult = [sigs objectAtIndex:index]; NSString* encrSyg = [string substringWithRange:sigCheckingResult.range]; From c143a3a8c5c6a2c9644a49d894e1411c6cb11ff9 Mon Sep 17 00:00:00 2001 From: Michael Rimestad Date: Fri, 4 Oct 2013 14:11:25 +0200 Subject: [PATCH 06/15] Added correct reange indexing of the encoded sig, added recursive call for function extraction to extract all needed js functions --- LBYouTubeView/LBYouTubeExtractor.m | 86 ++++++++++++++++++++++++------ 1 file changed, 69 insertions(+), 17 deletions(-) diff --git a/LBYouTubeView/LBYouTubeExtractor.m b/LBYouTubeView/LBYouTubeExtractor.m index e0eb9bb..d454c48 100644 --- a/LBYouTubeView/LBYouTubeExtractor.m +++ b/LBYouTubeView/LBYouTubeExtractor.m @@ -41,7 +41,7 @@ -(id)initWithURL:(NSURL *)videoURL quality:(LBYouTubeVideoQuality)videoQuality { self.quality = videoQuality; self.extractionExpression = @"(?!\\\\\")http[^\"]*?itag=[^\"]*?(?=\\\\\")"; self.signatureExtractionExpression = @"(\\\\\\\"sig\\\\\\\": \\\\\\\"[^\"]+\\\\\")"; - self.signAlgo = [NSJSONSerialization JSONObjectWithData:[algoJson dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil]; + self.signAlgo = [NSJSONSerialization JSONObjectWithData:[algoJson dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil]; } return self; } @@ -121,7 +121,12 @@ -(NSURL*)extractYouTubeURLFromFile:(NSString *)html error:(NSError *__autoreleas // Check the signature: if ([sigs count] > 0) { sigCheckingResult = [sigs objectAtIndex:index]; - NSString* encrSyg = [string substringWithRange:sigCheckingResult.range]; + NSString* encrSyg = [string substringWithRange:sigCheckingResult.range]; + + sig_regex = [[NSRegularExpression alloc] initWithPattern:@"(?<=sig\\\\\": \\\\\")[^\"]*?(?=\\\\\")" options:NSRegularExpressionCaseInsensitive error:nil]; + sigCheckingResult = [sig_regex firstMatchInString:encrSyg options:0 range:NSMakeRange(0, encrSyg.length)]; + + encrSyg = [encrSyg substringWithRange:sigCheckingResult.range]; NSString* sig = nil; @@ -133,18 +138,13 @@ -(NSURL*)extractYouTubeURLFromFile:(NSString *)html error:(NSError *__autoreleas if(signature_range.location != NSNotFound) { NSString * signature_functionName = [string substringWithRange:NSMakeRange(signature_range.location+10, signature_range.length-10)]; - //NSLog(@"got signature_functionName = %@", signature_functionName); //We need to extrach the javascript part of the HTML document contaning the function. - regexp = [[NSRegularExpression alloc] initWithPattern:[NSString stringWithFormat:@"function %@\\(([a-z,]+)\\)\\{([^}]+)\\}", signature_functionName] options:0 error:error]; + NSMutableString* jsCode = [self loadNeededJSFunctions:signature_functionName andContentFile:string andSearchDepth:1]; - NSRange function_range = [regexp rangeOfFirstMatchInString:string options:0 range:NSMakeRange(0, [string length])]; - - if(function_range.location != NSNotFound) + if(jsCode) { - //NSString * jsCode = @"function Gp(a){a=a.split("");a=a.reverse();a=a.slice(1);var b=a[0];a[0]=a[68%a.length];a[68]=b;return a.join("")}"; - NSString * jsCode = [string substringWithRange:function_range]; - JSContext *context = [[JSContext alloc] initWithVirtualMachine:[[JSVirtualMachine alloc] init]]; + JSContext *context = [[JSContext alloc] init]; [context evaluateScript:jsCode]; @@ -176,15 +176,67 @@ -(NSURL*)extractYouTubeURLFromFile:(NSString *)html error:(NSError *__autoreleas -(NSString *)decryptSignature:(NSString *)signature { - NSMutableString* res = [NSMutableString string]; - for (int i=0; i<[self.signAlgo count]; i++) { - NSNumber* index = [self.signAlgo objectAtIndex:i]; - NSRange range = {[index integerValue], 1}; - [res insertString:[signature substringWithRange:range] atIndex:i]; - } - return [NSString stringWithString:res]; + NSString * dectyptedString = [self _static_decrypt_signature:signature]; + + if(dectyptedString){ + return dectyptedString; + } + else{ + NSLog(@"Failed to staticly pass the string!"); + return signature; + } +} + +-(NSMutableString *)loadNeededJSFunctions:(NSString *)functionName andContentFile:(NSString *)content andSearchDepth:(int)depth +{ + if(depth > 10) + return [NSMutableString new]; + + NSMutableString * jsFunction = [NSMutableString new]; + + NSRegularExpression* regexp = [[NSRegularExpression alloc] initWithPattern:[NSString stringWithFormat:@"function %@\\(([a-z,]+)\\)\\{([^}]+)\\}", functionName] options:0 error:nil]; + + NSRange function_range = [regexp rangeOfFirstMatchInString:content options:0 range:NSMakeRange(0, [content length])]; + + if(function_range.length != NSNotFound) + { + //We have the function, read it out and check if we need to do recursive call + jsFunction = [NSMutableString stringWithString:[content substringWithRange:function_range]]; + + regexp = [[NSRegularExpression alloc] initWithPattern:@"(?<==)[a-zA-z]+(?=\\([0-9a-z,]+\\))" options:NSRegularExpressionCaseInsensitive error:nil]; + + NSArray *functionCalls = [regexp matchesInString:jsFunction options:0 range:NSMakeRange(0, jsFunction.length)]; + + if(functionCalls.count > 0) + { + //NSLog(@"loadNeededJSFunctions : Number of sub functions = %d", functionCalls.count); + NSMutableArray *functionNames = [NSMutableArray new]; + for (NSTextCheckingResult* func in functionCalls) { + NSString * name = [jsFunction substringWithRange:func.range]; + if([functionNames indexOfObject:name] == NSNotFound) + { + [functionNames addObject:name]; + } + } + + for (NSString* func in functionNames) + { + [jsFunction appendString:@"\n"]; + + [jsFunction appendString:[self loadNeededJSFunctions:func andContentFile:content andSearchDepth:depth++]]; + } + return jsFunction; + } + else + return jsFunction; + } + + NSLog(@"Warning : Unable to extract JS function...."); + return [NSMutableString new]; } + + -(NSString *)_static_decrypt_signature:(NSString *)signature{ // if age_gate{ // # The videos with age protection use another player, so the From 5e41b23f7af38a9000d0a51d05d9542025bd6e9e Mon Sep 17 00:00:00 2001 From: Michael Rimestad Date: Fri, 25 Oct 2013 19:18:54 +0200 Subject: [PATCH 07/15] Changed RegEx to be faster and to pick the correct urls --- LBYouTubeView/LBYouTubeExtractor.m | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/LBYouTubeView/LBYouTubeExtractor.m b/LBYouTubeView/LBYouTubeExtractor.m index d454c48..1906258 100644 --- a/LBYouTubeView/LBYouTubeExtractor.m +++ b/LBYouTubeView/LBYouTubeExtractor.m @@ -39,7 +39,8 @@ -(id)initWithURL:(NSURL *)videoURL quality:(LBYouTubeVideoQuality)videoQuality { if (self) { self.youTubeURL = videoURL; self.quality = videoQuality; - self.extractionExpression = @"(?!\\\\\")http[^\"]*?itag=[^\"]*?(?=\\\\\")"; + //self.extractionExpression = @"(?!\\\\\")http[^\"]*?itag=[^\"]*?(?=\\\\\")"; + self.extractionExpression = @"(\\\\\")http[^\"]*?itag=[^\"]*?(\\\\\")"; self.signatureExtractionExpression = @"(\\\\\\\"sig\\\\\\\": \\\\\\\"[^\"]+\\\\\")"; self.signAlgo = [NSJSONSerialization JSONObjectWithData:[algoJson dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil]; } @@ -95,8 +96,12 @@ -(NSURL*)extractYouTubeURLFromFile:(NSString *)html error:(NSError *__autoreleas NSRegularExpression* regex = [[NSRegularExpression alloc] initWithPattern:self.extractionExpression options:NSRegularExpressionCaseInsensitive error:error]; NSRegularExpression* sig_regex = [[NSRegularExpression alloc] initWithPattern:self.signatureExtractionExpression options:NSRegularExpressionCaseInsensitive error:nil]; + NSDate *start = [NSDate date]; NSArray* videos = [regex matchesInString:string options:0 range:NSMakeRange(0, [string length])]; - NSArray* sigs = [sig_regex matchesInString:string options:0 range:NSMakeRange(0, [string length])]; + NSTimeInterval interval = [[NSDate date] timeIntervalSinceDate:start]; + NSLog(@"Time used to get videos : %f", interval); + + NSArray* sigs = [sig_regex matchesInString:string options:0 range:NSMakeRange(0, [string length])]; if (videos.count > 0) { NSTextCheckingResult* checkingResult = nil; @@ -115,6 +120,7 @@ -(NSURL*)extractYouTubeURLFromFile:(NSString *)html error:(NSError *__autoreleas checkingResult = [videos objectAtIndex:index]; NSMutableString* streamURL = [NSMutableString stringWithString: [string substringWithRange:checkingResult.range]]; + [streamURL replaceOccurrencesOfString:@"\\\"" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, streamURL.length)]; [streamURL replaceOccurrencesOfString:@"\\\\u0026" withString:@"&" options:NSCaseInsensitiveSearch range:NSMakeRange(0, streamURL.length)]; [streamURL replaceOccurrencesOfString:@"\\\\\\" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, streamURL.length)]; From 85613f32951f4a4631a56ef4400b70923340f775 Mon Sep 17 00:00:00 2001 From: Marcos Alvarez Date: Wed, 18 Dec 2013 17:35:01 +0100 Subject: [PATCH 08/15] Added another regular expresion to find more videos.The HQ videos. --- LBYouTubeView/LBYouTubeExtractor.m | 1 + 1 file changed, 1 insertion(+) diff --git a/LBYouTubeView/LBYouTubeExtractor.m b/LBYouTubeView/LBYouTubeExtractor.m index 1906258..d4a024a 100644 --- a/LBYouTubeView/LBYouTubeExtractor.m +++ b/LBYouTubeView/LBYouTubeExtractor.m @@ -41,6 +41,7 @@ -(id)initWithURL:(NSURL *)videoURL quality:(LBYouTubeVideoQuality)videoQuality { self.quality = videoQuality; //self.extractionExpression = @"(?!\\\\\")http[^\"]*?itag=[^\"]*?(?=\\\\\")"; self.extractionExpression = @"(\\\\\")http[^\"]*?itag=[^\"]*?(\\\\\")"; +// self.extractionExpression = @"http[^\"]*?itag=[^\"]*?"; self.signatureExtractionExpression = @"(\\\\\\\"sig\\\\\\\": \\\\\\\"[^\"]+\\\\\")"; self.signAlgo = [NSJSONSerialization JSONObjectWithData:[algoJson dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil]; } From 325106b370a94f160fc7bace66a730943b84b69a Mon Sep 17 00:00:00 2001 From: Marcos Alvarez Date: Thu, 23 Jan 2014 13:33:23 +0100 Subject: [PATCH 09/15] Added a condition for not crashing the app with substringWithRage --- LBYouTubeView/LBYouTubeExtractor.m | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/LBYouTubeView/LBYouTubeExtractor.m b/LBYouTubeView/LBYouTubeExtractor.m index d4a024a..82fc48a 100644 --- a/LBYouTubeView/LBYouTubeExtractor.m +++ b/LBYouTubeView/LBYouTubeExtractor.m @@ -205,8 +205,12 @@ -(NSMutableString *)loadNeededJSFunctions:(NSString *)functionName andContentFil NSRange function_range = [regexp rangeOfFirstMatchInString:content options:0 range:NSMakeRange(0, [content length])]; - if(function_range.length != NSNotFound) + DLog(@"RANGE LOCATION:%d LENGTH: %d", function_range.location, function_range.length); + + if(function_range.length != NSNotFound && function_range.length > 0) { + DLog(@"RANGE LOCATION:%d LENGTH: %d", function_range.location, function_range.length); + //We have the function, read it out and check if we need to do recursive call jsFunction = [NSMutableString stringWithString:[content substringWithRange:function_range]]; From 5ad8dc3e4c0f6b2b9b279cadbfb0a7725095cae7 Mon Sep 17 00:00:00 2001 From: Marcos Alvarez Date: Mon, 27 Jan 2014 11:19:49 +0100 Subject: [PATCH 10/15] Added a comment. --- LBYouTubeView/LBYouTubeExtractor.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LBYouTubeView/LBYouTubeExtractor.m b/LBYouTubeView/LBYouTubeExtractor.m index 82fc48a..3abbcc9 100644 --- a/LBYouTubeView/LBYouTubeExtractor.m +++ b/LBYouTubeView/LBYouTubeExtractor.m @@ -40,7 +40,7 @@ -(id)initWithURL:(NSURL *)videoURL quality:(LBYouTubeVideoQuality)videoQuality { self.youTubeURL = videoURL; self.quality = videoQuality; //self.extractionExpression = @"(?!\\\\\")http[^\"]*?itag=[^\"]*?(?=\\\\\")"; - self.extractionExpression = @"(\\\\\")http[^\"]*?itag=[^\"]*?(\\\\\")"; + self.extractionExpression = @"(\\\\\")http[^\"]*?itag=[^\"]*?(\\\\\")"; //Expresion regular para buscar en el HTML (\\\")http[^\"]*?itag=[^\"]*?(\\\") // self.extractionExpression = @"http[^\"]*?itag=[^\"]*?"; self.signatureExtractionExpression = @"(\\\\\\\"sig\\\\\\\": \\\\\\\"[^\"]+\\\\\")"; self.signAlgo = [NSJSONSerialization JSONObjectWithData:[algoJson dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil]; From c4c71c1087ed51af02c6008bd5d1ecc1804b2c70 Mon Sep 17 00:00:00 2001 From: Marcos Alvarez Date: Fri, 4 Apr 2014 18:17:10 +0200 Subject: [PATCH 11/15] Changes done for arm64 architectures --- LBYouTubeView/LBYouTubeExtractor.m | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/LBYouTubeView/LBYouTubeExtractor.m b/LBYouTubeView/LBYouTubeExtractor.m index 3abbcc9..a7a9465 100644 --- a/LBYouTubeView/LBYouTubeExtractor.m +++ b/LBYouTubeView/LBYouTubeExtractor.m @@ -113,10 +113,10 @@ -(NSURL*)extractYouTubeURLFromFile:(NSString *)html error:(NSError *__autoreleas index = 0; } else if (self.quality == LBYouTubeVideoQualityMedium) { - index = MIN(videos.count-1, 1U); + index = (int)MIN(videos.count-1, 1U); } else { - index = [videos count] - 1; + index = (int)[videos count] - 1; } checkingResult = [videos objectAtIndex:index]; @@ -205,11 +205,11 @@ -(NSMutableString *)loadNeededJSFunctions:(NSString *)functionName andContentFil NSRange function_range = [regexp rangeOfFirstMatchInString:content options:0 range:NSMakeRange(0, [content length])]; - DLog(@"RANGE LOCATION:%d LENGTH: %d", function_range.location, function_range.length); + DLog(@"RANGE LOCATION:%d LENGTH: %lu", (int)function_range.location, (unsigned long)function_range.length); if(function_range.length != NSNotFound && function_range.length > 0) { - DLog(@"RANGE LOCATION:%d LENGTH: %d", function_range.location, function_range.length); + DLog(@"RANGE LOCATION:%d LENGTH: %lu", (int)function_range.location, (unsigned long)function_range.length); //We have the function, read it out and check if we need to do recursive call jsFunction = [NSMutableString stringWithString:[content substringWithRange:function_range]]; @@ -255,7 +255,7 @@ -(NSString *)_static_decrypt_signature:(NSString *)signature{ // if len(s) == 86: // return s[2:63] + s[82] + s[64:82] + s[63] // } - NSLog(@"length %d", signature.length); + NSLog(@"length %lu", (unsigned long)signature.length); switch (signature.length) { case 93: From a00e01c910758a3797f83e315ef517fde9968236 Mon Sep 17 00:00:00 2001 From: Marcos Alvarez Date: Fri, 30 May 2014 16:39:16 +0200 Subject: [PATCH 12/15] Fixed two warnings and added another user-agent proposed in github LBYouTubeView in our fork --- LBYouTubeView/LBYouTubeExtractor.m | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/LBYouTubeView/LBYouTubeExtractor.m b/LBYouTubeView/LBYouTubeExtractor.m index 3abbcc9..3d33795 100644 --- a/LBYouTubeView/LBYouTubeExtractor.m +++ b/LBYouTubeView/LBYouTubeExtractor.m @@ -10,6 +10,7 @@ #import static NSString* const kUserAgent = @"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3"; +//static NSString* const kUserAgent = @"Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25"; NSString* const kLBYouTubePlayerExtractorErrorDomain = @"LBYouTubeExtractorErrorDomain"; @@ -113,10 +114,10 @@ -(NSURL*)extractYouTubeURLFromFile:(NSString *)html error:(NSError *__autoreleas index = 0; } else if (self.quality == LBYouTubeVideoQualityMedium) { - index = MIN(videos.count-1, 1U); + index = (unsigned int)MIN(videos.count-1, 1U); } else { - index = [videos count] - 1; + index = (unsigned int)[videos count] - 1; } checkingResult = [videos objectAtIndex:index]; From 6bbf8fb74124f4dd622c01dd52775f70afcb3b0c Mon Sep 17 00:00:00 2001 From: Marcos Alvarez Date: Mon, 26 Jan 2015 18:52:29 +0100 Subject: [PATCH 13/15] Fixed warnings --- LBYouTubeView/LBYouTubeExtractor.m | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/LBYouTubeView/LBYouTubeExtractor.m b/LBYouTubeView/LBYouTubeExtractor.m index 3abbcc9..4f75fb3 100644 --- a/LBYouTubeView/LBYouTubeExtractor.m +++ b/LBYouTubeView/LBYouTubeExtractor.m @@ -113,10 +113,10 @@ -(NSURL*)extractYouTubeURLFromFile:(NSString *)html error:(NSError *__autoreleas index = 0; } else if (self.quality == LBYouTubeVideoQualityMedium) { - index = MIN(videos.count-1, 1U); + index = (int)MIN(videos.count-1, 1U); } else { - index = [videos count] - 1; + index = (int)[videos count] - 1; } checkingResult = [videos objectAtIndex:index]; @@ -205,11 +205,11 @@ -(NSMutableString *)loadNeededJSFunctions:(NSString *)functionName andContentFil NSRange function_range = [regexp rangeOfFirstMatchInString:content options:0 range:NSMakeRange(0, [content length])]; - DLog(@"RANGE LOCATION:%d LENGTH: %d", function_range.location, function_range.length); + DLog(@"RANGE LOCATION:%ld LENGTH: %ld", (unsigned long)function_range.location, (unsigned long)function_range.length); if(function_range.length != NSNotFound && function_range.length > 0) { - DLog(@"RANGE LOCATION:%d LENGTH: %d", function_range.location, function_range.length); + DLog(@"RANGE LOCATION:%ld LENGTH: %ld", (unsigned long)function_range.location, (unsigned long)function_range.length); //We have the function, read it out and check if we need to do recursive call jsFunction = [NSMutableString stringWithString:[content substringWithRange:function_range]]; @@ -255,7 +255,7 @@ -(NSString *)_static_decrypt_signature:(NSString *)signature{ // if len(s) == 86: // return s[2:63] + s[82] + s[64:82] + s[63] // } - NSLog(@"length %d", signature.length); + NSLog(@"length %ld", (unsigned long)signature.length); switch (signature.length) { case 93: From 56c562139a21b67ea4c85c8183f997da01c8d22e Mon Sep 17 00:00:00 2001 From: Marcos Alvarez Date: Mon, 26 Jan 2015 18:58:26 +0100 Subject: [PATCH 14/15] Ooooops --- LBYouTubeView/LBYouTubeExtractor.m | 8 -------- 1 file changed, 8 deletions(-) diff --git a/LBYouTubeView/LBYouTubeExtractor.m b/LBYouTubeView/LBYouTubeExtractor.m index a2829ac..f0b8e3a 100644 --- a/LBYouTubeView/LBYouTubeExtractor.m +++ b/LBYouTubeView/LBYouTubeExtractor.m @@ -117,11 +117,7 @@ -(NSURL*)extractYouTubeURLFromFile:(NSString *)html error:(NSError *__autoreleas index = (int)MIN(videos.count-1, 1U); } else { -<<<<<<< HEAD - index = (unsigned int)[videos count] - 1; -======= index = (int)[videos count] - 1; ->>>>>>> deattached } checkingResult = [videos objectAtIndex:index]; @@ -260,11 +256,7 @@ -(NSString *)_static_decrypt_signature:(NSString *)signature{ // if len(s) == 86: // return s[2:63] + s[82] + s[64:82] + s[63] // } -<<<<<<< HEAD - NSLog(@"length %lu", (unsigned long)signature.length); -======= NSLog(@"length %ld", (unsigned long)signature.length); ->>>>>>> deattached switch (signature.length) { case 93: From 3287cb4c36f40250b4932a30d1ff507702178273 Mon Sep 17 00:00:00 2001 From: Marcos Date: Wed, 11 Oct 2017 20:02:11 +0100 Subject: [PATCH 15/15] Fixed warnings --- LBYouTubeView/LBYouTubeExtractor.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LBYouTubeView/LBYouTubeExtractor.m b/LBYouTubeView/LBYouTubeExtractor.m index f0b8e3a..e89607f 100644 --- a/LBYouTubeView/LBYouTubeExtractor.m +++ b/LBYouTubeView/LBYouTubeExtractor.m @@ -515,7 +515,7 @@ -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLRespons capacity = 0; } - self.buffer = [[NSMutableData alloc] initWithCapacity:capacity]; + self.buffer = [[NSMutableData alloc] initWithCapacity:(NSInteger)capacity]; } -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {