// package Ġch . ab ert sch i . not i play . playback . yt Ċ // Ċ // import Ġandroid . annotation . Target Api Ċ // import Ġandroid . os . Build Ċ // import Ġandroid . os . Handler Ċ // import Ġandroid . os . Looper . get Main Looper Ċ // import Ġandroid . webkit .* Ċ // import Ġokhttp 3 . Ok HttpClient Ċ // import Ġokhttp 3 . Request Ċ // import Ġorg . jetbrains . ank o . An ko Logger Ċ // import Ġorg . jetbrains . ank o . info Ċ // import Ġorg . mort bay . log . Log . warn Ċ // Ċ // /** Ċ // Ġ* ĠCreated Ġby Ġab ert sch i Ġon Ġ 2 3 . 0 2 . 1 8 . Ċ // Ġ*/ Ċ // class ĠA db locker ( val ĠwebView : ĠWebView ) Ġ: ĠWebView Client (), ĠAn ko Logger Ġ{ Ċ // Ċ // ĠĠĠ Ġvar Ġon Stop : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull Ċ // Ċ // ĠĠĠ Ġval Ġhandler Ġ= ĠHandler ( get Main Looper ()) Ċ // Ċ // ĠĠĠ Ġprivate Ġval Ġjquery Url Ġ= Ġ" http :// code . jquery . com / jquery - 3 . 3 . 1 . min . js " Ċ // ĠĠĠ Ġprivate Ġvar Ġgoogle Yt V 3 Video Api Ġ= Ġ" https :// www . googleapis . com / youtube / v 3 /" Ċ // Ċ // ĠĠĠ Ġprivate Ġval Ġblocked Urls Ġ= ĠlistOf < String >( Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// www . youtube . com / signin ? context = popup ", Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// www . youtube . com / share _ ajax ? action _ get _ share _ info =", Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// www . youtube . com / watch ? time _ continue =", Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ" photo . jpg ", Ġ" https :// googleads ") Ċ // Ċ // Ċ // ĠĠĠ Ġprivate Ġvar Ġblocking Requests Ġ= Ġfalse Ċ // Ċ // ĠĠĠ Ġ// ĠHandle ĠAPI Ġuntil Ġlevel Ġ 2 1 Ċ // ĠĠĠ Ġoverride Ġfun Ġshould Intercept Request ( view : ĠWebView , Ġurl : ĠString ): ĠWeb Resource Response ? Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( url . contains ( jquery Url )) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . should Intercept Request ( view , Ġurl ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget New Response ( url ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġ@ Target Api ( Build . VERSION _ CODES . LO L LI POP ) Ċ // ĠĠĠ Ġoverride Ġfun Ġshould Intercept Request ( view : ĠWebView ?, Ġrequest : ĠWeb Resource Request ?): Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠWeb Resource Response ? Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġrequest ?. url . toString () Ċ //// ĠĠĠĠĠĠĠ Ġdebug Ġ{ Ġ" loading Ġ" Ġ+ Ġurl Ġ} Ċ // ĠĠĠĠĠĠĠ Ġblocked Urls . forEach ({ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( url . contains ( it )) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblocking Requests Ġ= Ġtrue Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ}) Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( blocking Requests ) Ġ{ Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo Ġ{ Ġ" stop Ġloading Ġ" Ġ+ Ġurl Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠwebView ?. stop Loading () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblocking Requests Ġ= Ġfalse Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( jquery Url Ġin Ġurl ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . should Intercept Request ( view , Ġrequest ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġget New Response ( url ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġprivate Ġfun Ġget New Response ( url : ĠString ): ĠWeb Resource Response ? Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( url . contains ("/ end Process ")) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġon Stop ?. invoke () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠWeb Resource Response (" bg sType ", Ġ" some Encoding ", Ġnull ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġinfo Ġ{ Ġ"# intercept ing : Ġ" Ġ+ Ġurl Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( url . contains (" google video . com / vide oplay back ? ")) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fetch Download Ġ&& Ġdownload Handle Ġ!= Ġnull ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Handle ?. on Video Url Fetch ( url ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= Ġurl . trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} Ċ // ĠĠĠĠĠĠĠ Ġvar Ġorigin Ġ= Ġif Ġ( url . startsWith ( google Yt V 3 Video Api )) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ" null " Ċ // ĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// www . youtube . com " Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġtry Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= ĠRequest . Builder () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. url ( address ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Header (" Origin ", Ġorigin ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Header (" origin ", Ġorigin ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Header (" Refer er ", Ġorigin ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Header (" Access - Control - Allow - Credentials ", Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" false ") Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fetch Download ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb . add Header (" user - agent ", Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Mozilla / 5 . 0 Ġ( i Pad ; ĠCPU ĠOS Ġ 7 _ 0 Ġlike ĠMac ĠOS ĠX ) ĠAppleWebKit / 5 3 7 . 5 1 . 1 Ġ( KHTML , Ġlike ĠGecko ) ĠCri OS / 3 0 . 0 . 1 5 9 9 . 1 2 ĠMobile / 1 1 A 4 6 5 ĠSafari / 8 5 3 6 . 2 5 Ġ( 3 B 9 2 C 1 8 B - D 9 DE - 4 CB 7 - A 0 2 A - 2 2 FD 2 AF 1 7 C 8 F )") Ċ //// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Apple WebKit / 5 3 6 . 2 6 Ġ( KHTML , Ġlike ĠGecko ) Ġ" Ġ+ Ċ //// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Version / 6 . 0 ĠMobile / 1 0 A 5 3 7 6 e ĠSafari / 8 5 3 6 . 2 5 ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġb . build () Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠhttpClient . new Call ( request ). execute () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheaders Ġ= ĠHashMap < String , ĠString >() Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġheaders . run Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput (" Connection ", Ġ" close ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput (" Access - Control - Allow - Methods ", Ġ" POST , GET , OPTIONS , PUT , DELETE ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput (" Access - Control - Max - Age ", Ġ" 1 2 0 0 ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput (" Access - Control - Allow - Origin ", Ġorigin ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput (" Access - Control - Allow - Credentials ", Ġ" true ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput (" Access - Control - Expose - Headers ", Ġhttp Headers ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput (" Access - Control - Allow - Headers ", Ġhttp Headers ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠWeb Resource Response ( null , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . header (" content - encoding ", Ġ" utf - 8 ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġ 2 0 0 , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ok ", Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheaders , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . body ()?. byte Stream ()) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġwarn (" error Ġwith Ġ" Ġ+ Ġaddress ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġwarn ( e ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġoverride Ġfun Ġon Received Error ( view : ĠWebView , Ġrequest : ĠWeb Resource Request , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror : ĠWeb Resource Error ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġsuper . on Received Error ( view , Ġrequest , Ġerror ) Ċ // ĠĠĠĠĠĠĠ Ġwarn (" loading Ġweb Ġview : Ġrequest : Ġ$ request Ġerror : Ġ$ error ") Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġoverride Ġfun Ġon Page Finished ( view : ĠWebView ?, Ġurl : ĠString ?) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġsuper . on Page Finished ( view , Ġurl ) Ċ // ĠĠĠĠĠĠĠ Ġdownload Handle ?. on Page in ished ( view , Ġurl ) Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġinterface ĠDownload Handle Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġfun Ġon Video Url Fetch ( url : ĠString ) Ċ // ĠĠĠĠĠĠĠ Ġfun Ġon Page in ished ( view : ĠWebView ?, Ġurl : ĠString ?) Ċ // ĠĠĠ Ġ} Ċ //}