package Ġeu . kan ade . t ach iy omi . extension . all . net com ics Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . net . Uri Ċ import Ġandroidx . preference . EditText Preference Ċ import Ġandroidx . preference . List Preference Ċ import Ġandroidx . preference . Preference Screen Ċ import Ġandroidx . preference . Switch Preference Compat Ċ import Ġeu . kan ade . t ach iy omi . network . GET Ċ import Ġeu . kan ade . t ach iy omi . network . as Observable Ċ import Ġeu . kan ade . t ach iy omi . source . Configurable Source Ċ 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 . json . Json Ċ import Ġkotlinx . serialization . json . decode FromJson Element Ċ import Ġkotlinx . serialization . json . jsonObject Ċ import Ġkotlinx . serialization . json . json Primitive Ċ import Ġokhttp 3 . Response Ċ import Ġu y . ko hes ive . in jekt . In jekt Ċ import Ġu y . ko hes ive . in jekt . api . get Ċ import Ġjava . util . Calendar Ċ Ċ class ĠNet com ics ( ĊĠĠĠ Ġoverride Ġval Ġlang : ĠString , ĊĠĠĠ Ġprivate Ġval Ġsite : ĠString Ċ ) Ġ: ĠConfigur able Source , ĠHttp Source () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" NET COM ICS " ĊĊĠĠĠ Ġoverride Ġval ĠbaseUrl Ġ= Ġ" https :// www . net com ics . com " ĊĊĠĠĠ Ġoverride Ġval Ġsupports Latest Ġ= Ġtrue ĊĊĠĠĠ Ġprivate Ġval Ġjson Ġby Ġlazy Ġ{ ĠIn jekt . get < Json >() Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġpreferences Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠIn jekt . get < Application >(). get SharedPreferences (" source _$ id ", Ġ 0 x 0 0 0 0 ) !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġad ult Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( preferences . getBoolean (" 1 8 +", Ġfalse )) Ġ" Y " Ġelse Ġ" N " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtoken Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġpreferences . getString (" token ", Ġ"") !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġquality Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġpreferences . getString (" quality ", Ġ" 6 2 5 ") !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdid Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠSystem . currentTimeMillis (). toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġapi Uri Ġby Ġlazy Ġ{ ĠUri . parse ( API _ URL ) Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġapi Headers Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġheaders . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set (" Origin ", ĠbaseUrl ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set (" platform ", Ġ" android ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set (" ad ult ", Ġad ult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set (" token ", Ġtoken ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set (" site ", Ġsite ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set (" did ", Ġdid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġday Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( Calendar . getInstance ()[ Calendar . DAY _ OF _ WEEK ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCalendar . MON DAY Ġ-> Ġ" 1 " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCalendar . T UES DAY Ġ-> Ġ" 2 " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCalendar . W ED N ES DAY Ġ-> Ġ" 3 " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCalendar . TH UR SD AY Ġ-> Ġ" 4 " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCalendar . FR ID AY Ġ-> Ġ" 5 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠRequest Ġthe Ġreal ĠURL Ġfor Ġthe Ġweb view ĊĠĠĠ Ġoverride Ġfun Ġm anga Details Request ( manga : ĠSM anga ) Ġ= ĊĠĠĠĠĠĠĠ ĠGET ("$ baseUrl /$ site / com ic /${ manga . slug }", Ġheaders ) ĊĊĠĠĠ Ġoverride Ġfun Ġsearch M anga Parse ( response : ĠResponse ) Ġ= ĊĠĠĠĠĠĠĠ Ġresponse . data < List < Title >> (). if Empty Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" No Ġmore Ġpages ") ĊĠĠĠĠĠĠĠ Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSM anga . create (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġit . slug ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġit . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenre Ġ= Ġit . genres ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthor Ġ= Ġit . authors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist Ġ= Ġit . artists ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġit . description ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthumbnail _ url Ġ= Ġit . thumbnail ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Completed Ġ-> ĠSM anga . COMPLETED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠSM anga . ONGO ING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. run Ġ{ ĠM ang as Page ( this , Ġsize Ġ== Ġ 2 0 ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġchapter List Parse ( response : ĠResponse ) Ġ= ĊĠĠĠĠĠĠĠ Ġresponse . data < List < Chapter >> (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS Chapter . create (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġit . path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġit . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate _ upload Ġ= Ġit . timestamp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchapter _ number Ġ= Ġit . number ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpage List Parse ( response : ĠResponse ) Ġ= ĊĠĠĠĠĠĠĠ Ġresponse . data < Page List >(). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPage ( it . seq , Ġ"", Ġit . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Latest Updates ( page : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġapi Uri . fetch (" title ", Ġ:: search M anga Parse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Encoded Path (" new ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend QueryParameter (" no ", Ġpage . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend QueryParameter (" size ", Ġ" 2 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend QueryParameter (" day ", Ġday ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Pop ular M anga ( page : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġapi Uri . fetch (" title ", Ġ:: search M anga Parse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Encoded Path (" free ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend QueryParameter (" no ", Ġpage . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend QueryParameter (" size ", Ġ" 2 0 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Search M anga ( page : ĠInt , Ġquery : ĠString , Ġfilters : ĠFilter List ) Ġ= ĊĠĠĠĠĠĠĠ Ġapi Uri . fetch (" title ", Ġ:: search M anga Parse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( query . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Encoded Path (" search / text ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend QueryParameter (" text ", Ġquery ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Encoded Path (" genre ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend QueryParameter (" genre ", Ġfilters . genre ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend QueryParameter (" no ", Ġpage . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend QueryParameter (" size ", Ġ" 2 0 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfetch M anga Details ( manga : ĠSM anga ) Ġ= ĊĠĠĠĠĠĠĠ Ġrx . Observable . just ( manga . apply Ġ{ Ġinitialized Ġ= Ġtrue Ġ}) !! ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Chapter List ( manga : ĠSM anga ) Ġ= ĊĠĠĠĠĠĠĠ Ġapi Uri . fetch (" chapter ", Ġ:: chapter List Parse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Encoded Path (" list ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Encoded Path ( manga . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Encoded Path (" rent ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Page List ( chapter : ĠS Chapter ) Ġ= ĊĠĠĠĠĠĠĠ Ġapi Uri . fetch (" chapter ", Ġ:: page List Parse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Encoded Path (" viewer ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Encoded Path ( quality ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Encoded Path ( chapter . url ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Filter List () Ġ= ĊĠĠĠĠĠĠĠ ĠFilter List ( Genre Filter . NOTE , ĠGen re Filter ()) ĊĊĠĠĠ Ġoverride Ġfun Ġsetup Preference Screen ( screen : ĠPreference Screen ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSwitch Preference Compat ( screen . context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġ" 1 8 +" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" Show Ġ 1 8 +" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsummary Off Ġ= Ġ" 1 8 + ĠOFF " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsummary On Ġ= Ġ" 1 8 + ĠON " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset DefaultValue ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Preference ChangeListener Ġ{ Ġ_, ĠnewValue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . edit (). put Boolean ( key , ĠnewValue Ġas ĠBoolean ). commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. let ( screen :: add Preference ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġgrab Ġfrom Ġthe Ġweb view Ġsomehow ĊĠĠĠĠĠĠĠ ĠEditText Preference ( screen . context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġ" token " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" API Ġkey " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Title Ġ= Ġ" localStorage [' nc x . user . token '] " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Preference ChangeListener Ġ{ Ġ_, ĠnewValue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . edit (). putString ( key , ĠnewValue Ġas ĠString ). commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. let ( screen :: add Preference ) ĊĊĠĠĠĠĠĠĠ ĠList Preference ( screen . context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġ" quality " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" Image Ġquality " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsummary Ġ= Ġ"% s " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentries Ġ= ĠarrayOf (" HD ", Ġ" Medium ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentry Values Ġ= ĠarrayOf (" 1 0 2 4 ", Ġ" 6 2 5 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset DefaultValue (" 6 2 5 ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Preference ChangeListener Ġ{ Ġ_, ĠnewValue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . edit (). putString ( key , ĠnewValue Ġas ĠString ). commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. let ( screen :: add Preference ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlatest Updates Request ( page : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" Not Ġused ") ĊĊĠĠĠ Ġoverride Ġfun Ġpopular M anga Request ( page : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" Not Ġused ") ĊĊĠĠĠ Ġoverride Ġfun Ġsearch M anga Request ( page : ĠInt , Ġquery : ĠString , Ġfilters : ĠFilter List ) Ġ= ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" Not Ġused ") ĊĊĠĠĠ Ġoverride Ġfun Ġchapter List Request ( manga : ĠSM anga ) Ġ= ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" Not Ġused ") ĊĊĠĠĠ Ġoverride Ġfun Ġpage List Request ( chapter : ĠS Chapter ) Ġ= ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" Not Ġused ") ĊĊĠĠĠ Ġ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 Ġm anga Details Parse ( response : ĠResponse ) Ġ= ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" Not Ġused ") ĊĊĠĠĠ Ġoverride Ġfun ĠimageUrl Parse ( response : ĠResponse ) Ġ= ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" Not Ġused ") ĊĊĠĠĠ Ġprivate Ġinline Ġval ĠSM anga . slug : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġurl . substring Before ('| ') ĊĊĠĠĠ Ġprivate Ġinline Ġval ĠSM anga . id : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġurl . substring After ('| ') ĊĊĠĠĠ Ġprivate Ġinline Ġval ĠFilter List . genre : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfind Ġ{ Ġit Ġis ĠGen re Filter Ġ} ?. toString () Ġ?: Ġ"" ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT > ĠResponse . data () Ġ= ĊĠĠĠĠĠĠĠ Ġjson . decode FromJson Element < T >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson . parse ToJson Element ( body !!. string ()). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠjsonObject [" data "] Ġ?: Ġthrow ĠError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠjsonObject [" message "] !!. json Primitive . content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< R > ĠUri . fetch ( ĊĠĠĠĠĠĠĠ Ġpath : ĠString , ĊĠĠĠĠĠĠĠ Ġno inline Ġparse : Ġ( Response ) Ġ-> ĠR , ĊĠĠĠĠĠĠĠ Ġblock : ĠUri . Builder . () Ġ-> ĠUri . Builder ĊĠĠĠ Ġ) Ġ= Ġbuild Up on (). append Encoded Path ( path ). let ( block ). toString (). run Ġ{ ĊĠĠĠĠĠĠĠ Ġclient . new Call ( GET ( this , Ġapi Headers )). as Observable (). map ( parse ) !! ĊĠĠĠ Ġ} Ċ } Ċ