package Ġeu . kan ade . t ach iy omi . extension . en . z in chan manga Ċ Ċ import Ġeu . kan ade . t ach iy omi . lib . rate limit . RateLimit Interceptor Ċ 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 . Experimental Serialization Api Ċ import Ġkotlinx . serialization . decode FromString Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġokhttp 3 . Response Ċ import Ġu y . ko hes ive . in jekt . inject Lazy Ċ Ċ @ Experimental Serialization Api Ċ class ĠZ in Chan M anga Ġ: ĠHttp Source () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġlang Ġ= Ġ" en " ĊĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" Z in Chan M anga " ĊĊĠĠĠ Ġoverride Ġval ĠbaseUrl Ġ= Ġ" https :// z in chan manga . net " ĊĊĠĠĠ Ġoverride Ġval Ġsupports Latest Ġ= Ġtrue ĊĊĠĠĠ Ġprivate Ġval Ġjson Ġby Ġinject Lazy < Json >() ĊĊĠĠĠ Ġprivate Ġval ĠapiClient Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġnetwork . client . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. ssl Socket Factory ( Z in Chan Cert . factory , ĠZ in Chan Cert . manager ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Interceptor ( RateLimit Interceptor ( 2 )). build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġapi Headers Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġheaders . newBuilder (). add (" Origin ", ĠbaseUrl ). build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlatest Updates Request ( page : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ ĠGET ("$ API _ URL / latest - manga - updates ? page =$ page & total = 1 0 ", Ġapi Headers ) ĊĊĠĠĠ Ġoverride Ġfun Ġpopular M anga Request ( page : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ ĠGET ("$ API _ URL / all ? page =$ page & total = 1 0 ", Ġapi Headers ) ĊĊĠĠĠ Ġoverride Ġfun Ġsearch M anga Request ( page : ĠInt , Ġquery : ĠString , Ġfilters : ĠFilter List ) Ġ= ĊĠĠĠĠĠĠĠ Ġfilters . find Ġ{ Ġit Ġis ĠZ in Chan Genre Ġ} ?. take If Ġ{ Ġit . state Ġ!= Ġ 0 Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGET ("$ API _ URL / category ? id _ cate =$ it & page =$ page & total = 1 0 ", Ġapi Headers ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: ĠGET ("$ API _ URL / search ? keyword =$ query & page =$ page & total = 1 0 ", Ġapi Headers ) ĊĊĠĠĠ Ġ// ĠRequest Ġthe Ġfrontend ĠURL Ġfor Ġthe Ġweb view ĊĠĠĠ Ġoverride Ġfun Ġm anga Details Request ( manga : ĠSM anga ) Ġ= ĊĠĠĠĠĠĠĠ ĠGET ("$ baseUrl / manga /${ manga . url }", Ġheaders ) ĊĊĠĠĠ Ġoverride Ġfun Ġchapter List Request ( manga : ĠSM anga ) Ġ= ĊĠĠĠĠĠĠĠ ĠGET ("$ API _ URL / list - chapter s ? id _ story =${ manga . id }& id _ user =- 1 ", Ġapi Headers ) ĊĊĠĠĠ Ġoverride Ġfun Ġpage List Request ( chapter : ĠS Chapter ) Ġ= ĊĠĠĠĠĠĠĠ ĠGET ("$ API _ URL / reading ${ chapter . url }", Ġapi Headers ) ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Latest Updates ( page : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġfetch M anga ( latest Updates Request ( page ), Ġpage ) ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Pop ular M anga ( page : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġfetch M anga ( popular M anga Request ( page ), Ġpage ) ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Search M anga ( page : ĠInt , Ġquery : ĠString , Ġfilters : ĠFilter List ) Ġ= ĊĠĠĠĠĠĠĠ Ġfetch M anga ( search M anga Request ( page , Ġquery , Ġfilters ), Ġpage ) ĊĊĠĠĠ Ġoverride Ġfun Ġfetch M anga Details ( manga : ĠSM anga ) Ġ= ĊĠĠĠĠĠĠĠ Ġrx . Observable . just ( manga . apply Ġ{ Ġinitialized Ġ= Ġtrue Ġ}) !! ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Chapter List ( manga : ĠSM anga ) Ġ= ĊĠĠĠĠĠĠĠ ĠapiClient . new Call ( chapter List Request ( manga )). as Observable Success (). map Ġ{ Ġres Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres . parse < Data < Chapter >> (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS Chapter . create (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġit . title ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchapter _ number Ġ= Ġit . number ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate _ upload Ġ= Ġit . timestamp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġ"${ it . params }& id _ story =${ manga . id }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} !! ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Page List ( chapter : ĠS Chapter ) Ġ= ĊĠĠĠĠĠĠĠ ĠapiClient . new Call ( page List Request ( chapter )). as Observable Success (). map Ġ{ Ġres Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres . parse < Data < Page List >> (). single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Indexed Ġ{ Ġidx , Ġimg Ġ-> ĠPage ( idx , Ġ"", Ġimg ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} !! ĊĊĠĠĠ Ġoverride Ġfun Ġget Filter List () Ġ= ĠFilter List ( ĊĠĠĠĠĠĠĠ ĠZ in Chan Genre . Companion . Note , ĊĠĠĠĠĠĠĠ ĠZ in Chan Genre ( Z in Chan Genre . genres ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġinline Ġval ĠSM anga . id : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġurl . substring After (" ? id =") ĊĊĠĠĠ Ġprivate Ġfun Ġfetch M anga ( request : Ġokhttp 3 . Request , Ġpage : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ ĠapiClient . new Call ( request ). as Observable Success (). map Ġ{ Ġres Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres . parse < Series List >(). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm anga Ġ= Ġmap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSM anga . create (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġit . url ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġit . title ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthumbnail _ url Ġ= Ġit . cover ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġit . description ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenre Ġ= Ġit . genres ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthor Ġ= Ġit . authors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist Ġ= Ġauthor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġwhen Ġ( it . status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" on - going " Ġ-> ĠSM anga . ONGO ING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠSM anga . UNKNOWN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM ang as Page ( manga , Ġpages Ġ!= Ġpage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} !! ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT > ĠResponse . parse () Ġ= ĊĠĠĠĠĠĠĠ Ġjson . decode FromString < T >( body !!. string ()) ĊĊĠĠĠ Ġoverride Ġfun Ġlatest Updates Parse ( response : ĠResponse ) Ġ= ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" Not Ġused ") ĊĊĠĠĠ Ġoverride Ġfun Ġpopular M anga Parse ( response : ĠResponse ) Ġ= ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" Not Ġused ") ĊĊĠĠĠ Ġoverride Ġfun Ġsearch M anga Parse ( response : ĠResponse ) Ġ= ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" Not Ġused ") ĊĊĠĠĠ Ġoverride Ġfun Ġm anga Details Parse ( response : ĠResponse ): ĠSM anga Ġ= ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" Not Ġused ") ĊĊĠĠĠ Ġoverride Ġfun Ġchapter List Parse ( response : ĠResponse ) Ġ= ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" Not Ġused ") ĊĊĠĠĠ Ġoverride Ġfun Ġpage List Parse ( response : ĠResponse ) Ġ= ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" Not Ġused ") ĊĊĠĠĠ Ġoverride Ġfun ĠimageUrl Parse ( response : ĠResponse ) Ġ= ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" Not Ġused ") ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAPI _ URL Ġ= Ġ" https :// api . z in chan manga . net : 5 5 5 5 / api / web / manga " ĊĠĠĠ Ġ} Ċ } Ċ