package Ġio . github . rs ook ram . rss . data . parser Ċ Ċ import Ġokhttp 3 . ResponseBody Ċ import Ġorg . w 3 c . dom . Element Ċ import Ġorg . w 3 c . dom . Node Ċ import Ġorg . w 3 c . dom . NodeList Ċ import Ġretrofit 2 . Converter Ċ import Ġretrofit 2 . Ret rofit Ċ import Ġjava . lang . reflect . Type Ċ import Ġjava . time . Instant Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjavax . xml . parsers . Document BuilderFactory Ċ Ċ /** Ċ Ġ* Ġ[ Converter . Factory ] Ġto Ġallow ĠRet rofit Ġinterfaces Ġto Ġreturn Ġ[ R ss Feed ] s . Ċ Ġ*/ Ċ class ĠR ss Converter Factory Ġ: ĠConverter . Factory () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġresponse Body Converter ( ĊĠĠĠĠĠĠĠ Ġtype : ĠType , ĊĠĠĠĠĠĠĠ Ġannotations : ĠArray < out ĠAnnotation >, ĊĠĠĠĠĠĠĠ Ġretrofit : ĠRet rofit ĊĠĠĠ Ġ): ĠConverter < ResponseBody , Ġ* >? Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== ĠR ss Feed :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR ss ResponseBody Converter () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠR ss ResponseBody Converter Ġ: ĠConverter < ResponseBody , ĠR ss Feed > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġconvert ( value : ĠResponse Body ): ĠR ss Feed ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdocument Builder Ġ= ĠDocument BuilderFactory . newInstance (). new Document Builder () ĊĊĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= Ġdocument Builder . parse ( value . byte Stream ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġdocument . getElementsByTagName (" title "). item ( 0 )?. textContent Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġentry Nodes Ġ= Ġdocument . getElementsByTagName (" entry ") ĊĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġif Ġ( entry Nodes . length Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse Items ( entry Nodes , ĠDateTime Formatter . ISO _ OFFSET _ DATE _ TIME ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Nodes Ġ= Ġdocument . getElementsByTagName (" item ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse Items ( item Nodes , ĠDateTime Formatter . RFC _ 1 1 2 3 _ DATE _ TIME ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠR ss Feed ( name , Ġitems ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġparse Items ( nodes : ĠNode List , ĠdateTime Formatter : ĠDateTime Formatter ): ĠList < R ss Item > Ġ= ĊĠĠĠ Ġ( 0 Ġuntil Ġnodes . length ) ĊĠĠĠĠĠĠĠ Ġ. map ( nodes :: item ) ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġnode Ġ-> Ġparse Item ( node , ĠdateTime Formatter ) Ġ} Ċ Ċ private Ġfun Ġparse Item ( node : ĠNode , ĠdateTime Formatter : ĠDateTime Formatter ): ĠR ss Item Ġ{ ĊĠĠĠ Ġvar Ġurl Ġ= Ġ"" ĊĠĠĠ Ġvar Ġtitle Ġ= Ġ"" ĊĠĠĠ Ġvar Ġtimestamp Ġ= Ġ"" ĊĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġnode . childNodes . length ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġnode . childNodes . item ( i ) ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( child . nodeName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" link " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġchild . textContent . if Empty Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( child Ġas ? ĠElement )?. getAttribute (" href "). or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" title " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġchild . textContent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" pub Date ", Ġ" updated " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= Ġchild . textContent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġinstant Ġ= ĠdateTime Formatter . parse ( timestamp , ĠInstant :: from ) ĊĠĠĠ Ġreturn ĠR ss Item ( url , Ġtitle , Ġinstant ) Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġdata Ġfor Ġa Ġsingle ĠRSS Ġfeed . Ċ Ġ*/ Ċ data Ġclass ĠR ss Feed ( val Ġname : ĠString , Ġval Ġitems : ĠList < R ss Item >) Ċ Ċ /** Ċ Ġ* ĠA Ġsingle Ġentry Ġwithin Ġan ĠRSS Ġfeed . Ċ Ġ*/ Ċ data Ġclass ĠR ss Item ( val Ġurl : ĠString , Ġval Ġtitle : ĠString , Ġval Ġtimestamp : ĠInstant ) Ċ