Add image loader
[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
8 /**
9  * [ImageLoader] implementation that uses a simple Guava [com.google.common.cache.Cache].
10  */
11 class DefaultImageLoader(private val freenetInterface: FreenetInterface) : ImageLoader {
12
13         private val imageCache = CacheBuilder.newBuilder().build<String, LoadedImage>()
14         private val callback = object : FreenetInterface.BackgroundFetchCallback {
15                 override fun loaded(uri: FreenetURI, mimeType: String, data: ByteArray) {
16                         if (!mimeType.startsWith("image/")) {
17                                 return
18                         }
19                         val image = ByteArrayInputStream(data).use {
20                                 ImageIO.read(it)
21                         }
22                         val loadedImage = LoadedImage(uri.toString(), mimeType, image.width, image.height)
23                         imageCache.get(uri.toString()) { loadedImage }
24                 }
25
26                 override fun failed(uri: FreenetURI) {
27                 }
28         }
29
30         override fun toLoadedImage(link: String): LoadedImage? {
31                 imageCache.getIfPresent(link)?.run {
32                         return this
33                 }
34                 freenetInterface.startFetch(FreenetURI(link), callback)
35                 return null
36         }
37
38 }