package Ġa 9 8 apps . ly ric sed ge . network Ċ Ċ import Ġa 9 8 apps . ly ric sed ge . constants . Constants Ċ import Ġa 9 8 apps . ly ric sed ge . edge . C ock tail Ċ import Ġa 9 8 apps . ly ric sed ge . helper . dao . artist . Artist DAO Ċ import Ġa 9 8 apps . ly ric sed ge . helper . dao . cache . Cache DAO Ċ import Ġa 9 8 apps . ly ric sed ge . helper . dao . music . Music DAO Ċ import Ġa 9 8 apps . ly ric sed ge . model . Artist Ċ import Ġa 9 8 apps . ly ric sed ge . model . Cache Ċ import Ġa 9 8 apps . ly ric sed ge . model . Music Ċ import Ġa 9 8 apps . ly ric sed ge . preferences . Security Preferences Ċ import Ġa 9 8 apps . ly ric sed ge . util . Network Util Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Base 6 4 Ċ import Ġkotlinx . coroutines .* Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . Future Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . concurrent . TimeoutException Ċ Ċ class ĠL yr ics Request ( private Ġval Ġcontext : ĠContext , Ġprivate Ġval Ġlistener : ĠIL y ric Listener ) Ċ { ĊĠĠĠ Ġcompanion Ġobject ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġis Running : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// manage Ġqueue ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġhash Map Ġ= ĠHashMap < String , ĠFuture < L yr ics Result >>() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġjob Map Ġ= ĠHashMap < String , ĠJob >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfetch L yr ics ( old Hash : ĠString , Ġhash : ĠString , Ġart : ĠString , Ġsource Artist Hash : ĠString , Ġtitle : ĠString , Ġsource Title Hash : ĠString ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( job Map . containsKey ( old Hash )) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Map [ old Hash ]?. cancel ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Map . remove ( old Hash ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġprefs Ġ= ĠSecurity Preferences ( context ) ĊĠĠĠĠĠĠĠ Ġval Ġapprox Ly ric Ġ= Ġprefs . get ( Constants . LY R ICS _ APPRO X ) Ġas ĠBoolean ĊĊĠĠĠĠĠĠĠ Ġ// checks Ġwhether Ġthe Ġold Ġhash Ġis Ġin Ġthe Ġqueue , Ġif Ġtrue , Ġcancel Ġand Ġremove Ġand Ġadd Ġthe Ġnew Ġhash ĊĠĠĠĠĠĠĠ Ġif ( hash Map . containsKey ( old Hash )) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Map [ old Hash ]?. cancel ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Map . remove ( old Hash ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecutor Ġ= ĠExec utors . new Single Thread Executor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Map [ hash ] Ġ= Ġexecutor . submit ( Ly ric Task ( Constants . DEFAULT _ VALUE _ CAP T CHA , ĠConstants . DEFAULT _ VALUE _ CAP T CHA , Ġart , Ġtitle , Ġapprox Ly ric )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . shutdown () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecutor Ġ= ĠExec utors . new Single Thread Executor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Map [ hash ] Ġ= Ġexecutor . submit ( Ly ric Task ( Constants . DEFAULT _ VALUE _ CAP T CHA , ĠConstants . DEFAULT _ VALUE _ CAP T CHA , Ġart , Ġtitle , Ġapprox Ly ric )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . shutdown () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġjob Map [ hash ] Ġ= ĠGlobal Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 4 0 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Running Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Fetch Started ( context ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl yr ics Result Ġ= Ġhash Map [ hash ]?. get ( 1 , ĠTimeUnit . MIN UTES ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsuccess Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( lyr ics Result Ġ!= Ġnull Ġ&& Ġl yr ics Result . valid Save ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// insert Ġartist Ġon ĠDB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġartist DAO Ġ= ĠArtist DAO ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhash Artist Ġ= ĠBase 6 4 . encode ToString ( lyr ics Result . artist Name . encode To ByteArray (), ĠBase 6 4 . DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġartist Id Ġ= Ġartist DAO . has ( hash Artist ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( artist Id Ġ== Ġ- 1 L )// not Ġin Ġdb ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartist Ġ= ĠArtist () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist . name Ġ= Ġl yr ics Result . artist Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist . hash Ġ= ĠBase 6 4 . encode ToString ( lyr ics Result . artist Name . encode To ByteArray (), ĠBase 6 4 . DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist . source Hash Ġ= Ġsource Artist Hash ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist . url Ġ= Ġl yr ics Result . artist Url ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist DAO Ġ= ĠArtist DAO ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist . id Ġ= Ġartist DAO . save ( artist ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( artist . id Ġ!= Ġ- 1 L )// no Ġerrors Ġon Ġsave ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist Id Ġ= Ġartist . id Ġ?: Ġ- 1 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( artist Id Ġ!= Ġ- 1 L )// artist Ġon ĠDB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// insert Ġly ric Ġmusic Ġon ĠDB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmusic Ġ= ĠMusic () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmusic . hash Ġ= ĠBase 6 4 . encode ToString ( lyr ics Result . music Name . encode To ByteArray (), ĠBase 6 4 . DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmusic . source Hash Ġ= Ġsource Title Hash ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmusic . name Ġ= Ġl yr ics Result . music Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmusic . ly ric Ġ= Ġl yr ics Result . ly ric ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmusic . url Ġ= Ġl yr ics Result . ly ric Url ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmusic . translate Ġ= Ġl yr ics Result . ly ric Translate ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmusic DAO Ġ= ĠMusic DAO ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmusic . id Ġ= Ġmusic DAO . save ( music ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( music . id Ġ!= Ġ- 1 L )// no Ġerrors Ġon Ġsave ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// insert Ġon Ġcache ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache DAO Ġ= ĠCache DAO ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache Ġ= ĠCache () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache . music Id Ġ= Ġmusic . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache . artist Id Ġ= Ġartist Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache . hash Ġ= Ġhash ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache . type Ġ= Ġl yr ics Result . type ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache . id Ġ= Ġcache DAO . save ( cache ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( cache . id Ġ!= Ġ- 1 L )// no Ġerrors Ġon Ġsave ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// set Ġly ric Ġindex Ġto Ġcurrent Ġfo unded Ġly ric ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . set ( Constants . CACHE _ INDEX , Ġcache . id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// reset Ġbutton ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . setDefault ( Constants . TRANSL ATE _ TO GGLE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// update Ġpanel Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC ock tail . update List ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . set ( Constants . BLOCK ED _ HASH , Ġhash ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// error Ġon Ġinsert Ġcache , Ġremove Ġmusic ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmusic DAO Ġ= ĠMusic DAO ( context )// instantiate Ġagain Ġto Ġreopen Ġdb ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmusic DAO . delete ( artist Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// error Ġon Ġinsert Ġcache , Ġremove Ġartist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist DAO Ġ= ĠArtist DAO ( context )// instantiate Ġagain Ġto Ġreopen Ġdb ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist DAO . delete ( artist Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . set ( Constants . BLOCK ED _ HASH , Ġhash ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// error Ġon Ġinsert Ġmusic , Ġremove Ġartist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist DAO Ġ= ĠArtist DAO ( context )// instantiate Ġagain Ġto Ġreopen Ġdb ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist DAO . delete ( artist Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse // error Ġon Ġartist Ġon ĠDB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . set ( Constants . BLOCK ED _ HASH , Ġhash ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif ( lyr ics Result Ġ!= Ġnull Ġ&& Ġl yr ics Result . has Captcha ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . set ( Constants . CAP T CHA _ PENDING , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . set ( Constants . CAP T CHA _ VER IFICATION , Ġl yr ics Result . captcha Url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . set ( Constants . CAP T CHA _ SERIAL , Ġl yr ics Result . captcha Serial ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . set ( Constants . CAP T CHA _ TITLE _ TARGET , Ġart ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . set ( Constants . CAP T CHA _ NAME _ TARGET , Ġtitle ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// update Ġpanel Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC ock tail . update List ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblocks Ġthe Ġhash Ġonly Ġif Ġyou Ġhave Ġa Ġnetwork Ġconnection , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġmeans Ġthat Ġthe Ġrequest Ġwas Ġmade Ġbut Ġthe Ġletter Ġwas Ġnot Ġfound , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġthe Ġconnection Ġgoes Ġdown Ġduring Ġthe Ġrequest , Ġthe Ġhash Ġshould Ġnot Ġbe Ġblocked ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTEMP _ HASH Ġis Ġreset Ġso Ġthat Ġit Ġcan Ġbe Ġsearched Ġagain ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( Network Util . is Network Available ( context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . set ( Constants . BLOCK ED _ HASH , Ġhash ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . setDefault ( Constants . TEMP _ HASH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Fetch Finished ( context , Ġsuccess ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch ( t : ĠTimeout Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// reset Ġto Ġsearch Ġagain ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . setDefault ( Constants . TEMP _ HASH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Fetch Finished ( context , Ġfalse )// update Ġpanel Ġto Ġhide Ġloader ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch ( e : ĠException )// inter rupted Ġor Ġcancelled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Fetch Finished ( context , Ġfalse )// update Ġpanel Ġto Ġhide Ġloader ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfetch Existing L yr ics ( old Hash : ĠString , Ġhash : ĠString , Ġart : ĠString , Ġsource Artist Hash : ĠString , Ġtitle : ĠString , Ġsource Title Hash : ĠString , Ġartist Id : ĠLong , Ġmusic Id : ĠLong ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( job Map . containsKey ( old Hash )) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Map [ old Hash ]?. cancel ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Map . remove ( old Hash ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġprefs Ġ= ĠSecurity Preferences ( context ) ĊĠĠĠĠĠĠĠ Ġval Ġapprox Ly ric Ġ= Ġprefs . get ( Constants . LY R ICS _ APPRO X ) Ġas ĠBoolean ĊĊĠĠĠĠĠĠĠ Ġ// checks Ġwhether Ġthe Ġold Ġhash Ġis Ġin Ġthe Ġqueue , Ġif Ġtrue , Ġcancel Ġand Ġremove Ġand Ġadd Ġthe Ġnew Ġhash ĊĠĠĠĠĠĠĠ Ġif ( hash Map . containsKey ( old Hash )) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Map [ old Hash ]?. cancel ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Map . remove ( old Hash ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecutor Ġ= ĠExec utors . new Single Thread Executor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Map [ hash ] Ġ= Ġexecutor . submit ( Ly ric Task ( Constants . DEFAULT _ VALUE _ CAP T CHA , ĠConstants . DEFAULT _ VALUE _ CAP T CHA , Ġart , Ġtitle , Ġapprox Ly ric )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . shutdown () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecutor Ġ= ĠExec utors . new Single Thread Executor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Map [ hash ] Ġ= Ġexecutor . submit ( Ly ric Task ( Constants . DEFAULT _ VALUE _ CAP T CHA , ĠConstants . DEFAULT _ VALUE _ CAP T CHA , Ġart , Ġtitle , Ġapprox Ly ric )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . shutdown () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġjob Map [ hash ] Ġ= ĠGlobal Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 4 0 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Running Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Fetch Started ( context ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl yr ics Result Ġ= Ġhash Map [ hash ]?. get ( 1 , ĠTimeUnit . MIN UTES ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsuccess Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( lyr ics Result Ġ!= Ġnull Ġ&& Ġl yr ics Result . valid Save ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// update Ġartist Ġon ĠDB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartist Ġ= ĠArtist () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist . id Ġ= Ġartist Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist . hash Ġ= ĠBase 6 4 . encode ToString ( lyr ics Result . artist Name . encode To ByteArray (), ĠBase 6 4 . DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist . source Hash Ġ= Ġsource Artist Hash ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist . name Ġ= Ġl yr ics Result . artist Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist . url Ġ= Ġl yr ics Result . artist Url ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartist DAO Ġ= ĠArtist DAO ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( artist DAO . update ( artist )) // no Ġerrors Ġon Ġupdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// update Ġly ric Ġon ĠDB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmusic Ġ= ĠMusic () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmusic . id Ġ= Ġmusic Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmusic . hash Ġ= ĠBase 6 4 . encode ToString ( lyr ics Result . music Name . encode To ByteArray (), ĠBase 6 4 . DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmusic . source Hash Ġ= Ġsource Title Hash ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmusic . name Ġ= Ġl yr ics Result . music Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmusic . ly ric Ġ= Ġl yr ics Result . ly ric ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmusic . url Ġ= Ġl yr ics Result . ly ric Url ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmusic . translate Ġ= Ġl yr ics Result . ly ric Translate ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmusic DAO Ġ= ĠMusic DAO ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( music DAO . update ( music )) // no Ġerrors Ġon Ġupdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . setDefault ( Constants . TRANSL ATE _ TO GGLE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// update Ġpanel Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC ock tail . update List ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif ( lyr ics Result Ġ!= Ġnull Ġ&& Ġl yr ics Result . has Captcha ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . set ( Constants . CAP T CHA _ PENDING , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . set ( Constants . CAP T CHA _ VER IFICATION , Ġl yr ics Result . captcha Url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . set ( Constants . CAP T CHA _ SERIAL , Ġl yr ics Result . captcha Serial ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . set ( Constants . CAP T CHA _ TITLE _ TARGET , Ġart ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . set ( Constants . CAP T CHA _ NAME _ TARGET , Ġtitle ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// update Ġpanel Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC ock tail . update List ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblocks Ġthe Ġhash Ġonly Ġif Ġyou Ġhave Ġa Ġnetwork Ġconnection , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġmeans Ġthat Ġthe Ġrequest Ġwas Ġmade Ġbut Ġthe Ġletter Ġwas Ġnot Ġfound , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġthe Ġconnection Ġgoes Ġdown Ġduring Ġthe Ġrequest , Ġthe Ġhash Ġshould Ġnot Ġbe Ġblocked ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTEMP _ HASH Ġis Ġreset Ġso Ġthat Ġit Ġcan Ġbe Ġsearched Ġagain ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( Network Util . is Network Available ( context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . set ( Constants . BLOCK ED _ HASH , Ġhash ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . setDefault ( Constants . TEMP _ HASH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Fetch Finished ( context , Ġsuccess ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch ( t : ĠTimeout Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// reset Ġto Ġsearch Ġagain ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . setDefault ( Constants . TEMP _ HASH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Fetch Finished ( context , Ġfalse )// update Ġpanel Ġto Ġhide Ġloader ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch ( e : ĠException )// inter rupted Ġor Ġcancelled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Fetch Finished ( context , Ġfalse )// update Ġpanel Ġto Ġhide Ġloader ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfetch L yr ics Captcha ( serial : ĠString ?, Ġud ig : ĠString ?, Ġold Hash : ĠString , Ġhash : ĠString , Ġart : ĠString , Ġmus : ĠString ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( job Map . containsKey ( old Hash )) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Map [ old Hash ]?. cancel ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Map . remove ( old Hash ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġprefs Ġ= ĠSecurity Preferences ( context ) ĊĠĠĠĠĠĠĠ Ġval Ġapprox Ly ric Ġ= Ġprefs . get ( Constants . LY R ICS _ APPRO X ) Ġas ĠBoolean ĊĊĠĠĠĠĠĠĠ Ġ// checks Ġwhether Ġthe Ġold Ġhash Ġis Ġin Ġthe Ġqueue , Ġif Ġtrue , Ġcancel Ġand Ġremove Ġand Ġadd Ġthe Ġnew Ġhash ĊĠĠĠĠĠĠĠ Ġif ( hash Map . containsKey ( old Hash )) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Map [ old Hash ]?. cancel ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Map . remove ( old Hash ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecutor Ġ= ĠExec utors . new Single Thread Executor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Map [ hash ] Ġ= Ġexecutor . submit ( Ly ric Task ( serial , Ġud ig , Ġart , Ġmus , Ġapprox Ly ric )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . shutdown () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecutor Ġ= ĠExec utors . new Single Thread Executor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Map [ hash ] Ġ= Ġexecutor . submit ( Ly ric Task ( serial , Ġud ig , Ġart , Ġmus , Ġapprox Ly ric )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . shutdown () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġjob Map [ hash ] Ġ= ĠGlobal Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Running Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Fetch Started ( context ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl yr ics Result Ġ= Ġhash Map [ hash ]?. get ( 4 0 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsuccess Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( lyr ics Result Ġ!= Ġnull Ġ&& Ġl yr ics Result . valid Save ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . setDefault ( Constants . TRANSL ATE _ TO GGLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif ( lyr ics Result Ġ!= Ġnull Ġ&& Ġl yr ics Result . has Captcha ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . set ( Constants . CAP T CHA _ PENDING , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . set ( Constants . CAP T CHA _ VER IFICATION , Ġl yr ics Result . captcha Url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . set ( Constants . CAP T CHA _ SERIAL , Ġl yr ics Result . captcha Serial ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . set ( Constants . CAP T CHA _ TITLE _ TARGET , Ġart ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . set ( Constants . CAP T CHA _ NAME _ TARGET , Ġmus ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// update Ġpanel Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC ock tail . update List ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Fetch Finished ( context , Ġsuccess ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch ( e : ĠException )// inter rupted Ġor Ġcancelled Ġor Ġtimeout ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Fetch Finished ( context , Ġfalse )// update Ġpanel Ġto Ġhide Ġloader ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }