|
|
|
|
@ -10,6 +10,7 @@ import org.koitharu.kotatsu.utils.ext.copyToSuspending
|
|
|
|
|
import org.koitharu.kotatsu.utils.ext.longHashCode
|
|
|
|
|
import org.koitharu.kotatsu.utils.ext.subdir
|
|
|
|
|
import org.koitharu.kotatsu.utils.ext.takeIfReadable
|
|
|
|
|
import org.koitharu.kotatsu.utils.ext.takeIfWriteable
|
|
|
|
|
import java.io.File
|
|
|
|
|
import java.io.InputStream
|
|
|
|
|
import javax.inject.Inject
|
|
|
|
|
@ -18,9 +19,14 @@ import javax.inject.Singleton
|
|
|
|
|
@Singleton
|
|
|
|
|
class PagesCache @Inject constructor(@ApplicationContext context: Context) {
|
|
|
|
|
|
|
|
|
|
private val cacheDir = context.externalCacheDir ?: context.cacheDir
|
|
|
|
|
private val cacheDir = checkNotNull(findSuitableDir(context)) {
|
|
|
|
|
val dirs = (context.externalCacheDirs + context.cacheDir).joinToString(";") {
|
|
|
|
|
it.absolutePath
|
|
|
|
|
}
|
|
|
|
|
"Cannot find any suitable directory for PagesCache: [$dirs]"
|
|
|
|
|
}
|
|
|
|
|
private val lruCache = createDiskLruCacheSafe(
|
|
|
|
|
dir = cacheDir.subdir(CacheDir.PAGES.dir),
|
|
|
|
|
dir = cacheDir,
|
|
|
|
|
size = FileSize.MEGABYTES.convert(200, FileSize.BYTES),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
@ -29,7 +35,7 @@ class PagesCache @Inject constructor(@ApplicationContext context: Context) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
suspend fun put(url: String, inputStream: InputStream): File = withContext(Dispatchers.IO) {
|
|
|
|
|
val file = File(cacheDir, url.longHashCode().toString())
|
|
|
|
|
val file = File(cacheDir.parentFile, url.longHashCode().toString())
|
|
|
|
|
try {
|
|
|
|
|
file.outputStream().use { out ->
|
|
|
|
|
inputStream.copyToSuspending(out)
|
|
|
|
|
@ -50,3 +56,10 @@ private fun createDiskLruCacheSafe(dir: File, size: Long): DiskLruCache {
|
|
|
|
|
DiskLruCache.create(dir, size)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun findSuitableDir(context: Context): File? {
|
|
|
|
|
val dirs = context.externalCacheDirs + context.cacheDir
|
|
|
|
|
return dirs.firstNotNullOfOrNull {
|
|
|
|
|
it.subdir(CacheDir.PAGES.dir).takeIfWriteable()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|