package Ġnet . b jo ern pe ters en . local mp 3 . provider Ċ Ċ import Ġcom . google . common . cache . Cache Ċ import Ġcom . google . common . cache . Cache Builder Ċ import Ġcom . mp at ric . mp 3 agic . Base Exception Ċ import Ġcom . mp at ric . mp 3 agic . Mp 3 File Ċ import Ġio . ktor . application . Application Call Ċ import Ġio . ktor . application . call Ċ import Ġio . ktor . application . install Ċ import Ġio . ktor . features . BadRequest Exception Ċ import Ġio . ktor . features . NotFoundException Ċ import Ġio . ktor . features . Status Pages Ċ import Ġio . ktor . http . ContentType Ċ import Ġio . ktor . http . Parameters Builder Ċ import Ġio . ktor . http . URL Builder Ċ import Ġio . ktor . response . respond Bytes Ċ import Ġio . ktor . routing . get Ċ import Ġio . ktor . routing . routing Ċ import Ġio . ktor . server . c io . C IO Ċ import Ġio . ktor . server . engine . Application Engine Ċ import Ġio . ktor . server . engine . embedded Server Ċ import Ġio . ktor . util . K tor Experimental API Ċ import Ġio . ktor . util . pipeline . Pipeline Context Ċ import Ġmu . Kotlin Logging Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . file . Invalid Path Exception Ċ import Ġjava . nio . file . Path Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ private Ġclass ĠAlbum Art ( val Ġdata : ĠByteArray , Ġval ĠcontentType : ĠContentType ) Ċ Ċ private Ġsuspend Ġfun ĠApplication Call . respond Album Art ( album Art : ĠAlbum Art ) Ġ{ ĊĠĠĠ Ġrespond Bytes ( album Art . data , ĠcontentType Ġ= Ġalbum Art . contentType ) Ċ } Ċ Ċ private Ġclass ĠAlbum Art Loader ( private Ġval Ġdirectory : ĠPath ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcache : ĠCache < String , ĠAlbum Art > Ġ= ĠCache Builder . newBuilder () ĊĠĠĠĠĠĠĠ Ġ. maximum Size ( 2 5 6 ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġprivate Ġfun Ġload FromFile ( path : ĠPath ): ĠAlbum Art ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! path . startsWith ( directory )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" Tri ed Ġto Ġload Ġdata Ġfrom Ġrestricted Ġfile : Ġ$ path " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmp 3 File Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠM p 3 File ( path ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠBase Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! mp 3 File . has Id 3 v 2 Tag ()) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġtag Ġ= Ġmp 3 File . id 3 v 2 Tag ĊĠĠĠĠĠĠĠ Ġval Ġimage Ġ= Ġtag . album Image Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval ĠcontentType Ġ= Ġtag . album Image MimeType ?. let Ġ{ ĠContentType . parse ( it ) Ġ} Ġ?: ĠContentType . Image . Any ĊĠĠĠĠĠĠĠ Ġreturn ĠAlbum Art ( image , ĠcontentType ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Album Art ( path : ĠPath ): ĠAlbum Art ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnormalized Ġ= Ġpath . to AbsolutePath (). normalize () ĊĠĠĠĠĠĠĠ Ġval Ġcached Ġ= Ġcache . get If Present ( normalized . toString ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( cached Ġ!= Ġnull ) Ġreturn Ġcached ĊĊĠĠĠĠĠĠĠ Ġval Ġloaded Ġ= Ġload FromFile ( normalized ) ĊĠĠĠĠĠĠĠ Ġif Ġ( loaded Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache . put ( normalized . toString (), Ġloaded ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġloaded ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ K tor Experimental API Ċ internal Ġclass ĠAlbum Art Server ( directory : ĠPath ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġalbum Art Loader Ġ= ĠAlbum Art Loader ( directory ) ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġengine : ĠApplication Engine ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġhost : ĠString ĊĊĠĠĠ Ġsuspend Ġfun Ġstart ( host : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . host Ġ= Ġhost ĊĠĠĠĠĠĠĠ Ġengine Ġ= Ġembedded Server ( C IO , Ġport Ġ= ĠPORT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstall ( Status Pages ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrouting Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget ( PATH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserve Image () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġengine . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun ĠPipeline Context < Unit , ĠApplication Call >. serve Image () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġcall . request . query Parameters ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġparams [ PARAM _ NAME ] Ġ?: Ġthrow ĠBadRequest Exception (" Missing Ġparameter : Ġ$ PARAM _ NAME ") ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid . to Path () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvalid Path Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBadRequest Exception (" Invalid Ġfile ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġalbum Art Ġ= Ġalbum Art Loader . get Album Art ( path ) ĊĠĠĠĠĠĠĠ Ġif Ġ( album Art Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Album Art ( album Art ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNotFound Exception () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetUrl ( encoded Path : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠURL Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhost Ġ= Ġhost , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġport Ġ= ĠPORT , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencoded Path Ġ= ĠPATH , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠParameters Builder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( PARAM _ NAME , Ġencoded Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ). build String () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġengine . stop ( 5 0 0 , Ġ 1 0 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPORT Ġ= Ġ 6 4 3 7 5 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPATH Ġ= Ġ"/ local Album Art " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPARAM _ NAME Ġ= Ġ" file " ĊĠĠĠ Ġ} Ċ } Ċ