package Ġcom . l unes u . peng ch auf erry Ċ Ċ import Ġjava . lang . IllegalArgumentException Ċ import Ġjava . util .* Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġorg . joda . time . Duration Ċ import Ġorg . joda . time . Local Time Ċ import Ġorg . joda . time . format . DateTime Formatter Builder Ċ Ċ object ĠK ait o M ui Wo Fetcher Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval Ġurl Ġ= Ġ" https :// www . td . gov . hk / en / transport _ in _ h ong _ k ong / public _ transport / fer ries / service _ details /" ĊĊĠĠĠ Ġ// ĠTODO : Ġfetch Ġprices Ġfrom Ġweb Ġpage Ġas Ġwell ĊĠĠĠ Ġprivate Ġconst Ġval Ġf are Sat Ġ= Ġ" 1 2 . 0 " ĊĠĠĠ Ġprivate Ġconst Ġval Ġf are Sun Ġ= Ġ" 1 5 . 0 " ĊĠĠĠ Ġprivate Ġval Ġduration Ġ= ĠDuration . standard Minutes ( 2 0 ) ĊĠĠĠ Ġprivate Ġval Ġs aturday Ġ= ĠEnum Set . of ( F erry Day . Saturday ) Ċ // ĠĠĠ Ġprivate Ġval Ġweekend Ġ= ĠEnum Set . of ( F erry Day . Saturday , ĠF erry Day . S unday , ĠF erry Day . H oliday ) ĊĠĠĠ Ġprivate Ġval Ġformatter Ġ= ĠDateTime Formatter Builder (). append Pattern (" h . mm Ġa "). to Formatter () ĊĊĠĠĠ Ġprivate Ġfun Ġparse ( times : ĠMutable List < F erry >, Ġtext : ĠString , Ġfrom : ĠF erry P ier , Ġto : ĠF erry P ier ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Time . parse ( text . trim ('* ', Ġ'#', Ġ'. '). replace (". m ", Ġ" m "), Ġformatter ) ĊĠĠĠĠĠĠĠ Ġ// Ġ# ĠOper ate Ġon ĠS unday Ġand Ġpublic Ġh oliday Ġonly ĊĠĠĠĠĠĠĠ Ġval Ġs und ays Only Ġ= Ġtext . contains ('# ') ĊĠĠĠĠĠĠĠ Ġif Ġ(! s und ays Only ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimes . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF erry ( time , Ġfrom , Ġto , Ġduration , Ġs aturday , Ġf are Sat , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġ* ĠOper ate Ġon ĠS aturday Ġ( except Ġpublic Ġh oliday ) Ġonly ĊĠĠĠĠĠĠĠ Ġval Ġs atur days Only Ġ= Ġtext . contains ('* ') ĊĠĠĠĠĠĠĠ Ġif Ġ(! s atur days Only ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimes . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF erry ( time , Ġfrom , Ġto , Ġduration , ĠF erry Day . S unday And H olidays , Ġf are Sun , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġfetch (): ĠList < F erry > Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= ĠUtils . retry J soup Get ( url ) ĊĊĠĠĠĠĠĠĠ Ġval Ġf erry Times Ġ= Ġmutable ListOf < F erry >() ĊĠĠĠĠĠĠĠ Ġdocument ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. select (" table Ġtable . content _ table 1 Ġ> Ġtbody : contains ( From ĠDiscovery ĠBay ĠFrom ĠM ui ĠWo ) Ġ> Ġtr ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom DB ay Ġ= Ġit . child ( 0 ). text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse ( f erry Times , Ġfrom DB ay , ĠF erry P ier . Discovery Bay , ĠF erry P ier . M ui Wo ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom M ui Wo Ġ= Ġit . child ( 1 ). text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse ( f erry Times , Ġfrom M ui Wo , ĠF erry P ier . M ui Wo , ĠF erry P ier . Discovery Bay ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEither Ġnot Ġa Ġproper Ġtime Ġor Ġno Ġsuch Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġf erry Times ĊĠĠĠ Ġ} Ċ } Ċ