package Ġeu . kan ade . t ach iy omi . extension . ko . to on kor Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . util . Base 6 4 Ċ 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 . source . Configurable Source Ċ import Ġeu . kan ade . t ach iy omi . source . model . Filter Ċ import Ġeu . kan ade . t ach iy omi . source . model . Filter List Ċ 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 . Parsed Http Source Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Request Ċ import Ġorg . js oup . nodes . Document Ċ import Ġorg . js oup . nodes . Element Ċ import Ġu y . ko hes ive . in jekt . In jekt Ċ import Ġu y . ko hes ive . in jekt . api . get Ċ import Ġjava . nio . charset . Charset Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util . Locale Ċ Ċ class ĠTo on kor Ġ: ĠConfigur able Source , ĠParsed Http Source () Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" To on kor " ĊĊĠĠĠ Ġprivate Ġval Ġdefault BaseUrl Ġ= Ġ" https :// tk or . cx " ĊĊĠĠĠ Ġprivate Ġval ĠBASE _ URL _ PRE F Ġ= Ġ" override BaseUrl _ v ${ Build Config . VERSION _ NAME }" ĊĊĠĠĠ Ġoverride Ġval ĠbaseUrl Ġby Ġlazy Ġ{ Ġget Pref BaseUrl () Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġlang Ġ= Ġ" ko " ĊĊĠĠĠ Ġoverride Ġval Ġsupports Latest Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġval Ġclient : ĠOk HttpClient Ġ= Ġnetwork . cloudflare Client ĊĊĠĠĠ Ġ// ĠPop ular ĊĊĠĠĠ Ġprivate Ġval Ġweb to ons Request Path Ġ= Ġ"/ % EC % 9 B % B 9 % ED % 8 8 % B 0 " ĊĊĠĠĠ Ġoverride Ġfun Ġpopular M anga Request ( page : ĠInt ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠGET ( baseUrl Ġ+ Ġweb to ons Request Path , Ġheaders ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpopular M anga Selector () Ġ= Ġ" div . section - item - inner " ĊĊĠĠĠ Ġoverride Ġfun Ġpopular M anga From Element ( element : ĠElement ): ĠSM anga Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSM anga . create (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . select (" div . section - item - title Ġa "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġit . select (" h 3 "). text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġit . attr (" href ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthumbnail _ url Ġ= Ġelement . select (" img "). attr (" abs : src ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpopular M anga Next Page Selector (): ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġ// ĠLatest ĊĊĠĠĠ Ġprivate Ġval Ġlatest Request Modifier Ġ= Ġ"? fil =% EC % B 5 % 9 C % EC % 8 B % A 0 " ĊĊĠĠĠ Ġoverride Ġfun Ġlatest Updates Request ( page : ĠInt ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠGET ( baseUrl Ġ+ Ġweb to ons Request Path Ġ+ Ġlatest Request Modifier , Ġheaders ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlatest Updates Selector () Ġ= Ġpopular M anga Selector () ĊĊĠĠĠ Ġoverride Ġfun Ġlatest Updates From Element ( element : ĠElement ): ĠSM anga Ġ= Ġpopular M anga From Element ( element ) ĊĊĠĠĠ Ġoverride Ġfun Ġlatest Updates Next Page Selector () Ġ= Ġpopular M anga Next Page Selector () ĊĊĠĠĠ Ġ// ĠSearch ĊĊĠĠĠ Ġoverride Ġfun Ġsearch M anga Request ( page : ĠInt , Ġquery : ĠString , Ġfilters : ĠFilter List ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfilter List Ġ= Ġif Ġ( filters . isEmpty ()) Ġget Filter List () Ġelse Ġfilters ĊĊĠĠĠĠĠĠĠ Ġ// ĠWeb to ons , ĠM anga , Ġor ĠH ent ai ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġfilter List . find Uri Part Filter < Type Filter >() ĊĠĠĠĠĠĠĠ Ġ// ĠPop ular , ĠLatest , Ġor ĠCompleted ĊĠĠĠĠĠĠĠ Ġval Ġsort Ġ= Ġfilter List . find Uri Part Filter < Sort Filter >() ĊĊĠĠĠĠĠĠĠ Ġ// ĠH ent ai Ġdoesn 't Ġhave Ġa Ġ" completed " Ġsort , Ġignore Ġit Ġif Ġit 's Ġselected Ġ( e quivalent Ġto Ġreturning Ġpopular ) ĊĠĠĠĠĠĠĠ Ġval Ġrequest Path Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery . isNotBlank () Ġ-> Ġ"/ bbs / search . php ? s fl = wr _ subject % 7 C % 7 C wr _ content & st x =$ query " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . is Selection (" H ent ai ") Ġ&& Ġsort . is Selection (" Completed ") Ġ-> Ġtype . to Uri Part () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtype . to Uri Part () Ġ+ Ġsort . to Uri Part () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠGET ( baseUrl Ġ+ Ġrequest Path , Ġheaders ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsearch M anga Selector () Ġ= Ġpopular M anga Selector () ĊĊĠĠĠ Ġoverride Ġfun Ġsearch M anga From Element ( element : ĠElement ) Ġ= Ġpopular M anga From Element ( element ) ĊĊĠĠĠ Ġoverride Ġfun Ġsearch M anga Next Page Selector () Ġ= Ġpopular M anga Next Page Selector () ĊĊĠĠĠ Ġ// ĠDetails ĊĊĠĠĠ Ġoverride Ġfun Ġm anga Details Parse ( document : ĠDocument ): ĠSM anga Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSM anga . create (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( document . select (" table . bt _ view 1 ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġselect (" td . bt _ title "). text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthor Ġ= Ġselect (" td . bt _ label Ġspan . bt _ data "). text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġselect (" td . bt _ over "). text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthumbnail _ url Ġ= Ġselect (" td . bt _ thumb Ġimg "). first OrNull ()?. attr (" abs : src ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠChapter s ĊĊĠĠĠ Ġoverride Ġfun Ġchapter List Selector () Ġ= Ġ" table . web _ list Ġtr : has ( td . content __ title )" ĊĊĠĠĠ Ġoverride Ġfun Ġchapter From Element ( element : ĠElement ): ĠS Chapter Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠS Chapter . create (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . select (" td . content __ title "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġit . attr (" data - role ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġit . text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdate _ upload Ġ= Ġelement . select (" td . episode __ index "). text (). toDate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠdateFormat Ġby Ġlazy Ġ{ ĠSimpleDateFormat (" yyyy - MM - dd ", ĠLocale . getDefault ()) Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . toDate (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠdateFormat . parse ( this )?. time Ġ?: Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠPages ĊĊĠĠĠ Ġprivate Ġval Ġpage List Regex Ġ= ĠRegex (""" src =" ([^ "] *) """ ") ĊĊĠĠĠ Ġoverride Ġfun Ġpage List Parse ( document : ĠDocument ): ĠList < Page > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġencoded Ġ= Ġdocument . select (" script : contains Data ( to on _ img ) "). first OrNull ()?. data () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . substring After ("' ") ?. substring Before ("' ") Ġ?: Ġthrow ĠException (" to on _ img Ġscript Ġnot Ġfound ") ĊĊĠĠĠĠĠĠĠ Ġval Ġdecoded Ġ= ĠBase 6 4 . decode ( encoded , ĠBase 6 4 . DEFAULT ). toString ( Charset . default Charset ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġpage List Regex . findAll ( decoded ). toList (). map Indexed Ġ{ Ġi , Ġmatch Result Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPage ( i , Ġ"", Ġmatch Result . de structured . component 1 (). let Ġ{ Ġif Ġ( it . startsWith (" http ")) Ġit Ġelse ĠbaseUrl Ġ+ Ġit Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠimageUrl Parse ( document : ĠDocument ): ĠString Ġ= Ġthrow ĠUnsupportedOperationException (" Not Ġused ") ĊĊĠĠĠ Ġ// ĠFilters ĊĊĠĠĠ Ġoverride Ġfun Ġget Filter List (): ĠFilter List Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFilter List ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFilter . Header (" Note : Ġcan 't Ġcombine Ġwith Ġtext Ġsearch ! "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFilter . Separator (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType Filter ( getType List ()), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSort Filter ( get Sort List ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠType Filter ( vals : ĠArray < Pair < String , ĠString >>) Ġ: ĠUri Part Filter (" Type ", Ġvals ) ĊĠĠĠ Ġprivate Ġclass ĠSort Filter ( vals : ĠArray < Pair < String , ĠString >>) Ġ: ĠUri Part Filter (" Sort ", Ġvals ) ĊĊĠĠĠ Ġprivate Ġfun ĠgetType List () Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠ ĠPair (" Web to ons ", Ġweb to ons Request Path ), ĊĠĠĠĠĠĠĠ ĠPair (" M anga ", Ġ"/ % EB % 8 B % A 8 % ED % 9 6 % 8 9 % EB % B 3 % B 8 "), ĊĠĠĠĠĠĠĠ ĠPair (" H ent ai ", Ġ"/ % EB % A 7 % 9 D % EA % B 0 % 8 0 ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġget Sort List () Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠ ĠPair (" Pop ular ", Ġ""), ĊĠĠĠĠĠĠĠ ĠPair (" Latest ", Ġlatest Request Modifier ), ĊĠĠĠĠĠĠĠ ĠPair (" Completed ", Ġ"/ % EC % 9 9 % 8 4 % EA % B 2 % B 0 ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġopen Ġclass ĠUri Part Filter ( displayName : ĠString , Ġprivate Ġval Ġvals : ĠArray < Pair < String , ĠString >>) Ġ: ĊĠĠĠĠĠĠĠ ĠFilter . Select < String >( displayName , Ġvals . map Ġ{ Ġit . first Ġ}. to Typed Array ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġis Selection ( name : ĠString ): ĠBoolean Ġ= Ġname Ġ== Ġvals [ state ]. first ĊĠĠĠĠĠĠĠ Ġfun Ġto Uri Part () Ġ= Ġvals [ state ]. second ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT > ĠFilter List . find Uri Part Filter (): ĠUri Part Filter Ġ= Ġthis . find Ġ{ Ġit Ġis ĠT Ġ} Ġas ĠUri Part Filter ĊĊĠĠĠ Ġ// ĠPreferences ĊĊĠĠĠ Ġprivate Ġval Ġpreferences : ĠSharedPreferences Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠIn jekt . get < Application >(). get SharedPreferences (" source _$ id ", Ġ 0 x 0 0 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsetup Preference Screen ( screen : Ġandroidx . preference . Preference Screen ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠbaseUrl Pref Ġ= Ġandroidx . preference . EditText Preference ( screen . context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= ĠBASE _ URL _ PRE F _ TITLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠBASE _ URL _ PRE F _ TITLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsummary Ġ= ĠBASE _ URL _ PRE F _ SUM MARY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . set DefaultValue ( default BaseUrl ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Title Ġ= ĠBASE _ URL _ PRE F _ TITLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Message Ġ= Ġ" Default : Ġ$ default BaseUrl " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Preference ChangeListener Ġ{ Ġ_, ĠnewValue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġpreferences . edit (). putString ( BASE _ URL _ PRE F , ĠnewValue Ġas ĠString ). commit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġscreen . add Preference ( baseUrl Pref ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Pref BaseUrl (): ĠString Ġ= Ġpreferences . getString ( BASE _ URL _ PRE F , Ġdefault BaseUrl ) !! ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠBASE _ URL _ PRE F _ TITLE Ġ= Ġ" Override ĠBase Url " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠBASE _ URL _ PRE F _ SUM MARY Ġ= Ġ" Override Ġdefault Ġdomain Ġwith Ġa Ġdifferent Ġone " ĊĠĠĠ Ġ} Ċ } Ċ