2012-07-18 2 views
7

Necesito descargar y guardar videos de sitios de videos como youtube. Quiero guardarlos en la biblioteca de videos del iPhone. ¿Cómo puedo detectar los videos y guardarlos en la biblioteca? Ya revisé algunos códigos fuente disponibles. Esto es lo que hice en la acción de descarga, pero no está funcionando.detectando enlaces de video de YouTube programáticamente en el objetivo c

- (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

también necesito lo mismo porque youtube contiene javascript en lugar de HTTP o HTTPS reqeust – dark

+1

Cuando dice "No está funcionando", puede ser más específico? – Abizern

+0

@alpz ¿Alguna actualización? –

Respuesta

2

Puede guardar los videos descargados o bien a las fotos del álbum o en el directorio de aplicación itself.For descarga de videos u tiene que generar un enlace descargable del correspondiente video.In el caso de la descarga de vídeos desde el sitio YouTube, consulte este código fuente https://github.com/comonitos/youtube_video. Algunos sitios son descargas restringidas que pueden no ser posibles. En el caso de todos los demás sitios generando la URL descargable, puede hacer que funcione

3

Esto captará los identificadores de video si siempre espera que estén en el < objeto> formato. Regex obviamente tendrá que ser cambiado si está en un 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

¿Por qué el voto a favor? – endy

Cuestiones relacionadas