2012-07-18 61 views
7

我需要下载并保存视频网站(如YouTube)的视频。我想将它们保存到iPhone的视频库中。如何检测视频并将它们保存到库中?我已经检查了一些可用的源代码。这是我在下载操作中所做的,但不起作用。以目标c编程方式检测youtube视频链接

- (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]; 
    } 
} 
+0

我也需要同样的事情,因为YouTube包含的JavaScript,而不是HTTP或HTTPS reqeust – dark 2012-08-14 07:49:07

+1

当你说“它不工作”,你可以更具体一点吗? – Abizern 2012-08-14 07:50:58

+0

@alpz有没有更新? – 2012-08-30 04:36:37

回答

2

可以节省下载的视频无论是照片的相册或app目录itself.For视频下载u必须生成相应的video.In从网站YouTube下载视频的情况下的downloadble链接,请参阅此源代码https://github.com/comonitos/youtube_video。有些网站是可能无法下载的限制网站。在所有其他网站通过生成可下载网址的情况下,您可以使其工作

3

如果您始终期望它们位于<对象>格式。 正则表达式显然需要在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]];   
}]; 
+1

为什么downvote? – endy 2012-08-17 15:02:36