package Ġeu . kan ade . t ach iy omi . source . online . all Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Uri Ċ import Ġcom . github . sal om on br ys . kot son . get Ċ import Ġcom . github . sal om on br ys . kot son . null Array Ċ import Ġcom . github . sal om on br ys . kot son . null Long Ċ import Ġcom . github . sal om on br ys . kot son . null Obj Ċ import Ġcom . github . sal om on br ys . kot son . null String Ċ import Ġcom . google . gson . Json Parser Ċ import Ġeu . kan ade . t ach iy omi . Build Config Ċ import Ġeu . kan ade . t ach iy omi . R Ċ 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 Ċ 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 Ġeu . kan ade . t ach iy omi . source . online . L ew d Source Ċ import Ġeu . kan ade . t ach iy omi . source . online . Url Import able Source Ċ import Ġeu . kan ade . t ach iy omi . ui . manga . M anga Controller Ċ import Ġeu . kan ade . t ach iy omi . util . as J soup Ċ import Ġex h . NH ENT AI _ SOURCE _ ID Ċ import Ġex h . metadata . metadata . NH ent ai Search Metadata Ċ import Ġex h . metadata . metadata . NH ent ai Search Metadata . Companion . TAG _ TYPE _ DEFAULT Ċ import Ġex h . metadata . metadata . base . Raised Search Metadata . Companion . TAG _ TYPE _ VIRTUAL Ċ import Ġex h . metadata . metadata . base . Raised Tag Ċ import Ġex h . ui . metadata . adapters . NH ent ai Description Adapter Ċ import Ġex h . util . url Import Fetch Search M anga Ċ import Ġokhttp 3 . Http Url Ċ import Ġokhttp 3 . Http Url . Companion . to Http Url OrNull Ċ import Ġokhttp 3 . Request Ċ import Ġokhttp 3 . Response Ċ import Ġrx . Observable Ċ Ċ /** Ċ Ġ* ĠN H ent ai Ġsource Ċ Ġ*/ Ċ Ċ class ĠN H ent ai ( val Ġcontext : ĠContext ) Ġ: ĠHttp Source (), ĠL ew d Source < NH ent ai Search Metadata , ĠResponse >, ĠUrl Import able Source Ġ{ ĊĠĠĠ Ġoverride Ġval Ġmeta Class Ġ= ĠN H ent ai Search Metadata :: class ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Pop ular M anga ( page : ĠInt ): ĠObservable < M ang as Page > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO ĠThere Ġis Ġcurrently Ġno Ġway Ġto Ġget Ġthe Ġmost Ġpopular Ġm ang as ĊĠĠĠĠĠĠĠ Ġ// ĠTODO ĠInstead , Ġwe Ġdelegate Ġthis Ġto Ġthe Ġlatest Ġupdates Ġthing Ġto Ġavoid Ġconfusing Ġusers Ġwith Ġan Ġempty Ġscreen ĊĠĠĠĠĠĠĠ Ġreturn Ġfetch Latest Updates ( page ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpopular M anga Request ( page : ĠInt ) Ġ= Ġthrow ĠUnsupportedOperationException () ĊĊĠĠĠ Ġoverride Ġfun Ġpopular M anga Parse ( response : ĠResponse ) Ġ= Ġthrow ĠUnsupportedOperationException () ĊĊĠĠĠ Ġ// ĠSupport Ġdirect ĠURL Ġimporting ĊĠĠĠ Ġoverride Ġfun Ġfetch Search M anga ( page : ĠInt , Ġquery : ĠString , Ġfilters : ĠFilter List ): ĠObservable < M ang as Page > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtrimmed Id Query Ġ= Ġquery . trim (). remove Prefix (" id :") ĊĠĠĠĠĠĠĠ Ġval Ġnew Query Ġ= Ġif Ġ( trimmed Id Query . toInt OrNull () Ġ?: Ġ- 1 Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ baseUrl / g /$ trimmed Id Query /" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġquery ĊĊĠĠĠĠĠĠĠ Ġreturn Ġurl Import Fetch Search M anga ( context , Ġnew Query ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch M anga Request Observable ( page , Ġquery , Ġfilters ). flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . new Call ( it ). as Observable Success () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch M anga Parse ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsearch M anga Request Observable ( page : ĠInt , Ġquery : ĠString , Ġfilters : ĠFilter List ): ĠObservable < Request > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġadv Query Ġ= Ġcombine Query ( filters ) ĊĠĠĠĠĠĠĠ Ġval Ġfavorite Filter Ġ= Ġfilters . find Instance < Favorite Filter >() ĊĠĠĠĠĠĠĠ Ġval Ġuploaded Filter Ġ= Ġfilters . find Instance < Uploaded Filter >() ĊĊĠĠĠĠĠĠĠ Ġval Ġurl : ĠHttp Url . Builder ĊĊĠĠĠĠĠĠĠ Ġif Ġ( favorite Filter Ġ!= Ġnull Ġ&& Ġfavorite Filter . state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġ"$ baseUrl / favorites ". to Http Url OrNull () !!. newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add QueryParameter (" q ", Ġ"$ query Ġ$ adv Query ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add QueryParameter (" page ", Ġpage . toString ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġ"$ baseUrl / search ". to Http Url OrNull () !!. newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add QueryParameter (" q ", Ġ"$ query Ġ$ adv Query ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add QueryParameter (" page ", Ġpage . toString ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uploaded Filter ?. state ?. isBlank () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilters . find Instance < Sort Filter >() ?. let Ġ{ Ġf Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl . add QueryParameter (" sort ", Ġf . to Uri Part ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġclient . new Call ( nh Get ( url . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Observable Success () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġnh Get ( url . toString (), Ġpage ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsearch M anga Request ( page : ĠInt , Ġquery : ĠString , Ġfilters : ĠFilter List ) Ġ= Ġthrow ĠUnsupportedOperationException () ĊĊĠĠĠ Ġoverride Ġfun Ġsearch M anga Parse ( response : ĠResponse ) Ġ= Ġparse Result Page ( response ) ĊĊĠĠĠ Ġoverride Ġfun Ġlatest Updates Request ( page : ĠInt ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . parse ( baseUrl ). build Up on () ĊĠĠĠĠĠĠĠ Ġuri . append QueryParameter (" page ", Ġpage . toString ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġnh Get ( uri . toString (), Ġpage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlatest Updates Parse ( response : ĠResponse ) Ġ= Ġparse Result Page ( response ) ĊĊĠĠĠ Ġoverride Ġfun Ġm anga Details Parse ( response : ĠResponse ) Ġ= Ġthrow ĠUnsupportedOperationException () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġan Ġobservable Ġwith Ġthe Ġupdated Ġdetails Ġfor Ġa Ġm anga . ĠNorm ally Ġit 's Ġnot Ġneeded Ġto ĊĠĠĠĠ Ġ* Ġoverride Ġthis Ġmethod . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġm anga Ġthe Ġm anga Ġto Ġbe Ġupdated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġfetch M anga Details ( manga : ĠSM anga ): ĠObservable < SM anga > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġclient . new Call ( manga Details Request ( manga )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Observable Success () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse To M anga ( manga , Ġit ). and Then ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm anga . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitialized Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġm anga Details Request ( manga : ĠSM anga ) Ġ= Ġnh Get ( baseUrl Ġ+ Ġm anga . url ) ĊĊĠĠĠ Ġprivate Ġfun Ġparse Result Page ( response : ĠResponse ): ĠM ang as Page Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= Ġresponse . as J soup () ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO ĠParse Ġlang Ġ+ Ġtags ĊĊĠĠĠĠĠĠĠ Ġval Ġm ang as Ġ= Ġdoc . select (". gallery Ġ> Ġa "). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSM anga . create (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġit . attr (" href ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġit . select First (". caption "). text () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlast () Ġis Ġa Ġhack Ġto Ġignore Ġthe Ġlazy - loader Ġplaceholder Ġimage Ġon Ġthe Ġfront Ġpage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthumbnail _ url Ġ= Ġit . select (" img "). last (). attr (" src ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġsome Ġpages , Ġthe Ġthumbnail Ġurl Ġdoes Ġnot Ġinclude Ġthe Ġprotocol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! thumbnail _ url !!. startsWith (" https :" )) Ġthumbnail _ url Ġ= Ġ" https :$ thumbnail _ url " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġhas Next Page Ġ= Ġif Ġ(! response . request . url . query Parameter Names . contains ( RE VERSE _ PARAM )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdoc . select First (". next ") Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . request . url . query Parameter ( RE VERSE _ PARAM ) !!. to Boolean () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠM ang as Page ( m ang as , Ġhas Next Page ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġparse Into Metadata ( metadata : ĠN H ent ai Search Metadata , Ġinput : ĠResponse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= ĠG ALL ERY _ JSON _ REGEX . find ( input . body !!. string ()) !!. group Values [ 1 ]. replace ( UNICODE _ ESCAPE _ REGEX ) Ġ{ Ġit . group Values [ 1 ]. toInt ( radix Ġ= Ġ 1 6 ). to Char (). toString () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġobj Ġ= ĠJson Parser . parse String ( json ). as JsonObject ĊĊĠĠĠĠĠĠĠ Ġwith ( metadata ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnh Id Ġ= Ġobj [" id "]. as Long ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload Date Ġ= Ġobj [" upload _ date "]. null Long ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfavor ites Count Ġ= Ġobj [" num _ favorites "]. null Long ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Id Ġ= Ġobj [" media _ id "]. null String ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj [" title "]. null Obj ?. let Ġ{ Ġtitle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj apanese Title Ġ= Ġtitle [" j apanese "]. null String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshort Title Ġ= Ġtitle [" pretty "]. null String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenglish Title Ġ= Ġtitle [" english "]. null String ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj [" images "]. null Obj ?. let Ġ{ Ġimages Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcover ImageType Ġ= Ġimages [" cover "] ?. get (" t "). null String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimages [" pages "]. null Array ?. map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. as JsonObject ?. get (" t "). null String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Image Types Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthumbnail ImageType Ġ= Ġimages [" thumbnail "] ?. get (" t "). null String ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġscan lator Ġ= Ġobj [" scan lator "]. null String ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj [" tags "] ?. as JsonArray ?. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġas Obj Ġ= Ġit . as JsonObject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( as Obj [" type "]. null String , Ġas Obj [" name "]. null String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . first Ġ!= Ġnull Ġ&& Ġit . second Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags . add ( Raised Tag ( it . first !! , Ġit . second !! , Ġif Ġ( it . first Ġ== Ġ" category ") ĠTAG _ TYPE _ VIRTUAL Ġelse ĠTAG _ TYPE _ DEFAULT )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Or Load Metadata ( manga Id : ĠLong ?, Ġnh Id : ĠLong ) Ġ= Ġget Or Load Metadata ( manga Id ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclient . new Call ( nh Get ( baseUrl Ġ+ ĠN H ent ai Search Metadata . nh Id To Path ( nh Id ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Observable Success () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Single () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Chapter List ( manga : ĠSM anga ): ĠObservable < List < S Chapter >> Ġ= ĠObservable . just ( ĊĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS Chapter . create (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġm anga . url ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" Chapter " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchapter _ number Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Page List ( chapter : ĠS Chapter ): ĠObservable < List < Page >> Ġ= Ġget Or Load Metadata ( chapter . manga Id , ĠN H ent ai Search Metadata . nh Url To Id ( chapter . url )). map Ġ{ Ġmetadata Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( metadata . media Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata . page Image Types . map Indexed Ġ{ Ġindex , Ġs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠimageUrl Ġ= ĠimageUrl From Type ( metadata . media Id !! , Ġindex Ġ+ Ġ 1 , Ġs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPage ( index , ĠimageUrl !! , ĠimageUrl ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. to Observable () ĊĊĠĠĠ Ġoverride Ġfun Ġfetch ImageUrl ( page : ĠPage ) Ġ= ĠObservable . just ( page . imageUrl !! ) !! ĊĊĠĠĠ Ġprivate Ġfun ĠimageUrl From Type ( media Id : ĠString , Ġpage : ĠInt , Ġt : ĠString ) Ġ= ĠN H ent ai Search Metadata . type To Extension ( t )?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġ" https :// i . nh ent ai . net / g all eries /$ media Id /$ page .$ it " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġchapter List Parse ( response : ĠResponse ): ĠList < S Chapter > Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠNotImplementedError (" Unused Ġmethod Ġcalled !") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpage List Parse ( response : ĠResponse ): ĠList < Page > Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠNotImplementedError (" Unused Ġmethod Ġcalled !") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠimageUrl Parse ( response : ĠResponse ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠNotImplementedError (" Unused Ġmethod Ġcalled !") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcombine Query ( filters : ĠFilter List ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstringBuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġval Ġadv Search Ġ= Ġfilters . filter Is Instance < Adv Search Entry Filter >(). flatMap Ġ{ Ġfilter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplit State Ġ= Ġfilter . state . split ("," ). map ( String :: trim ). filter Not ( String :: isBlank ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsplit State . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAdv Search Entry ( filter . name , Ġit . remove Prefix ("- "), Ġit . startsWith ("- ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadv Search . forEach Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . exclude ) ĠstringBuilder . append ("- ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append ("${ entry . name }: ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append ( entry . text ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append (" Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlang Filter Ġ= Ġfilters . filter Is Instance < Filter Lang >(). first OrNull () ĊĠĠĠĠĠĠĠ Ġif Ġ( lang Filter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlanguage Ġ= ĠSOURCE _ LANG _ LIST . first Ġ{ Ġit . first Ġ== Ġlang Filter . values [ lang Filter . state ] Ġ}. second ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! language . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append (" language :$ language ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠstringBuilder . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠAdv Search Entry ( val Ġname : ĠString , Ġval Ġtext : ĠString , Ġval Ġexclude : ĠBoolean ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Filter List (): ĠFilter List Ġ= ĠFilter List ( ĊĠĠĠĠĠĠĠ ĠFilter . Header (" Separ ate Ġtags Ġwith Ġcommas Ġ( ,) "), ĊĠĠĠĠĠĠĠ ĠFilter . Header (" Prepend Ġwith Ġdash Ġ(- ) Ġto Ġexclude "), ĊĠĠĠĠĠĠĠ ĠTag Filter (), ĊĠĠĠĠĠĠĠ ĠCategory Filter (), ĊĠĠĠĠĠĠĠ ĠGroup Filter (), ĊĠĠĠĠĠĠĠ ĠArtist Filter (), ĊĠĠĠĠĠĠĠ ĠPar ody Filter (), ĊĠĠĠĠĠĠĠ ĠChar acters Filter (), ĊĠĠĠĠĠĠĠ ĠFilter . Header (" Uploaded Ġvalid Ġunits Ġare Ġh , Ġd , Ġw , Ġm , Ġy ."), ĊĠĠĠĠĠĠĠ ĠFilter . Header (" example : Ġ(> 2 0 d )"), ĊĠĠĠĠĠĠĠ ĠU plo aded Filter (), ĊĊĠĠĠĠĠĠĠ ĠFilter . Separator (), ĊĠĠĠĠĠĠĠ ĠSort Filter (), ĊĠĠĠĠĠĠĠ ĠFilter . Header (" Sort Ġis Ġignored Ġif Ġfavor ites Ġonly "), ĊĠĠĠĠĠĠĠ ĠF avorite Filter (), ĊĠĠĠĠĠĠĠ ĠFilter Lang () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġclass ĠTag Filter Ġ: ĠAdv Search Entry Filter (" Tags ") ĊĠĠĠ Ġclass ĠCategory Filter Ġ: ĠAdv Search Entry Filter (" Categories ") ĊĠĠĠ Ġclass ĠGroup Filter Ġ: ĠAdv Search Entry Filter (" Groups ") ĊĠĠĠ Ġclass ĠArtist Filter Ġ: ĠAdv Search Entry Filter (" Art ists ") ĊĠĠĠ Ġclass ĠPar ody Filter Ġ: ĠAdv Search Entry Filter (" Par odies ") ĊĠĠĠ Ġclass ĠChar acters Filter Ġ: ĠAdv Search Entry Filter (" Characters ") ĊĠĠĠ Ġclass ĠU plo aded Filter Ġ: ĠAdv Search Entry Filter (" Uploaded ") ĊĠĠĠ Ġopen Ġclass ĠAdv Search Entry Filter ( name : ĠString ) Ġ: ĠFilter . Text ( name ) ĊĊĠĠĠ Ġprivate Ġclass ĠF avorite Filter Ġ: ĠFilter . CheckBox (" Show Ġfavor ites Ġonly ", Ġfalse ) ĊĊĠĠĠ Ġ// Ġlanguage Ġfiltering ĊĠĠĠ Ġprivate Ġclass ĠFilter Lang Ġ: ĠFilter . Select < String >(" Language ", ĠSOURCE _ LANG _ LIST . map Ġ{ Ġit . first Ġ}. to Typed Array ()) ĊĊĠĠĠ Ġprivate Ġclass ĠSort Filter Ġ: ĠUri Part Filter ( ĊĠĠĠĠĠĠĠ Ġ" Sort ĠBy ", ĊĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" Pop ular : ĠAll ĠTime ", Ġ" popular "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" Pop ular : ĠWeek ", Ġ" popular - week "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" Pop ular : ĠToday ", Ġ" popular - today "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" Recent ", Ġ" date ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġopen Ġclass ĠUri Part Filter ( displayName : ĠString , Ġval Ġvals : ĠArray < Pair < String , ĠString >>) Ġ: ĊĠĠĠĠĠĠĠ ĠFilter . Select < String >( displayName , Ġvals . map Ġ{ Ġit . first Ġ}. to Typed Array ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġto Uri Part () Ġ= Ġvals [ state ]. second ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT > ĠIterable <* >. find Instance () Ġ= Ġfind Ġ{ Ġit Ġis ĠT Ġ} Ġas ? ĠT ĊĊĠĠĠ Ġprivate Ġval ĠappName Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . app _ name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnh Get ( url : ĠString , Ġtag : ĠAny ? Ġ= Ġnull ) Ġ= ĠGET ( url ) ĊĠĠĠĠĠĠĠ Ġ. newBuilder () ĊĠĠĠĠĠĠĠ Ġ. header ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" User - Agent ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Mozilla / 5 . 0 Ġ( X 1 1 ; ĠLinux Ġx 8 6 _ 6 4 ) Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Apple WebKit / 5 3 7 . 3 6 Ġ( KHTML , Ġlike ĠGecko ) Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Chrome / 5 6 . 0 . 2 9 2 4 . 8 7 Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" S afari / 5 3 7 . 3 6 Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ appName /${ Build Config . VERSION _ CODE }" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. tag ( tag ). build () ĊĊĠĠĠ Ġoverride Ġval Ġid Ġ= ĠN H ENT AI _ SOURCE _ ID ĊĊĠĠĠ Ġoverride Ġval Ġlang Ġ= Ġ" all " ĊĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" nh ent ai " ĊĊĠĠĠ Ġoverride Ġval ĠbaseUrl Ġ= ĠN H ent ai Search Metadata . BASE _ URL ĊĊĠĠĠ Ġoverride Ġval Ġsupports Latest Ġ= Ġtrue ĊĊĠĠĠ Ġ// Ġ=== ĠURL ĠIMPORT ĠST UFF ĊĊĠĠĠ Ġoverride Ġval Ġmatching Hosts Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ Ġ" nh ent ai . net " ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġmap Url To M anga Url ( uri : ĠUri ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( uri . path Segments . first OrNull ()?. toLowerCase () Ġ!= Ġ" g ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ baseUrl / g /${ uri . path Segments [ 1 ] }/ " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetDescription Adapter ( controller : ĠM anga Controller ): ĠN H ent ai Description Adapter Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠN H ent ai Description Adapter ( controller ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠG ALL ERY _ JSON _ REGEX Ġ= ĠRegex (". parse \\ (\" (.* ) \" \\ ); ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠUNICODE _ ESCAPE _ REGEX Ġ= ĠRegex (" \\\\ u ([ 0 - 9 a - fA - F ]{ 4 }) ") ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRE VERSE _ PARAM Ġ= Ġ" TE H _ RE VERSE " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSOURCE _ LANG _ LIST Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" All ", Ġ""), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" English ", Ġ" english "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" J apanese ", Ġ" j apanese "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair (" Chinese ", Ġ" chinese ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ