@ -7,24 +7,63 @@ import Foundation
import UIKit
import UIKit
import WebBrowser
import WebBrowser
import WebKit
import WebKit
import Alamofire
class BrowserController : UIViewController , ItemController , WebBrowserDelegate , UINavigationControllerDelegate {
class BrowserController : UIViewController , ItemController , WebBrowserDelegate , UINavigationControllerDelegate , WKScriptMessageHandler , WKHTTPCookieStoreObserver {
var completionHandler : ( ( ) -> Void ) ?
var completionHandler : ( ( ) -> Void ) ?
var currentItem : MediaItem ?
var web : WebBrowserViewController ?
func setItems ( items : [ MediaItem ] ) {
func setItems ( items : [ MediaItem ] ) {
}
}
func setCurrentItem ( item : MediaItem ) {
func setCurrentItem ( item : MediaItem ) {
currentItem = item
}
}
func setCompletionHandler ( handler : @ escaping ( ( ) -> Void ) ) {
func setCompletionHandler ( handler : @ escaping ( ( ) -> Void ) ) {
completionHandler = handler
completionHandler = handler
}
}
func cookiesDidChange ( in cookieStore : WKHTTPCookieStore ) {
cookieStore . getAllCookies { cookies in
print ( cookies )
}
}
override func viewDidLoad ( ) {
override func viewDidLoad ( ) {
let webBrowserViewController = WebBrowserViewController ( )
let preferences = WKPreferences ( )
preferences . setValue ( true , forKey : " allowFileAccessFromFileURLs " )
let config = WKWebViewConfiguration ( )
config . preferences = preferences
config . allowsInlineMediaPlayback = true
config . allowsAirPlayForMediaPlayback = false
config . userContentController . add ( self , name : " openDocument " )
config . userContentController . add ( self , name : " jsError " )
config . setValue ( true , forKey : " _allowUniversalAccessFromFileURLs " )
config . websiteDataStore = WKWebsiteDataStore . nonPersistent ( )
config . websiteDataStore . httpCookieStore . add ( self )
let cookiesStore = config . websiteDataStore . httpCookieStore
let cookieProps : [ HTTPCookiePropertyKey : Any ] = [
HTTPCookiePropertyKey . domain : " URL " ,
HTTPCookiePropertyKey . path : " / " ,
HTTPCookiePropertyKey . name : " key " ,
HTTPCookiePropertyKey . value : " value " ,
HTTPCookiePropertyKey . secure : " TRUE " ,
HTTPCookiePropertyKey . expires : NSDate ( timeIntervalSinceNow : 209000 )
]
cookiesStore . setCookie ( HTTPCookie ( properties : cookieProps ) ! )
let webBrowserViewController = WebBrowserViewController ( configuration : config )
web = webBrowserViewController
web ? . getWKWebView ( ) . customUserAgent = " Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5 " ;
webBrowserViewController . delegate = self
webBrowserViewController . delegate = self
@ -38,19 +77,95 @@ class BrowserController : UIViewController, ItemController, WebBrowserDelegate,
webBrowserViewController . isShowPageTitleInNavigationBar = true
webBrowserViewController . isShowPageTitleInNavigationBar = true
// w e b B r o w s e r V i e w C o n t r o l l e r . c u s t o m A p p l i c a t i o n A c t i v i t i e s = . . .
// w e b B r o w s e r V i e w C o n t r o l l e r . c u s t o m A p p l i c a t i o n A c t i v i t i e s = . . .
webBrowserViewController . loadURLString ( " https://www.xvideos.com " )
webBrowserViewController . loadURLString ( currentItem ! . name )
webBrowserViewController . onOpenExternalAppHandler = { [ weak self ] _ in
webBrowserViewController . onOpenExternalAppHandler = { [ weak self ] _ in
guard let ` self ` = self else { return }
guard let ` self ` = self else { return }
self . completionHandler ! ( )
self . completionHandler ! ( )
// s e l f . n a v i g a t i o n C o n t r o l l e r ? . p o p V i e w C o n t r o l l e r ( a n i m a t e d : t r u e )
// s e l f . n a v i g a t i o n C o n t r o l l e r ? . p o p V i e w C o n t r o l l e r ( a n i m a t e d : t r u e )
}
}
let reviewButton = UIBarButtonItem ( title : " download " , style : UIBarButtonItem . Style . plain , target : self , action : #selector ( BrowserController . doDownload ( _ : ) ) )
webBrowserViewController . navigationItem . rightBarButtonItems = [ reviewButton ]
navigationController ? . delegate = self
navigationController ? . delegate = self
navigationController ? . pushViewController ( webBrowserViewController , animated : true )
navigationController ? . pushViewController ( webBrowserViewController , animated : true )
// p r e s e n t ( w e b B r o w s e r V i e w C o n t r o l l e r , a n i m a t e d : f a l s e )
// p r e s e n t ( w e b B r o w s e r V i e w C o n t r o l l e r , a n i m a t e d : f a l s e )
}
}
func webBrowser ( _ webBrowser : WebBrowserViewController , didStartLoad url : URL ? ) {
@objc public func doDownload ( _ sender : AnyObject ) {
executeDocumentDownloadScript ( webView : web ! . getWKWebView ( ) , forAbsoluteUrl : " hello " )
}
public func userContentController ( _ userContentController : WKUserContentController , didReceive message : WKScriptMessage ) {
debugPrint ( " did receive message \( message . name ) " )
if ( message . name = = " openDocument " ) {
do {
let data = ( message . body as ! String ) . data ( using : . utf8 )
let jsonObject = try JSONSerialization . jsonObject ( with : data ! , options : [ ] )
handleDocument ( jsonObject as ! [ String ] )
} catch {
}
} else if ( message . name = = " jsError " ) {
debugPrint ( message . body as ! String )
}
}
private func handleDocument ( _ strings : [ String ] ) {
print ( strings )
let alertController = UIAlertController ( title : " Download " , message : " Videos found " , preferredStyle : . alert )
for s in strings {
var name = s
if let u = URL ( string : s ) {
name = u . lastPathComponent
}
let oneAction = UIAlertAction ( title : name , style : . default ) { ( action ) in
self . preview ( url : s )
}
alertController . addAction ( oneAction )
}
let cancelAction = UIAlertAction ( title : " Cancel " , style : . cancel ) { ( action ) in
}
alertController . addAction ( cancelAction )
web ! . present ( alertController , animated : true ) {
}
}
func preview ( url : String ) {
let vc = VideoController ( )
let name = URL ( string : url ) ! . lastPathComponent
let item = MediaItem ( name : name , path : name , root : " " , type : ItemType . VIDEO )
item . externalURL = url
vc . setItems ( items : [ item ] )
vc . setCurrentItem ( item : item )
vc . setCompletionHandler ( handler : {
self . dismiss ( animated : true , completion : nil ) ;
} )
let navController = UINavigationController ( rootViewController : ( vc as UIViewController ) )
navController . modalPresentationStyle = . fullScreen
navController . modalPresentationCapturesStatusBarAppearance = true
navController . navigationBar . barTintColor = UIColor . black
( vc as UIViewController ) . navigationItem . leftItemsSupplementBackButton = true
self . present ( navController , animated : false , completion : nil )
}
func webBrowser ( _ webBrowser : WebBrowserViewController , didStartLoad url : URL ? ) {
print ( url ? . absoluteString )
}
}
func webBrowser ( _ webBrowser : WebBrowserViewController , didFinishLoad url : URL ? ) {
func webBrowser ( _ webBrowser : WebBrowserViewController , didFinishLoad url : URL ? ) {
@ -74,4 +189,31 @@ class BrowserController : UIViewController, ItemController, WebBrowserDelegate,
}
}
}
}
// f u n c w e b B r o w s e r ( _ w e b B r o w s e r : W e b B r o w s e r V i e w C o n t r o l l e r , d e c i d e P o l i c y F o r n a v i g a t i o n A c t i o n : W K N a v i g a t i o n A c t i o n , d e c i s i o n H a n d l e r : @ e s c a p i n g ( W K N a v i g a t i o n A c t i o n P o l i c y ) - > V o i d ) - > B o o l {
// l e t u r l = n a v i g a t i o n A c t i o n . r e q u e s t . u r l
// d e c i s i o n H a n d l e r ( . c a n c e l )
// l e t c l o s u r e = w e b B r o w s e r . g e t W K W e b V i e w ( )
// e x e c u t e D o c u m e n t D o w n l o a d S c r i p t ( w e b V i e w : c l o s u r e , f o r A b s o l u t e U r l : u r l ! . a b s o l u t e S t r i n g )
//
// r e t u r n t r u e
// }
/*
Intercept the download of documents in webView , trigger the download in JavaScript and pass the binary file to JavaScript handler in Swift code
*/
private func executeDocumentDownloadScript ( webView : WKWebView , forAbsoluteUrl absoluteUrl : String ) {
// TODO: A d d m o r e s u p p o r t e d m i m e - t y p e s f o r m i s s i n g c o n t e n t - d i s p o s i t i o n h e a d e r s
do {
let js = try String ( contentsOf : URL ( string : " http://linkstation:8089/ren/web/download.js " ) ! , encoding : . utf8 )
let j = js . replacingOccurrences ( of : " (absoluteUrl) " , with : absoluteUrl )
webView . evaluateJavaScript ( j ) { ( result , err ) in
if ( err != nil ) {
debugPrint ( " JS ERR: \( String ( describing : err ) ) " )
}
}
} catch {
print ( error )
}
}
}
}