package Ġsl ak . fan fi ction stories . data . fetch ers Ċ Ċ import Ġandroid . os . Parcelable Ċ import Ġkotlinx . android . parcel . Parcel ize Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġorg . js oup . J soup Ċ import Ġorg . js oup . nodes . Element Ċ import Ġorg . js oup . select . Elements Ċ import Ġsl ak . fan fi ction stories . Notifications Ċ import Ġsl ak . fan fi ction stories . Notifications . Companion . default Intent Ċ import Ġsl ak . fan fi ction stories . R Ċ import Ġsl ak . fan fi ction stories . Story Model Ċ import Ġsl ak . fan fi ction stories . Story Progress Ċ import Ġsl ak . fan fi ction stories . Story Status Ċ import Ġsl ak . fan fi ction stories . data . Cache Ċ import Ġsl ak . fan fi ction stories . data . fetch ers . Parser Utils . author Id From Author Ċ import Ġsl ak . fan fi ction stories . data . fetch ers . Parser Utils . convert ImageUrl Ċ import Ġsl ak . fan fi ction stories . data . fetch ers . Parser Utils . parse Story Metadata Ċ import Ġsl ak . fan fi ction stories . data . fetch ers . Parser Utils . un escape Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ val Ġauthor Cache Ġ= ĠCache < Author >(" Author ", ĠTimeUnit . DAYS . to Millis ( 1 )) Ċ Ċ /** Ċ Ġ* ĠA Ġdata Ġclass Ġrepresenting Ġan Ġauthor 's Ġmetadata . Ċ Ġ* Ġ@ see Ġget Author Ċ Ġ*/ Ċ @ Parcel ize Ċ data Ġclass ĠAuthor ( val Ġname : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid : ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjoined Date Seconds : ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated Date Seconds : ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcountry Name : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠimageUrl : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbio Html : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser St ories : ĠList < Story Model >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfavorite St ories : ĠList < Story Model >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfavorite Authors : ĠList < Pair < Long , ĠString >>) Ġ: ĠParcel able , Ġjava . io . Serializable Ċ Ċ /** Ċ Ġ* ĠGet Ġauthor Ġdata Ġfor Ġspecified Ġid . Ċ Ġ* Ġ@ see ĠAuthor Ċ Ġ*/ Ċ suspend Ġfun Ġget Author ( author Id : ĠLong ): ĠAuthor Ġ{ ĊĠ Ġauthor Cache . hit ( author Id . toString ()). if Present Ġ{ Ġreturn Ġit Ġ} ĊĠ Ġval Ġhtml Ġ= Ġpatient ly Fetch URL (" https :// www . fan fi ction . net / u /$ author Id /") Ġ{ ĊĠĠĠ ĠNotifications . ERROR . show ( default Intent (), ĊĠĠĠĠĠĠĠ ĠR . string . error _ fetch ing _ author _ data , Ġauthor Id . toString ()) ĊĠ Ġ} ĊĠ Ġval Ġdoc Ġ= ĠJ soup . parse ( html ) ĊĠ Ġval Ġauthor Name Ġ= Ġdoc . select First ("# content _ wrapper _ inner Ġ> Ġspan "). text () ĊĠ Ġval Ġstories Ġ= Ġdoc . getElementById (" st _ inside "). children (). map Ġ{ ĊĠĠĠ Ġparse Story Element ( it , Ġauthor Name , Ġauthor Id ) ĊĠ Ġ} ĊĠ Ġ// ĠDrop Ġa ĠCOMP LETE LY ĠF U CK ING ĠR AN DOM ĠS CRIPT ĠTAG ĊĠ Ġval Ġfav St ories Ġ= Ġdoc . getElementById (" fs _ inside ") ?. children ()?. drop ( 1 )?. map Ġ{ ĊĠĠĠ Ġparse Story Element ( it , Ġnull , Ġnull ) ĊĠ Ġ} Ġ?: ĠlistOf () ĊĠ Ġval Ġfav Authors Ġ= Ġdoc . getElementById (" fa "). select (" dl "). map Ġ{ ĊĠĠĠ Ġval Ġauthor Element Ġ= Ġit . select (" a "). first () ĊĠĠĠ Ġreturn @ map ĠPair ( author Id From Author ( author Element ), Ġauthor Element . text ()) ĊĠ Ġ} ĊĠ Ġ// ĠUSING ĠTABLES ĠFOR ĠALIGN MENT ĠIN Ġ 2 0 1 9 ĠG OD ĠD AM MIT ĊĠ Ġval Ġret arded TableCell Ġ= ĊĠĠĠĠĠ Ġdoc . select ("# content _ wrapper _ inner Ġ> Ġtable Ġtable [ cell padding =\" 4 \"] Ġtd [ col span =\" 2 \"] "). last () ĊĠ Ġval Ġtime Spans Ġ= Ġret arded TableCell . select (" span ") ĊĠ Ġval Ġauthor Ġ= ĠAuthor ( ĊĠĠĠĠĠ Ġauthor Name , ĊĠĠĠĠĠ Ġauthor Id , ĊĠĠĠĠĠ Ġ// ĠJo ined Ġdate , Ġseconds ĊĠĠĠĠĠ Ġtime Spans [ 0 ]. attr (" data - x ut ime "). to Long (), ĊĠĠĠĠĠ Ġ// ĠUpdated Ġdate , Ġseconds ĊĠĠĠĠĠ Ġif Ġ( time Spans . size Ġ> Ġ 1 ) Ġtime Spans [ 1 ]. attr (" data - x ut ime "). to Long () Ġelse Ġ 0 , ĊĠĠĠĠĠ Ġ// ĠCountry Ġname ĊĠĠĠĠĠ Ġret arded TableCell . select First (" img ") ?. attr (" title "), ĊĠĠĠĠĠ Ġ// ĠImage Ġurl ĊĠĠĠĠĠ Ġdoc . select First ("# bio Ġ> Ġimg ") ?. attr (" data - original "), ĊĠĠĠĠĠ Ġ// ĠUser Ġbio Ġ( first Ġchild Ġis Ġimage ) ĊĠĠĠĠĠ ĠElements ( doc . getElementById (" bio "). children (). drop ( 1 )). outer Html (), ĊĠĠĠĠĠ Ġstories , ĊĠĠĠĠĠ Ġfav St ories , ĊĠĠĠĠĠ Ġfav Authors ĊĠ Ġ) ĊĠ Ġauthor Cache . update ( author Id . toString (), Ġauthor ) ĊĠ Ġreturn Ġauthor Ċ } Ċ Ċ private Ġfun Ġparse Story Element ( it : ĠElement , Ġauthor Name : ĠString ?, Ġauthor Id : ĠLong ?): ĠStory Model Ġ{ ĊĠ Ġval Ġauthor Anchor Ġ= Ġit . select (" a : not (. reviews ) "). last () ĊĠ Ġval Ġst itle Ġ= Ġit . select First (" a . st itle ") ĊĠ Ġreturn ĠStory Model ( ĊĠĠĠĠĠ Ġstory Id Ġ= Ġit . attr (" data - story id "). to Long (), ĊĠĠĠĠĠ Ġfragment Ġ= Ġparse Story Metadata ( it . children (). last (). children (). last (), Ġ 3 ), ĊĠĠĠĠĠ Ġprogress Ġ= ĠStory Progress (), ĊĠĠĠĠĠ Ġstatus Ġ= ĠStory Status . TRAN SI ENT , ĊĠĠĠĠĠ Ġ// ĠFF net Ġcategory Ġis Ġour Ġcan on ĊĠĠĠĠĠ Ġcan on Ġ= Ġun escape ( it . attr (" data - category ")), ĊĠĠĠĠĠ Ġ// ĠCategory Ġinfo Ġis Ġunavailable Ġhere ! ĊĠĠĠĠĠ Ġcategory Ġ= Ġnull , ĊĠĠĠĠĠ Ġsummary Ġ= Ġit . children (). last (). text Nodes (). first (). text (), ĊĠĠĠĠĠ Ġauthor Ġ= Ġauthor Name Ġ?: Ġauthor Anchor . text (), ĊĠĠĠĠĠ Ġauthor Id Ġ= Ġauthor Id Ġ?: Ġauthor Id From Author ( author Anchor ), ĊĠĠĠĠĠ Ġtitle Ġ= Ġst itle . text Nodes (). last (). text (), ĊĠĠĠĠĠ ĠimageUrl Ġ= Ġconvert ImageUrl ( st itle . children (). first ()?. attr (" data - original ")), ĊĠĠĠĠĠ Ġserialized Chapter Titles Ġ= Ġnull , ĊĠĠĠĠĠ Ġadded Time Ġ= Ġnull , ĊĠĠĠĠĠ Ġlast Read Time Ġ= Ġnull ĊĠ Ġ) Ċ } Ċ