package Ġme . it dog . rs sth is . rar bg Ċ Ċ import Ġcom . google . gson . JsonObject Ċ import Ġcom . google . gson . Json Parser Ċ import Ġokhttp 3 .* Ċ import Ġjava . net . Proxy Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent .* Ċ Ċ class ĠR ar bg Api ( proxy : ĠProxy ?) Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠAPP _ ID : ĠString Ġ= Ġ" rs sth is _ rar bg -${ UUID . randomUUID () }" ĊĠĠĠ Ġprivate Ġval ĠREQ _ WAIT _ M ILL IS Ġ= Ġ 2 0 0 0 L Ġ// Ġrate Ġcontrol ĊĠĠĠ Ġprivate Ġval Ġexecutor Ġ= ĠThreadPool Executor ( ĊĠĠĠĠĠĠĠĠ 1 , Ġ 1 , Ġ 6 0 , ĠTimeUnit . SECONDS , ĊĠĠĠĠĠĠĠ ĠLinked BlockingQueue () ĊĠĠĠ Ġ) Ġ// Ġsingle Ġthread Ġrequest Ġfor Ġrate Ġcontrol ĊĠĠĠ Ġprivate Ġval ĠBASE _ URL Ġ= Ġ" https :// torrent api . org / pub api _ v 2 . php ? app _ id =$ APP _ ID " ĊĠĠĠ Ġprivate Ġvar Ġtoken Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġvar Ġlast Request Millis Ġ= Ġ 0 L ĊĊĠĠĠ Ġ// Ġokhttp ĊĠĠĠ Ġprivate Ġval Ġclient : ĠOk HttpClient ĊĠĠĠ Ġprivate Ġval Ġtest Client : ĠOk HttpClient ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġexecutor . allow Core Thread TimeOut ( true ) ĊĠĠĠĠĠĠĠ Ġclient Ġ= ĠOk HttpClient (). newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Interceptor ( Token Refresh Interceptor ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. proxy ( proxy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġtest Client Ġ= ĠOk HttpClient (). newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. proxy ( proxy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor () Ġ: Ġthis ( null ) ĊĊĠĠĠ Ġinner Ġclass ĠToken Refresh Interceptor Ġ: ĠInter ceptor Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġintercept ( chain : ĠInter ceptor . Chain ): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġreq Ġ= Ġchain . request () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrate Ġcontrol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġlast Ġrequest Ġless Ġthen ĠREQ _ WAIT _ M ILL IS Ġago , Ġwait Ġuntil ĠREQ _ WAIT _ M ILL IS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Sleep Ġ= ĠREQ _ WAIT _ M ILL IS Ġ- Ġ( System . currentTimeMillis () Ġ- Ġlast Request Millis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( to Sleep Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("[ ${ DateTime Formatter . ISO _ DATE _ TIME . format ( LocalDateTime . now ()) }] ĠSleep Ġ$ to Sleep Ġms ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( to Sleep ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd / replace Ġtoken ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token . isEmpty ()) Ġtoken Ġ= ĠgetToken () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreq Ġ= Ġreq . new With Token ( token ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresp Ġ= Ġchain . proceed ( req ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("[ ${ DateTime Formatter . ISO _ DATE _ TIME . format ( LocalDateTime . now ()) }] Ġ${ req . url () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Request Millis Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġretry Ġrequest Ġfor Ġtoken Ġrelated Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resp . is Successful Ġ&& Ġresp . body () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcontentType Ġ= Ġresp . body () !!. contentType () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġresp . body () !!. string () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠJson Parser () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġparser . parse ( content ). as JsonObject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . has (" error _ code ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġset Of ( 2 , Ġ 4 ). contains ( result . get (" error _ code "). as Int ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= ĠgetToken () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresp Ġ= Ġchain . proceed ( req . new With Token ( token )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("[ ${ DateTime Formatter . ISO _ DATE _ TIME . format ( LocalDateTime . now ()) }] Ġ${ req . url () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Request Millis Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġhave Ġto Ġcreate Ġa Ġnew Ġresponse Ġobject Ġas Ġwe Ġalready Ġconsumed Ġthe Ġcontent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresp Ġ= Ġresp . newBuilder (). body ( ResponseBody . create ( contentType , Ġcontent )). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresp ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠRequest . new With Token ( token : ĠString ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . newBuilder (). url ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . url (). newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set QueryParameter (" token ", Ġtoken ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠgetToken (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Client Ġ= ĠOk HttpClient . Builder (). build () Ġ// Ġnew Ġclient Ġfor Ġtoken Ġrequest , Ġto Ġavoid Ġbeing Ġintercept ed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresp Ġ= Ġtoken Client . new Call ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. url ("$ BASE _ URL & get _ token = get _ token ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Request Millis Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġparse Ġor Ġreturn Ġempty Ġstring ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresp . body ()?. string (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠJson Parser () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparser . parse ( it ). as JsonObject . getAs Json Primitive (" token "). asString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠSearch Type ( val Ġquery Param : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠKEY WORD (" search _ string "), ĠIM DB (" search _ imdb ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġip Info (): ĠJsonObject Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. url (" https :// ip info . io / json ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresp Ġ= Ġtest Client . new Call ( this ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠJson Parser () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparser . parse ( resp . body () !!. string ()). as JsonObject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget ( url : ĠString ): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. url ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. run Ġ{ Ġclient . new Call ( this ). execute () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsearch ( type : ĠSearch Type , Ġvalue : ĠString , Ġlimit : ĠInt ?): ĠFuture < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġexecutor . submit ( Callable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ("$ BASE _ URL & mode = search & ${ type . query Param } =$ value & limit =${ limit Ġ?: Ġ 2 5 }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. body ()?. string () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsearch Keyword ( keyword : ĠString , Ġlimit : ĠInt ?): ĠFuture < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsearch ( Search Type . KEYWORD , Ġkeyword , Ġlimit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsearch I mdb ( imdb Id : ĠString , Ġlimit : ĠInt ?): ĠFuture < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsearch ( Search Type . IM DB , Ġim db Id , Ġlimit ) ĊĠĠĠ Ġ} Ċ } Ċ