Get video URL from AVPlayer in UIWebView

I am trying to determine the URL of the current video playback from a UIWebView using this method:

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!) } 

This code works, but the video URL does not contain a video file extension: for example, here is YouTube and Vimeo video ULR:

 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 

and vimeo:

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

Firstly, I want to tell you that coding is working fine.

Mirror server

This is because Google uses a mirrored server with the googlevideo.com domain name during download, download, and streaming.

You get access to the video image in streaming mode. You will get only this mirror link. Youtube videos located inside this mirror server.

Same as Vimeo using akamaized.net mirror server

Refer to SO POST for details.

Decoding Link to a video with a mirror URL

Thus, in this state, we need to have a unique YouTube video identifier and can be accessed by adding the url https://www.youtube.com/watch?v=id_here

To decode a unique identifier from this mirror, url is not possible, since the SO response

They added this mirror server concept to provide some security.

In accordance with section 5B of the T & C .. section here - http://www.youtube.com/static?template=terms

Downloading YouTube content does not meet the requirements of the YouTube Tears service.

There are some private APIs such as PSYouTubeExtractor .

I think you need to have the url of the video to download.

0
source share

You can get the MIME type and raw data as follows:

 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) } 

Then you can select the appropriate extension corresponding to the MIME type. You can get all supported types by calling AVURLAsset.audiovisualMIMETypes()

0
source share

All Articles