Obtenga la URL del video de AVPlayer en UIWebView

Estoy tratando de detectar la URL de la reproducción de video actual desde UIWebView, con este método:

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool { NotificationCenter.default.addObserver(self, selector: #selector(playerItemBecameCurrent(notification:)), name: NSNotification.Name("AVPlayerItemBecameCurrentNotification"), object: nil) //urlTextField.text = webView.request?.url?.absoluteString return true } func playerItemBecameCurrent(notification:Notification) { let playerItem: AVPlayerItem? = notification.object as? AVPlayerItem if playerItem == nil { return } // Break down the AVPlayerItem to get to the path let asset: AVURLAsset? = (playerItem?.asset as? AVURLAsset) let url: URL? = asset?.url let path: String? = url?.absoluteString print(path!) } 

Este código funciona pero la URL del video no contiene ninguna extensión de file de video: por ejemplo, aquí están las ULR de video de YouTube y Vimeo:

 https://r5---sn-ab5l6nzr.googlevideo.com/videoplayback?mime=video%2Fmp4&requiressl=yes&clen=27257208&mn=sn-ab5l6nzr&mm=31&mv=m&mt=1499534990&key=yt6&ms=au&source=youtube&ip=107.182.226.163&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cexpire&initcwndbps=3565000&id=o-ACG22m-TtwyC8tSG_AHUJk3qOPvhUm1X_-qRjy07pjIx&ei=-hZhWZXcJ_aV8gS2tbCQDg&lmt=1497638262979584&ratebypass=yes&gir=yes&pl=25&expire=1499556698&dur=316.093&signature=94C8ED3E4AF64A7AC9F1B7E226454823B236CA55.C18F5F5D9D314B73EDD01DFC4EA3CEA1621AC6C7&ipbits=0&itag=18&cpn=Wb3RPNfJRcFx5P-x&c=MWEB&cver=1.20170706&ptk=TiTV2010%2Buser&oid=1nI2Jk44kRu4HLE6kGDUrA&ptchn=E2VhHmwp3Y_wZvgz_LJvfg&pltype=content 

y Vimeo:

 https://36skyfiregce-vimeo.akamaized.net/exp=1499539063~acl=%2F222646835%2F%2A~hmac=dc3caeb64501f537e2795ee8e121aed75a7eed9ba4e1b921fe92c757fe06b314/222646835/video/778109097,778109103,778109102,778109101/master.m3u8?f=dash 

En primer lugar, quiero decirte que tu encoding funciona bien.

Servidor espejo

Esto se debe a que, durante el process de carga, descarga y transmisión, google está utilizando un server espejo con el nombre de dominio googlevideo.com .

Usted accede al video del enlace mientras está en estado de transmisión. Obtendrás ese enlace espejo solo. Youtube videos residían dentro de este server espejo.

Mismo como ese Vimeo está utilizando el server espejo akamaized.net

Refiera el SO POST Para la aclaración

Deencoding del vínculo de video desde la URL de espejo

Por lo tanto, en esta condición, lo que necesitamos tener es id único de video en YouTube y se puede acceder al mismo al agregar la url https://www.youtube.com/watch?v=id_here

Para decodificar la identificación única de esta url de espejo es imposible ya que por SO Respuesta

Han agregado este concepto de server espejo, es para tener algo de security.

Según YouTube T & C .. sección 5B aquí – http://www.youtube.com/static?template=terms

La descarga de contenido de YouTube no cumple con las Tearms of Service de YouTube.

Hay algunas API privadas como PSYouTubeExtractor .

Creo que necesitas tener URL de video para download.

Puede get el tipo MIME y los datos sin formatting como este:

 func playerItemBecameCurrent(notification:Notification) { guard let playerItem = notification.object as? AVPlayerItem, let asset = playerItem.asset as? AVURLAsset else {return} let url = asset.url var response: URLResponse? = nil var request = URLRequest(url: url) request.httpMethod = "HEAD" try? NSURLConnection.sendSynchronousRequest(request, returning: &response) print(response?.mimeType) //not the best way to do it //let data = try? Data(contentsOf: asset.url) } 

Luego puede elegir la extensión adecuada que coincida con el tipo MIME. Puede get todos los types compatibles llamando a AVURLAsset.audiovisualMIMETypes()

 [[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(playerItemBecameCurrent:)name:@"AVPlayerItemBecameCurrentNotification" object:nil]; -(void)playerItemBecameCurrent:(NSNotification*)notification { AVPlayerItem *playerItem = [notification object]; if(playerItem == nil) return; // Break down the AVPlayerItem to get to the path AVURLAsset *asset = (AVURLAsset*)[playerItem asset]; NSURL *url = [asset URL]; NSString *path = [url absoluteString]; }