YouTube video link detection programmatically in Objective-C

I need to download and save videos from video sites like youtube. I want to save them to the iPhone video library. How can I detect videos and save them in the library? I already checked some available sources. This is what I did in the download action, but does not work.

- (IBAction)download { [downloadButton setEnabled:NO]; [webView setUserInteractionEnabled:NO]; UIUserInterfaceIdiom userInterfaceIdiom = [UIDevice currentDevice].userInterfaceIdiom; NSString *getURL = @""; if (userInterfaceIdiom == UIUserInterfaceIdiomPhone) { getURL = [webView stringByEvaluatingJavaScriptFromString:@"function getURL() {var player = document.getElementById('player'); var video = player.getElementsByTagName('video')[0]; return video.getAttribute('src');} getURL();"]; } else { getURL = [webView stringByEvaluatingJavaScriptFromString:@"function getURL() {var bh = document.getElementsByClassName('bh'); if (bh.length) {return bh[0].getAttribute('src');} else {var zq = document.getElementsByClassName('zq')[0]; return zq.getAttribute('src');}} getURL();"]; } NSString *getTitle = [webView stringByEvaluatingJavaScriptFromString:@"function getTitle() {var jm = document.getElementsByClassName('jm'); if (jm.length) {return jm[0].innerHTML;} else {var lp = document.getElementsByClassName('lp')[0]; return lp.childNodes[0].innerHTML;}} getTitle();"]; NSString *getTitleFromChannel = [webView stringByEvaluatingJavaScriptFromString:@"function getTitleFromChannel() {var video_title = document.getElementById('video_title'); return video_title.childNodes[0].innerHTML;} getTitleFromChannel();"]; NSLog(@"%@, %@, %@", getURL, getTitle, getTitleFromChannel); [webView setUserInteractionEnabled:YES]; NSArray *components = [getTitle componentsSeparatedByCharactersInSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]]; getTitle = [components componentsJoinedByString:@" "]; if ([getURL length] > 0) { if ([getTitle length] > 0) { videoTitle = [getTitle retain]; bar = [[UIDownloadBar alloc] initWithURL:[NSURL URLWithString:getURL] progressBarFrame:CGRectMake(85.0, 17.0, 150.0, 11.0) timeout:15 delegate:self]; [bar setProgressViewStyle:UIProgressViewStyleBar]; [toolbar addSubview:bar]; } else { NSArray *components = [getTitleFromChannel componentsSeparatedByCharactersInSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]]; getTitleFromChannel = [components componentsJoinedByString:@" "]; if ([getTitleFromChannel length] > 0) { videoTitle = [getTitleFromChannel retain]; bar = [[UIDownloadBar alloc] initWithURL:[NSURL URLWithString:getURL] progressBarFrame:CGRectMake(85.0, 17.0, 150.0, 11.0) timeout:15 delegate:self]; [bar setProgressViewStyle:UIProgressViewStyleBar]; [toolbar addSubview:bar]; } else { //NSLog(@"%@", [webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName('html')[0].innerHTML;"]); UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"MyTube" message:@"Couldn't get video title." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; [alertView release]; [downloadButton setEnabled:YES]; } } } else { //NSLog(@"%@", [webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName('html')[0].innerHTML;"]); UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"MyTube" message:@"Couldn't get MP4 URL." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; [alertView release]; [downloadButton setEnabled:YES]; } } 
+7
source share
2 answers

You can save downloaded videos either in a photo album or in the application directory itself. To download a video you need to create a link to download the corresponding video. If you download videos from youtube, see this source code https://github.com/comonitos/youtube_video . Some sites are limited to download, which may not be possible. For all other sites, by creating a downloadable URL, you can make it work

+2
source

This will capture video ids if you consistently expect them to be in a <object>. Regex will obviously need to be changed if it is in an iframe.

 NSError *error = nil; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"<object .*name=\"movie\" value=\"[a-zA-z:\\/]*.com\\/\\w*\\/([A-Za-z0-9\\_-]*).*<\\/object>" options:NSRegularExpressionCaseInsensitive error:&error]; [regex enumerateMatchesInString:pageSource options:0 range:NSMakeRange(0, [string length]) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){ NSString *videoID = [pageSource substringWithRange:[match rangeAtIndex:1]]; }]; 
+3
source

All Articles