package Ġcom . Ar j ix Was Taken . cloud stream 3 . utils Ċ Ċ import Ġandroid . net . Uri Ċ import Ġcom . fasterxml . jackson . databind . Deserialization Feature Ċ import Ġcom . fasterxml . jackson . databind . json . Json Mapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . Kotlin Module Ċ import Ġcom . google . android . ex op layer 2 . util . Mime Types Ċ import Ġcom . google . android . gms . cast .* Ċ import Ġcom . google . android . gms . cast . framework . Cast Session Ċ import Ġcom . google . android . gms . cast . framework . media . Remote Media Client Ċ import Ġcom . google . android . gms . common . api . Pending Result Ċ import Ġcom . google . android . gms . common . images . Web Image Ċ import Ġcom . Ar j ix Was Taken . cloud stream 3 . Subtitle File Ċ import Ġcom . Ar j ix Was Taken . cloud stream 3 . sort Sub s Ċ import Ġcom . Ar j ix Was Taken . cloud stream 3 . ui . Metadata Holder Ċ import Ġcom . Ar j ix Was Taken . cloud stream 3 . ui . result . Result Episode Ċ import Ġcom . Ar j ix Was Taken . cloud stream 3 . utils . Cor outines . main Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġorg . json . JSONObject Ċ Ċ object ĠCast Helper Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmapper : ĠJson Mapper Ġ= ĠJson Mapper . builder (). add Module ( Kotlin Module ()) ĊĠĠĠĠĠĠĠ Ġ. configure ( Deserialization Feature . FAIL _ ON _ UNKNOWN _ PROPERTIES , Ġfalse ). build () ĊĊĠĠĠ Ġfun Ġget Media Info ( ĊĠĠĠĠĠĠĠ Ġep Data : ĠResult Episode , ĊĠĠĠĠĠĠĠ Ġholder : ĠMetadata Holder , ĊĠĠĠĠĠĠĠ Ġindex : ĠInt , ĊĠĠĠĠĠĠĠ Ġdata : ĠJSONObject ?, ĊĠĠĠĠĠĠĠ Ġsub titles : ĠList < Subtitle File > ĊĠĠĠ Ġ): ĠMedia Info Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlink Ġ= Ġholder . current Links [ index ] ĊĠĠĠĠĠĠĠ Ġval Ġmovie Metadata Ġ= ĠMedia Metadata ( Media Metadata . MEDIA _ TYPE _ MOV IE ) ĊĠĠĠĠĠĠĠ Ġmovie Metadata . putString ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Metadata . KEY _ SUB TITLE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( holder . is Movie ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlink . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( ep Data . name Ġ?: Ġ" Episode Ġ${ ep Data . episode }") Ġ+ Ġ" Ġ- Ġ${ link . name }" ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġmovie Metadata . putString ( Media Metadata . KEY _ TITLE , Ġholder . title ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsrc Post er Ġ= Ġep Data . poster Ġ?: Ġholder . poster ĊĠĠĠĠĠĠĠ Ġif Ġ( src Post er Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Metadata . add Image ( Web Image ( Uri . parse ( src Post er ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġsub Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġtracks Ġ= Ġsort Sub s ( subtitle s ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Track . Builder ( sub Index ++. to Long (), ĠMedia Track . TYPE _ TEXT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setName ( it . lang ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Subtype ( Media Track . SUB TYPE _ SUB TIT LES ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Id ( it . url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠMedia Info . Builder ( link . url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Stream Type ( Media Info . STREAM _ TYPE _ BUFFER ED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ContentType ( Mime Types . VIDEO _ UNKNOWN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Metadata ( movie Metadata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Media Tracks ( tracks ) ĊĠĠĠĠĠĠĠ Ġdata ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Custom Data ( data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġawait Links ( pending : ĠPending Result < Remote Media Client . Media Channel Result > ?, Ġcallback : Ġ( Boolean ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( pending Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠ Ġmain Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ Ġpending . await () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( res . status ?. statusCode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCast StatusCode s . FAILED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . invoke ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" FAILED ĠAND ĠLOAD ĠNEXT ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ID K ĠDO ĠSM TH ĠHERE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠCast Session ?. start Cast ( ĊĠĠĠĠĠĠĠ Ġapi Name : ĠString , ĊĠĠĠĠĠĠĠ Ġis Movie : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġtitle : ĠString ?, ĊĠĠĠĠĠĠĠ Ġposter : ĠString ?, ĊĠĠĠĠĠĠĠ Ġcurrent Episode Index : ĠInt , ĊĠĠĠĠĠĠĠ Ġepisode s : ĠList < Result Episode >, ĊĠĠĠĠĠĠĠ Ġcurrent Links : ĠList < Extractor Link >, ĊĠĠĠĠĠĠĠ Ġsub titles : ĠList < Subtitle File >, ĊĠĠĠĠĠĠĠ ĠstartIndex : ĠInt ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ ĠstartTime : ĠLong ? Ġ= Ġnull , ĊĠĠĠ Ġ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( this Ġ== Ġnull ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( episodes . isEmpty ()) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( current Links . size Ġ<= Ġcurrent Episode Index ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġep Data Ġ= Ġepisode s [ current Episode Index ] ĊĊĠĠĠĠĠĠĠ Ġval Ġholder Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMetadata Holder ( api Name , Ġis Movie , Ġtitle , Ġposter , Ġcurrent Episode Index , Ġepisode s , Ġcurrent Links , Ġsub titles ) ĊĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġif ( startIndex Ġ== Ġnull Ġ|| ĠstartIndex Ġ< Ġ 0 ) Ġ 0 Ġelse ĠstartIndex ĊĊĠĠĠĠĠĠĠ Ġval Ġmedia Item Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Media Info ( ep Data , Ġholder , Ġindex , ĠJSONObject ( mapper . writeValue AsString ( holder )), Ġsub titles ) ĊĊĠĠĠĠĠĠĠ Ġawait Links ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . remote Media Client ?. load ( Media Load Request Data . Builder (). set Media Info ( media Item ). setCurrent Time ( startTime Ġ?: Ġ 0 L ). build () Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Links . size Ġ> Ġindex Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Cast ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Movie , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Episode Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġepisode s , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Links , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub titles , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ+ Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartTime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} Ċ }