01e177a82a5f2ed33e7e2d0dc2d1ce1df31a643f
[Sone.git] / src / main / kotlin / net / pterodactylus / sone / core / DefaultImageLoader.kt
1 package net.pterodactylus.sone.core
2
3 import com.google.common.cache.CacheBuilder
4 import freenet.keys.FreenetURI
5 import java.io.ByteArrayInputStream
6 import javax.imageio.ImageIO
7 import javax.inject.Inject
8
9 /**
10  * [ImageLoader] implementation that uses a simple Guava [com.google.common.cache.Cache].
11  */
12 class DefaultImageLoader @Inject constructor(private val freenetInterface: FreenetInterface) : ImageLoader {
13
14         private val imageCache = CacheBuilder.newBuilder().build<String, LoadedImage>()
15         private val callback = object : FreenetInterface.BackgroundFetchCallback {
16                 override fun loaded(uri: FreenetURI, mimeType: String, data: ByteArray) {
17                         if (!mimeType.startsWith("image/")) {
18                                 return
19                         }
20                         val image = ByteArrayInputStream(data).use {
21                                 ImageIO.read(it)
22                         }
23                         val loadedImage = LoadedImage(uri.toString(), mimeType, image.width, image.height)
24                         imageCache.get(uri.toString()) { loadedImage }
25                 }
26
27                 override fun failed(uri: FreenetURI) {
28                 }
29         }
30
31         override fun toLoadedImage(link: String): LoadedImage? {
32                 imageCache.getIfPresent(link)?.run {
33                         return this
34                 }
35                 freenetInterface.startFetch(FreenetURI(link), callback)
36                 return null
37         }
38
39 }