package Ġeu . kan ade . t ach iy omi . source . online . all Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Handler Thread Ċ import Ġcom . github . sal om on br ys . kot son .* Ċ import Ġcom . google . gson . JsonObject Ċ import Ġcom . google . gson . Json Parser Ċ import Ġcom . google . gson . stream . Json Reader Ċ import Ġcom . squareup . duk tape . D uk tape Ċ import Ġeu . kan ade . t ach iy omi . data . preference . Preferences Helper Ċ import Ġeu . kan ade . t ach iy omi . data . preference . get OrDefault Ċ 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 .* Ċ 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 . util . as J soup Ċ import Ġex h . HIT OM I _ SOURCE _ ID Ċ import Ġex h . metadata . EM UL ATED _ TAG _ NAMESPACE Ċ import Ġex h . metadata . models . Hit omi Gallery Metadata Ċ import Ġex h . metadata . models . Hit omi Gallery Metadata . Companion . BASE _ URL Ċ import Ġex h . metadata . models . Hit omi Gallery Metadata . Companion . LT N _ BASE _ URL Ċ import Ġex h . metadata . models . Hit omi Gallery Metadata . Companion . hl Id From Url Ċ import Ġex h . metadata . models . Hit omi Page Ċ import Ġex h . metadata . models . Hit omi Skeleton Gallery Metadata Ċ import Ġex h . metadata . models . Tag Ċ import Ġex h . metadata . null If Blank Ċ import Ġex h . search . Search Engine Ċ import Ġex h . util .* Ċ import Ġio . realm . Realm Ċ import Ġio . realm . Realm Configuration Ċ import Ġio . realm . Realm Results Ċ import Ġokhttp 3 . Request Ċ import Ġokhttp 3 . Response Ċ import Ġorg . js oup . nodes . Element Ċ import Ġrx . Observable Ċ import Ġrx . Scheduler Ċ import Ġrx . android . schedul ers . Android Schedulers Ċ import Ġrx . schedul ers . Schedulers Ċ import Ġrx . subjects . Async Subject Ċ import Ġtim ber . log . Tim ber Ċ import Ġu y . ko hes ive . in jekt . inject Lazy Ċ import Ġjava . nio . Buffer Under flow Exception Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Concurrent Linked Queue Ċ import Ġjava . util . concurrent . Linked BlockingQueue Ċ import Ġjava . util . concurrent . locks . Re entrant Lock Ċ import Ġkotlin . concurrent . thread Ċ Ċ /** Ċ Ġ* ĠW TF Ġis Ġgoing Ġon Ġin Ġthis Ġclass ? Ċ Ġ*/ Ċ class ĠHit omi ( private Ġval Ġcontext : ĠContext ) ĊĠĠĠ Ġ: Http Source (), ĠL ew d Source < Hit omi Gallery Metadata , ĠHit omi Skeleton Gallery Metadata > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġjson Parser Ġby Ġlazy ( Lazy Thread Safety Mode . PUBLIC ATION ) Ġ{ ĠJson Parser () Ġ} ĊĠĠĠ Ġprivate Ġval Ġsearch Engine Ġby Ġlazy Ġ{ ĠSearch Engine () Ġ} ĊĠĠĠ Ġprivate Ġval Ġprefs : ĠPreferences Helper Ġby Ġinject Lazy () ĊĊĠĠĠ Ġprivate Ġval Ġquery Cache Ġ= Ġmutable Map Of < String , ĠRealm Results < Hit omi Skeleton Gallery Metadata >>() ĊĠĠĠ Ġprivate Ġval Ġquery Work Queue Ġ= ĠLinked BlockingQueue < Triple < String , ĠInt , ĠAsync Subject < List < Hit omi Skeleton Gallery Metadata >>>> () ĊĠĠĠ Ġprivate Ġvar Ġsearch Worker : ĠThread ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġparse To M anga Scheduler : ĠScheduler ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġquery All () Ġ= ĠHit omi Gallery Metadata . Empty Query () ĊĠĠĠ Ġoverride Ġfun Ġquery From Url ( url : ĠString ) Ġ= ĠHit omi Gallery Metadata . Url Query ( url ) ĊĊĠĠĠ Ġoverride Ġval Ġmeta Parser : ĠHit omi Gallery Metadata .( Hit omi Skeleton Gallery Metadata ) Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġhl Id Ġ= Ġit . hl Id ĊĠĠĠĠĠĠĠ Ġthumbnail Url Ġ= Ġit . thumbnail Url ĊĠĠĠĠĠĠĠ Ġartist Ġ= Ġit . artist ĊĠĠĠĠĠĠĠ Ġgroup Ġ= Ġit . group ĊĠĠĠĠĠĠĠ Ġtype Ġ= Ġit . type ĊĠĠĠĠĠĠĠ Ġlanguage Ġ= Ġit . language ĊĠĠĠĠĠĠĠ Ġlanguage Simple Ġ= Ġit . language Simple ĊĠĠĠĠĠĠĠ Ġseries . clear () ĊĠĠĠĠĠĠĠ Ġseries . addAll ( it . series ) ĊĠĠĠĠĠĠĠ Ġcharacters . clear () ĊĠĠĠĠĠĠĠ Ġcharacters . addAll ( it . characters ) ĊĠĠĠĠĠĠĠ Ġbuy Link Ġ= Ġit . buy Link ĊĠĠĠĠĠĠĠ Ġupload Date Ġ= Ġit . upload Date ĊĠĠĠĠĠĠĠ Ġtags . clear () ĊĠĠĠĠĠĠĠ Ġtags . addAll ( it . tags ) ĊĠĠĠĠĠĠĠ Ġtitle Ġ= Ġit . title ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsearch M anga Request ( page : ĠInt , Ġquery : ĠString , Ġfilters : ĠFilter List ) Ġ= Ġthrow ĠUnsupportedOperationException (" Unused Ġmethod Ġcalled !") ĊĊĠĠĠ Ġoverride Ġfun Ġsearch M anga Parse ( response : ĠResponse ) Ġ= Ġthrow ĠUnsupportedOperationException (" Unused Ġmethod Ġcalled !") ĊĊĠĠĠ Ġoverride Ġfun Ġm anga Details Parse ( response : ĠResponse ) Ġ= Ġthrow ĠUnsupportedOperationException (" Unused Ġmethod Ġcalled !") ĊĊĠĠĠ Ġ/** Ġ>>> ĠPAR SE ĠTO ĠM ANG A ĠS CH ED UL ER Ġ<<< Ġ**/ ĊĠĠĠ Ġ/* ĊĠĠĠ ĠRealm Ġbecomes Ġvery , Ġvery Ġslow Ġafter Ġyou Ġstart Ġopening Ġand Ġclosing ĠReal ms Ġrapid ly . ĊĠĠĠ ĠBy Ġkeeping Ġa Ġglobal ĠRealm Ġopen Ġat Ġall Ġtimes , Ġwe Ġcan Ġmig it ate Ġthis . ĊĠĠĠ ĠReal ms Ġare Ġper - thread Ġso Ġwe Ġcreate Ġour Ġown ĠRx Java Ġscheduler Ġto Ġschedule Ġrealm - heavy ĊĠĠĠ Ġoperations Ġon . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġprivate Ġfun Ġstart Parse To M anga Scheduler () Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( parse To M anga Scheduler Ġ!= Ġnull ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġthread Ġ= Ġobject Ġ: ĠHandler Thread (" parse - to - manga - thread ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Looper Prepared () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOpen Ġpermanent ĠRealm Ġinstance Ġon Ġthis Ġthread ! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRealm . getDefaultInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthread . start () ĊĠĠĠĠĠĠĠ Ġparse To M anga Scheduler Ġ= ĠAndroid Schedulers . from ( thread . lo oper ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse To M anga Scheduler (): ĠScheduler Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Parse To M anga Scheduler () ĊĠĠĠĠĠĠĠ Ġreturn Ġparse To M anga Scheduler !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ>>> ĠSEARCH ĠWORK ER Ġ<<< Ġ**/ ĊĠĠĠ Ġ/* ĊĠĠĠ ĠRunning ĠRealm Results . size Ġon Ġa Ġnew ĠRealm Results Ġobject Ġis Ġvery , Ġvery Ġslow . ĊĠĠĠ ĠBy Ġcaching Ġour ĠRealm Results Ġin Ġmemory , Ġwe Ġavoid Ġcreating Ġmany Ġnew ĠRealm Results Ġobjects , ĊĠĠĠ Ġthus Ġspeed ing Ġup ĠRealm Results . size . ĊĊĠĠĠ ĠReal ms Ġare Ġper - thread Ġand ĠRealm Results Ġare Ġbound Ġto ĠReal ms . ĠTherefore Ġwe Ġcreate Ġa ĊĠĠĠ Ġpermanent Ġthread Ġthat Ġwill Ġopen Ġa Ġpermanent Ġrealm Ġand Ġwait Ġfor Ġrequests Ġto Ġload ĠRealm Results . ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġprivate Ġfun Ġstart Search Worker () Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( search Worker Ġ!= Ġnull ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġsearch Worker Ġ= Ġthread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġensure Cache Loaded (). to Blocking (). first () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreal ms Ġ= ĠarrayOf ( getCache Realm ( 0 ), Ġget Cache Realm ( 1 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ("[ SW ] ĠNew Ġsearch Ġworker Ġthread Ġstarted !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrealm Ġ= Ġreal ms [ prefs . eh _ hl _ last Realm Index (). get OrDefault ()] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ("[ SW ] ĠWaiting Ġfor Ġnext Ġquery !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġquery Work Queue . take () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ("[ SW ] ĠFound Ġnew Ġquery Ġ( page Ġ${ next . second }): Ġ${ next . first }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( query Cache [ next . first ] Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Ġ= Ġrealm . where ( Hit omi Skeleton Gallery Metadata :: class . java ). findFirst () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext . third . onNext ( emptyList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext . third . on Completed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed Ġ= Ġsearch Engine . parse Query ( next . first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiltered Ġ= Ġsearch Engine . filter Results ( realm . where ( Hit omi Skeleton Gallery Metadata :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparsed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst . title Fields ). findAll () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Cache [ next . first ] Ġ= Ġfiltered ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiltered Ġ= Ġquery Cache [ next . first ] !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbegin Index Ġ= Ġ( next . second Ġ- Ġ 1 ) Ġ* ĠPAGE _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( begin Index Ġ> Ġfiltered . last Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext . third . onNext ( emptyList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext . third . on Completed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠChunk Ġinto Ġpages Ġof Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġrealm . copyFrom Realm ( filtered . sub List ( begin Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMath . min ( next . second Ġ* ĠPAGE _ SIZE , Ġfiltered . size ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext . third . onNext ( res ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext . third . on Completed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtry Search ( page : ĠInt , Ġquery : ĠString ): ĠObservable < List < Hit omi Skeleton Gallery Metadata >> Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Search Worker () ĊĊĠĠĠĠĠĠĠ Ġval Ġsubject Ġ= ĠAsync Subject . create < List < Hit omi Skeleton Gallery Metadata >>() ĊĠĠĠĠĠĠĠ Ġquery Work Queue . clear () ĊĠĠĠĠĠĠĠ Ġquery Work Queue . add ( Triple ( query , Ġpage , Ġsubject )) ĊĠĠĠĠĠĠĠ Ġreturn Ġsubject ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Search M anga ( page : ĠInt , Ġquery : ĠString , Ġfilters : ĠFilter List ): ĠObservable < M ang as Page > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġurl Import Fetch Search M anga ( query ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Search ( page , Ġquery ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġit . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSM anga . create (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Url Without Domain ( it . url !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġit . title !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . thumbnail Url ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthumbnail _ url Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM ang as Page ( res , Ġit . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfetch M anga Details ( manga : ĠSM anga ): ĠObservable < SM anga > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlazy Load Meta Pages ( Hit omi Gallery Metadata . hl Id From Url ( manga . url ), Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew M anga Ġ= Ġparse To M anga ( query From Url ( manga . url ), Ġit . first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm anga . copyFrom ( new M anga ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor c ibly Ġcopy Ġtitle Ġas Ġcopy From Ġdoes Ġnot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm anga . title Ġ= Ġnew M anga . title ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm anga ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( parse To M anga Scheduler ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Chapter List ( manga : ĠSM anga ): ĠObservable < List < S Chapter >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlazy Load Meta ( query From Url ( manga . url ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlazy Load Meta Pages ( hl Id From Url ( manga . url ), Ġfalse ). map Ġ{ Ġit . first Ġ} ĊĠĠĠĠĠĠĠ Ġ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( S Chapter . create (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġreader Url ( it . hl Id !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" Chapter " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchapter _ number Ġ= Ġ 1 f ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . upload Date ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate _ upload Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Page List ( chapter : ĠS Chapter ): ĠObservable < List < Page >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhl Id Ġ= Ġchapter . url . substring After Last ('/ '). remove Suffix (". html ") ĊĠĠĠĠĠĠĠ Ġreturn Ġlazy Load Meta Pages ( hl Id , Ġfalse ). map Ġ{ Ġ(_, Ġit ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . map Indexed Ġ{ Ġindex , Ġs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPage ( index , Ġs , Ġs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġchapter List Parse ( response : ĠResponse ) Ġ= Ġthrow ĠUnsupportedOperationException (" Unused Ġmethod Ġcalled !") ĊĊĠĠĠ Ġoverride Ġfun Ġpage List Parse ( response : ĠResponse ) Ġ= Ġthrow ĠUnsupportedOperationException (" Unused Ġmethod Ġcalled !") ĊĊĠĠĠ Ġoverride Ġfun ĠimageUrl Parse ( response : ĠResponse ) Ġ= Ġthrow ĠUnsupportedOperationException (" Unused Ġmethod Ġcalled !") ĊĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" hit omi . la Ġ( very Ġslow Ġsearch )" ĊĊĠĠĠ Ġoverride Ġval ĠbaseUrl Ġ= ĠBASE _ URL ĊĊĠĠĠ Ġoverride Ġval Ġlang Ġ= Ġ" all " ĊĊĠĠĠ Ġoverride Ġval Ġid Ġ= ĠH IT OM I _ SOURCE _ ID ĊĊĠĠĠ Ġoverride Ġval Ġsupports Latest Ġ= Ġtrue ĊĊĠĠĠ Ġprivate Ġval Ġcache Locks Ġ= ĠarrayOf ( Re entrant Lock (), ĠRe entrant Lock ()) ĊĊĠĠĠ Ġoverride Ġfun Ġpopular M anga Request ( page : ĠInt ) Ġ= ĠGET ("$ LT N _ BASE _ URL / popular - all . no z omi ") ĊĊĠĠĠ Ġoverride Ġfun Ġpopular M anga Parse ( response : ĠResponse ) Ġ= Ġthrow ĠUnsupportedOperationException (" Unused Ġmethod Ġcalled !") ĊĠĠĠ Ġoverride Ġfun Ġlatest Updates Parse ( response : ĠResponse ) Ġ= Ġthrow ĠUnsupportedOperationException (" Unused Ġmethod Ġcalled !") ĊĊĠĠĠ Ġoverride Ġfun Ġlatest Updates Request ( page : ĠInt ) Ġ= ĠGET ("$ LT N _ BASE _ URL / index - all . no z omi ") ĊĊĠĠĠ Ġfun Ġreader Url ( hl Id : ĠString ) Ġ= Ġ"$ BASE _ URL / reader /$ hl Id . html " ĊĊĠĠĠ Ġprivate Ġfun Ġlazy Load Meta Pages ( hl Id : ĠString , Ġforce Reload : ĠBoolean ): ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObservable < Pair < Hit omi Skeleton Gallery Metadata , ĠList < String >>> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpages Ġ= Ġdef Realm Ġ{ Ġrealm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr res Ġ= Ġrealm . where ( Hit omi Page :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. equalTo ( Hit omi Page :: gallery . name , Ġhl Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sort ( Hit omi Page :: index . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. findAll () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( r res . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr res . map ( Hit omi Page :: url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmeta Ġ= Ġget Available Cache Realm ()?. use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġit . where ( Hit omi Skeleton Gallery Metadata :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. equalTo ( Hit omi Skeleton Gallery Metadata :: hl Id . name , Ġhl Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. findFirst () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠForce Ġreload Ġif Ġno Ġthumbnail ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( res ?. thumbnail Url Ġ== Ġnull ) Ġnull Ġelse Ġres ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( pages Ġ!= Ġnull Ġ&& Ġmeta Ġ!= Ġnull Ġ&& Ġ! force Reload ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠObservable . just ( meta Ġto Ġpages ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġloc Ġ= Ġ"$ BASE _ URL / g all eries /$ hl Id . html " ĊĠĠĠĠĠĠĠ Ġval Ġreq Ġ= ĠGET ( loc ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġclient . new Call ( req ). as Observable Success (). map Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= Ġresponse . as J soup () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠD uk tape . create (). use Ġ{ Ġdu ck Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthumb s Ġ= Ġdoc . getElementsBy Tag (" script "). find Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . html (). startsWith (" var Ġthumb nails ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed Thumb s Ġ= Ġjson Parser . parse ( thumbs !!. html () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. remove Prefix (" var Ġthumb nails Ġ= Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. remove Suffix ("; ")). array ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġpages Ġ( drop Ġlast Ġelement Ġas Ġits Ġalways Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Pages Ġ= Ġparsed Thumb s . take ( parsed Thumb s . size () Ġ- Ġ 1 ). map Indexed Ġ{ Ġindex , Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Name Ġ= Ġitem . string ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. substring After Last ('/') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. remove Suffix (". jpg ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ"// a . hit omi . la / g all eries /$ hl Id /$ itemName " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresolved Ġ= Ġresolve Image ( duck , Ġurl ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHit omi Page (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgallery Ġ= Ġhl Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . index Ġ= Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . url Ġ= Ġresolved ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠParse Ġmeta ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgallery Parent Ġ= Ġdoc . select (". gallery ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Meta Ġ= ĠHit omi Skeleton Gallery Metadata (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġloc ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġgallery Parent . select (" h 1 Ġ> Ġa "). text () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist Ġ= Ġgallery Parent . select (" h 2 Ġ> Ġ. comma - list Ġ> Ġli "). join ToString Ġ{ Ġit . text () Ġ}. null If Blank () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthumbnail Url Ġ= Ġ" https :" Ġ+ Ġdoc . select (". cover Ġimg "). attr (" src ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload Date Ġ= ĠDATE _ FORMAT . parse ( doc . select (". date "). text ()). time ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgallery Parent . select (". gallery - info Ġtr "). forEach Ġ{ Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġelement . child ( 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( element . child ( 0 ). text (). toLowerCase ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" group " Ġ-> Ġgroup Ġ= Ġcontent . text (). trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" type " Ġ-> Ġtype Ġ= Ġcontent . text (). trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" language " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlanguage Ġ= Ġcontent . text (). trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlanguage Simple Ġ= Ġcontent . select (" a ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. attr (" href ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. split ("- "). get OrNull ( 1 ) Ġ?: Ġ" speech less " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" series " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseries . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseries . addAll ( content . select (" li "). map ( Element :: text )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" characters " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters . addAll ( content . select (" li "). map ( Element :: text )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" tags " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags . addAll ( content . select (" li "). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtxt Ġ= Ġit . text () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġns : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname : ĠString ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtxt . endsWith ( CHAR _ M ALE ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġns Ġ= Ġ" male " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġtxt . remove Suffix ( CHAR _ M ALE ). trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtxt . endsWith ( CHAR _ F EM ALE ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġns Ġ= Ġ" female " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġtxt . remove Suffix ( CHAR _ F EM ALE ). trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġns Ġ= ĠE MUL ATED _ TAG _ NAMESPACE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġtxt . trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTag ( ns , Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInject Ġpseudo Ġtags ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun ĠString ?. null Na Tag ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( this Ġ== Ġnull Ġ|| Ġthis Ġ== ĠNOT _ AVAILABLE ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags . add ( Tag ( name , Ġthis )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup . null Na Tag (" group ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist . null Na Tag (" artist ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlanguage Simple . null Na Tag (" language ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseries . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . null Na Tag (" par ody ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . null Na Tag (" character ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . null Na Tag (" category ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrealm Trans Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDelete Ġold Ġpages ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . where ( Hit omi Page :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. equalTo ( Hit omi Page :: gallery . name , Ġhl Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. findAll (). delete All From Realm () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġnew Ġpages ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . insert ( new Pages ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġ.. Ġ 1 ). map Ġ{ Ġget Cache Realm ( it ) Ġ}. forEach Ġ{ Ġrealm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrealm . use Trans Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDelete Ġold Ġmeta ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . where ( Hit omi Skeleton Gallery Metadata :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. equalTo ( Hit omi Skeleton Gallery Metadata :: hl Id . name , Ġhl Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. findAll (). delete All From Realm () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġnew Ġmeta ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . insert ( new Meta ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Meta Ġto Ġnew Pages . map ( Hit omi Page :: url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch And Resolve Request ( page : ĠInt , Ġrequest : ĠRequest ): ĠObservable < M ang as Page > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Begin Ġpre - loading Ġcache ĊĠĠĠĠĠĠĠ Ġensure Cache Loaded ( false ). subscribe On ( Schedulers . computation ()). subscribe () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġclient . new Call ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Observable Success () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteBuffer . wrap ( response . body () !!. bytes ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= Ġmutable ListOf < SM anga >() ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Ġ+= ĠSM anga . create (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Url Without Domain ("$ BASE _ URL / g all eries /${ buffer . int }. html ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" Loading ..." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠBuffer Under flow Exception ) Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= ĠPAGE _ SIZE Ġ* Ġ( page Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Index Ġ= ĠMath . min ( offset Ġ+ ĠPAGE _ SIZE , Ġout . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM ang as Page ( out . sub List ( offset , Ġend Index ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Index Ġ< Ġout . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Pop ular M anga ( page : ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġfetch And Resolve Request ( page , Ġpopular M anga Request ( page )) ĊĠĠĠ Ġoverride Ġfun Ġfetch Latest Updates ( page : ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġfetch And Resolve Request ( page , Ġlatest Updates Request ( page )) ĊĊĠĠĠ Ġprivate Ġfun Ġshould Refresh Gallery Files (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Diff Ġ= ĠSystem . currentTimeMillis () Ġ- Ġprefs . eh _ hl _ last Refresh (). get OrDefault () ĊĠĠĠĠĠĠĠ Ġreturn Ġtime Diff Ġ> Ġprefs . eh _ hl _ refresh Frequency (). get OrDefault (). to Long () Ġ* Ġ 6 0 L Ġ* Ġ 6 0 L Ġ* Ġ 1 0 0 0 L ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< T > Ġlock Cache ( index : ĠInt , Ġblock : Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġcache Locks [ index ]. lock () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġblock () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Locks [ index ]. unlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Gallery Metadata ( url : ĠString ): ĠObservable < Hit omi Skeleton Gallery Metadata > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmid Ġ= ĠHit omi Gallery Metadata . hl Id From Url ( url ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġensure Cache Loaded (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Available Cache Realm ()?. use Ġ{ Ġrealm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Cache Metadata ById ( realm , Ġmid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Cache Metadata ById ( realm : ĠRealm , Ġhl Id : ĠString ): ĠHit omi Skeleton Gallery Metadata ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrealm . where ( Hit omi Skeleton Gallery Metadata :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. equalTo ( Hit omi Skeleton Gallery Metadata :: hl Id . name , Ġhl Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. findFirst ()?. let Ġ{ Ġrealm . copyFrom Realm ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġensure Cache Loaded ( blocking : ĠBoolean Ġ= Ġtrue ): ĠObservable < Any > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObservable . from Callable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( prefs . eh _ hl _ last Realm Index (). get OrDefault () Ġ>= Ġ 0 ) Ġ{ Ġreturn @ from Callable ĠAny () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Realm Index Ġ= Ġwhen ( prefs . eh _ hl _ last Realm Index (). get OrDefault ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! blocking Ġ&& Ġcache Locks [ next Realm Index ]. is Locked ) Ġreturn @ from Callable ĠAny () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock Cache ( next Realm Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshould Refresh Ġ= Ġshould Refresh Gallery Files () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Cache Realm ( next Realm Index ). use Trans Ġ{ Ġrealm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! realm . isEmpty Ġ&& Ġ! should Refresh ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ from Callable ĠAny () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrealm . delete All () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcores Ġ= ĠRuntime . get Runtime (). available Processors () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Starting Ġ$ cores Ġthreads Ġto Ġparse Ġhit omi . la Ġgallery Ġdata ...") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwork Queue Ġ= ĠConcurrent Linked Queue < Int >(( 0 Ġuntil ĠG ALL ERY _ CHUNK _ COUNT ). toList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthreads Ġ= Ġmutable ListOf < Thread >() ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( thread Index Ġin Ġ 1 Ġ.. Ġcores ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthreads Ġ+= Ġthread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Cache Realm ( next Realm Index ). use Ġ{ Ġrealm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġwork Queue . poll () Ġ?: Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" [$ thread Index ] ĠDownloading Ġ+ Ġparsing Ġhit omi . la Ġgallery Ġdata Ġ${ i Ġ+ Ġ 1 }/ $ G ALL ERY _ CHUNK _ COUNT ...") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ" https :// l tn . hit omi . la / g all eries $ i . json " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresp Ġ= Ġclient . new Call ( GET ( url )). execute (). body () !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= Ġmutable ListOf < Hit omi Skeleton Gallery Metadata >() ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Reader ( resp . char Stream ()). use Ġ{ Ġreader Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader . begin Array () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( reader . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgallery Ġ= ĠHit omi Gallery . fromJson ( reader . next JsonObject ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmeta Ġ= ĠHit omi Skeleton Gallery Metadata () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgallery . addTo Gallery Meta ( meta ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . add ( meta ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" [$ thread Index ] ĠS aving Ġhit omi . la Ġgallery Ġdata Ġ${ i Ġ+ Ġ 1 }/ $ G ALL ERY _ CHUNK _ COUNT ...") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrealm . trans Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrealm . insert ( out ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthreads . forEach ( Thread :: join ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġrefresh Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . eh _ hl _ last Refresh (). set ( System . currentTimeMillis ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġlast Ġref reshed Ġrealm ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . eh _ hl _ last Realm Index (). set ( next Realm Index ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Successfully Ġref reshed Ġrealm Ġ#$ next Realm Index !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ from Callable ĠAny () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresolve Image ( duk tape : ĠD uk tape , Ġurl : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" https :" Ġ+ Ġd uk tape . evaluate ( IMAGE _ RESOL VER . replace ( IMAGE _ RESOL VER _ URL _ VAR , Ġurl )) Ġas ĠString ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠHit omi Gallery . addTo Gallery Meta ( meta : ĠHit omi Skeleton Gallery Metadata ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( meta ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhl Id Ġ= Ġid . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInt ention ally Ġavoid Ġsetting Ġthumb nails ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġanother Ġrequest Ġto Ġget Ġthem Ġany ways ĊĠĠĠĠĠĠĠĠĠĠĠ Ġartist Ġ= Ġartists . first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Ġ= Ġgroups . first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġthis @ addTo Gallery Meta . type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlanguage Simple Ġ= Ġlanguage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġseries . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġseries . addAll ( par odies ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters . addAll ( this @ addTo Gallery Meta . characters ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtags . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ addTo Gallery Meta . tags . map To ( tags ) Ġ{ ĠTag ( it . key , Ġit . value ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġget And Lock Available Cache Realm ( block : Ġ( Realm ) Ġ-> ĠT ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġprefs . eh _ hl _ last Realm Index (). get OrDefault () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif ( index Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache Ġ= Ġget Cache Realm ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock Cache ( index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( cache ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Available Cache Realm (): ĠRealm ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġprefs . eh _ hl _ last Realm Index (). get OrDefault () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif ( index Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Cache Realm ( index ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Cache Realm ( index : ĠInt ) Ġ= ĠRealm . getInstance ( get Realm Config ( index )) ĊĊĠĠĠ Ġprivate Ġfun Ġget Realm Config ( index : ĠInt ) Ġ= ĠRealm Configuration . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. name (" hit omi - cache -$ index ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. delete Realm If Migration Needed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġfun Ġforce Ensure Cache Loaded (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠLock Ġall Ġcaches ĊĠĠĠĠĠĠĠ Ġif (! cache Locks [ 0 ]. try Lock () Ġ|| Ġ! cache Locks [ 1 ]. try Lock ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( cache Locks [ 0 ]. is Hel d By Current Thread ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Locks [ 0 ]. unlock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( cache Locks [ 1 ]. is Hel d By Current Thread ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Locks [ 1 ]. unlock () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . eh _ hl _ last Realm Index (). set (- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . eh _ hl _ last Refresh (). set ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġensure Cache Loaded ( false ). subscribe On ( Schedulers . computation ()). subscribe () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Locks [ 0 ]. unlock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Locks [ 1 ]. unlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPAGE _ SIZE Ġ= Ġ 2 5 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠCHAR _ M ALE Ġ= Ġ" âĻ Ĥ " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠCHAR _ F EM ALE Ġ= Ġ" âĻ Ģ " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠG ALL ERY _ CHUNK _ COUNT Ġ= Ġ 2 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠIMAGE _ RESOL VER _ URL _ VAR Ġ= Ġ"% IMAGE _ URL %" ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠNOT _ AVAILABLE Ġ= Ġ" N / A " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDATE _ FORMAT Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . N ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimpleDateFormat (" yyyy - MM - dd ĠHH : mm : ss X ", ĠLocale . US ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSimpleDateFormat (" yyyy - MM - dd ĠHH : mm : ss '- 0 5 '", ĠLocale . US ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠIMAGE _ RESOL VER Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( function () Ġ{ Ċ var Ġad ap ose Ġ= Ġfalse ; Ġ// ĠCurrently Ġnot Ġsure Ġwhat Ġthis Ġdoes , Ġit Ġswitches Ġout Ġfrontend ĠURL Ġwhen Ġwe Ġright Ġclick ??? Ċ var Ġnumber _ of _ front ends Ġ= Ġ 2 ; Ċ function Ġsubdomain _ from _ gallery id ( g ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ad ap ose ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ' 0 '; ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠString . from CharCode ( 9 7 Ġ+ Ġ( g Ġ% Ġnumber _ of _ front ends )); Ċ } Ċ function Ġsubdomain _ from _ url ( url , Ġbase ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġretval Ġ= Ġ' a '; ĊĠĠĠĠĠĠĠ Ġif Ġ( base ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretval Ġ= Ġbase ; ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġr Ġ= Ġ/ \/ (\ d +)\ // ; ĊĠĠĠĠĠĠĠ Ġvar Ġm Ġ= Ġr . exec ( url ); ĊĠĠĠĠĠĠĠ Ġvar Ġg ; ĊĠĠĠĠĠĠĠ Ġif Ġ( m ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg Ġ= ĠparseInt ( m [ 1 ]); ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( g ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretval Ġ= Ġsubdomain _ from _ gallery id ( g ) Ġ+ Ġretval ; ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġretval ; Ċ } Ċ function Ġurl _ from _ url ( url , Ġbase ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġurl . replace (/ \/ \/ .. ? \. hit omi \. la \ // , Ġ'// '+ subdomain _ from _ url ( url , Ġbase )+ '. hit omi . la /'); Ċ } Ċ Ċ return Ġurl _ from _ url ('$ IMAGE _ RESOL VER _ URL _ VAR '); Ċ })(); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠHit omi Gallery ( val Ġartists : ĠList < String >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpar odies : ĠList < String >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroups : ĠList < String >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtags : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcharacters : ĠList < String >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlanguage : ĠString ?) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfrom Json ( obj : ĠJsonObject ): ĠHit omi Gallery ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= ĠHit omi Gallery ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj . map Null String List (" a "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj . map Null String List (" p "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj [" id "]. int , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj [" n "]. string , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj . map Null String List (" g "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj [" t "] ?. null Array ?. associate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstr Ġ= Ġit . string ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( str . contains (" :" )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstr . substring Before (': ') Ġto Ġstr . substring After (': ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE MUL ATED _ TAG _ NAMESPACE Ġto Ġstr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj . map Null String List (" c "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj [" type "]. string , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj [" l "]. null String ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠJsonObject . map Null String List ( key : ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġthis [ key ]?. null Array ?. map Ġ{ Ġit . string Ġ} Ġ?: Ġempty List () ĊĠĠĠ Ġ} Ċ } Ċ