package Ġeu . kan ade . t ach iy omi . extension . ca . f ans ub sc at Ċ Ċ import Ġeu . kan ade . t ach iy omi . Build Config Ċ import Ġeu . kan ade . t ach iy omi . network . GET Ċ import Ġeu . kan ade . t ach iy omi . network . as Observable Success Ċ import Ġeu . kan ade . t ach iy omi . source . model . Filter List Ċ import Ġeu . kan ade . t ach iy omi . source . model . M ang as Page Ċ import Ġeu . kan ade . t ach iy omi . source . model . Page Ċ import Ġeu . kan ade . t ach iy omi . source . model . S Chapter Ċ import Ġeu . kan ade . t ach iy omi . source . model . SM anga Ċ import Ġeu . kan ade . t ach iy omi . source . online . Http Source Ċ import Ġkotlinx . serialization . decode FromString Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġkotlinx . serialization . json . JsonObject Ċ import Ġkotlinx . serialization . json . content OrNull Ċ import Ġkotlinx . serialization . json . float Ċ import Ġkotlinx . serialization . json . json Array Ċ import Ġkotlinx . serialization . json . jsonObject Ċ import Ġkotlinx . serialization . json . json Primitive Ċ import Ġkotlinx . serialization . json . long Ċ import Ġokhttp 3 . Headers Ċ import Ġokhttp 3 . Http Url . Companion . to Http Url OrNull Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Request Ċ import Ġokhttp 3 . Response Ċ import Ġrx . Observable Ċ import Ġu y . ko hes ive . in jekt . inject Lazy Ċ Ċ class ĠF ans ub s Cat Ġ: ĠHttp Source () Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" F ans ub s . cat " ĊĊĠĠĠ Ġoverride Ġval ĠbaseUrl Ġ= Ġ" https :// manga . f ans ub s . cat " ĊĊĠĠĠ Ġoverride Ġval Ġlang Ġ= Ġ" ca " ĊĊĠĠĠ Ġoverride Ġval Ġsupports Latest Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġfun Ġheaders Builder (): ĠHeaders . Builder Ġ= ĠHeaders . Builder () ĊĠĠĠĠĠĠĠ Ġ. add (" User - Agent ", Ġ" T ach iy omi / F ans ub s Cat /${ Build Config . VERSION _ NAME }") ĊĊĠĠĠ Ġoverride Ġval Ġclient : ĠOk HttpClient Ġ= Ġnetwork . client ĊĊĠĠĠ Ġprivate Ġval Ġjson : ĠJson Ġby Ġinject Lazy () ĊĊĠĠĠ Ġprivate Ġval Ġapi BaseUrl Ġ= Ġ" https :// api . f ans ub s . cat " ĊĊĠĠĠ Ġprivate Ġfun Ġparse M anga FromJson ( response : ĠResponse ): ĠM ang as Page Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠjsonObject Ġ= Ġjson . decode FromString < JsonObject >( response . body !!. string ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġm ang as Ġ= ĠjsonObject [" result "] !!. json Array . map Ġ{ Ġjson Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSM anga . create (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġjson . jsonObject [" slug "] !!. json Primitive . content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġjson . jsonObject [" name "] !!. json Primitive . content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthumbnail _ url Ġ= Ġjson . jsonObject [" thumbnail _ url "] !!. json Primitive . content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthor Ġ= Ġjson . jsonObject [" author "] !!. json Primitive . content OrNull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġjson . jsonObject [" syn opsis "] !!. json Primitive . content OrNull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġjson . jsonObject [" status "] !!. json Primitive . content . to Status () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenre Ġ= Ġjson . jsonObject [" genres "] !!. json Primitive . content OrNull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠM ang as Page ( m ang as , Ġm ang as . size Ġ>= Ġ 2 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Chapter List FromJson ( response : ĠResponse ): ĠList < S Chapter > Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠjsonObject Ġ= Ġjson . decode FromString < JsonObject >( response . body !!. string ()) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠjsonObject [" result "] !!. json Array . map Ġ{ Ġjson Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS Chapter . create (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġjson . jsonObject [" id "] !!. json Primitive . content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġjson . jsonObject [" title "] !!. json Primitive . content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchapter _ number Ġ= Ġjson . jsonObject [" number "] !!. json Primitive . float ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan lator Ġ= Ġjson . jsonObject [" f ans ub "] !!. json Primitive . content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate _ upload Ġ= Ġjson . jsonObject [" created "] !!. json Primitive . long ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Page List FromJson ( response : ĠResponse ): ĠList < Page > Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠjsonObject Ġ= Ġjson . decode FromString < JsonObject >( response . body !!. string ()) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠjsonObject [" result "] !!. json Array . map Indexed Ġ{ Ġi , Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPage ( i , Ġit . jsonObject [" url "] !!. json Primitive . content , Ġit . jsonObject [" url "] !!. json Primitive . content ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠPop ular ĊĊĠĠĠ Ġoverride Ġfun Ġpopular M anga Request ( page : ĠInt ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠGET ("$ api BaseUrl / manga / popular /$ page ", Ġheaders ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpopular M anga Parse ( response : ĠResponse ): ĠM ang as Page Ġ= Ġparse M anga FromJson ( response ) ĊĊĠĠĠ Ġ// ĠLatest ĊĊĠĠĠ Ġoverride Ġfun Ġlatest Updates Request ( page : ĠInt ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠGET ("$ api BaseUrl / manga / recent /$ page ", Ġheaders ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlatest Updates Parse ( response : ĠResponse ): ĠM ang as Page Ġ= Ġparse M anga FromJson ( response ) ĊĊĠĠĠ Ġ// ĠSearch ĊĊĠĠĠ Ġoverride Ġfun Ġsearch M anga Request ( page : ĠInt , Ġquery : ĠString , Ġfilters : ĠFilter List ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ"$ api BaseUrl / manga / search /$ page ". to Http Url OrNull () !!. newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add QueryParameter (" query ", Ġquery ) ĊĠĠĠĠĠĠĠ Ġreturn ĠGET ( url . toString (), Ġheaders ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsearch M anga Parse ( response : ĠResponse ): ĠM ang as Page Ġ= Ġparse M anga FromJson ( response ) ĊĊĠĠĠ Ġ// ĠDetails ĊĊĠĠĠ Ġ// ĠWork around Ġto Ġallow Ġ" Open Ġin Ġbrowser " Ġto Ġuse Ġthe Ġreal ĠURL ĊĠĠĠ Ġoverride Ġfun Ġfetch M anga Details ( manga : ĠSM anga ): ĠObservable < SM anga > Ġ= ĊĠĠĠĠĠĠĠ Ġclient . new Call ( api M anga Details Request ( manga )). as Observable Success () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġm anga Details Parse ( it ). apply Ġ{ Ġinitialized Ġ= Ġtrue Ġ} Ġ} ĊĊĠĠĠ Ġ// ĠReturn Ġthe Ġreal ĠURL Ġfor Ġ" Open Ġin Ġbrowser " ĊĠĠĠ Ġoverride Ġfun Ġm anga Details Request ( manga : ĠSM anga ) Ġ= ĠGET ("$ baseUrl /${ manga . url }", Ġheaders ) ĊĊĠĠĠ Ġprivate Ġfun Ġapi M anga Details Request ( manga : ĠSM anga ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠGET ("$ api BaseUrl / manga / details /${ manga . url . substring After Last ('/') }", Ġheaders ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġm anga Details Parse ( response : ĠResponse ): ĠSM anga Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠjsonObject Ġ= Ġjson . decode FromString < JsonObject >( response . body !!. string ()) ĊĠĠĠĠĠĠĠ Ġval Ġresult Object Ġ= ĠjsonObject . jsonObject [" result "] !!. jsonObject ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSM anga . create (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġresult Object [" slug "] !!. json Primitive . content ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġresult Object [" name "] !!. json Primitive . content ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthumbnail _ url Ġ= Ġresult Object [" thumbnail _ url "] !!. json Primitive . content ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthor Ġ= Ġresult Object [" author "] !!. json Primitive . content OrNull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġresult Object [" syn opsis "] !!. json Primitive . content OrNull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġresult Object [" status "] !!. json Primitive . content . to Status () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenre Ġ= Ġresult Object [" genres "] !!. json Primitive . content OrNull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString ?. to Status () Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġthis Ġ== Ġnull Ġ-> ĠSM anga . UNKNOWN ĊĠĠĠĠĠĠĠ Ġthis . contains (" ongo ing ", Ġignore Case Ġ= Ġtrue ) Ġ-> ĠSM anga . ONGO ING ĊĠĠĠĠĠĠĠ Ġthis . contains (" finished ", Ġignore Case Ġ= Ġtrue ) Ġ-> ĠSM anga . COMPLETED ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠSM anga . UNKNOWN ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠChapter s ĊĊĠĠĠ Ġoverride Ġfun Ġchapter List Request ( manga : ĠSM anga ): ĠRequest Ġ= ĠGET ("$ api BaseUrl / manga / chapter s /${ manga . url . substring After Last ('/') }", Ġheaders ) ĊĊĠĠĠ Ġoverride Ġfun Ġchapter List Parse ( response : ĠResponse ): ĠList < S Chapter > Ġ= Ġparse Chapter List FromJson ( response ) ĊĊĠĠĠ Ġ// ĠPages ĊĊĠĠĠ Ġoverride Ġfun Ġpage List Request ( chapter : ĠS Chapter ): ĠRequest Ġ= ĠGET ("$ api BaseUrl / manga / pages /${ chapter . url }", Ġheaders ) ĊĊĠĠĠ Ġoverride Ġfun Ġpage List Parse ( response : ĠResponse ): ĠList < Page > Ġ= Ġparse Page List FromJson ( response ) ĊĊĠĠĠ Ġoverride Ġfun ĠimageUrl Parse ( response : ĠResponse ): ĠString Ġ= Ġthrow ĠUnsupportedOperationException (" Not Ġused ") Ċ } Ċ