|
|
|
@ -1,7 +1,18 @@
|
|
|
|
|
package eu.kanade.tachiyomi.data.cache
|
|
|
|
|
|
|
|
|
|
import android.content.Context
|
|
|
|
|
import android.text.format.Formatter
|
|
|
|
|
import eu.kanade.tachiyomi.R
|
|
|
|
|
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
|
|
|
|
import eu.kanade.tachiyomi.util.storage.DiskUtil
|
|
|
|
|
import eu.kanade.tachiyomi.util.system.executeOnIO
|
|
|
|
|
import eu.kanade.tachiyomi.util.system.toast
|
|
|
|
|
import kotlinx.coroutines.Dispatchers
|
|
|
|
|
import kotlinx.coroutines.GlobalScope
|
|
|
|
|
import kotlinx.coroutines.launch
|
|
|
|
|
import kotlinx.coroutines.withContext
|
|
|
|
|
import uy.kohesive.injekt.Injekt
|
|
|
|
|
import uy.kohesive.injekt.api.get
|
|
|
|
|
import java.io.File
|
|
|
|
|
import java.io.IOException
|
|
|
|
|
import java.io.InputStream
|
|
|
|
@ -23,6 +34,34 @@ class CoverCache(private val context: Context) {
|
|
|
|
|
private val cacheDir = context.getExternalFilesDir("covers")
|
|
|
|
|
?: File(context.filesDir, "covers").also { it.mkdirs() }
|
|
|
|
|
|
|
|
|
|
fun deleteOldCovers() {
|
|
|
|
|
GlobalScope.launch(Dispatchers.Default) {
|
|
|
|
|
val db = Injekt.get<DatabaseHelper>()
|
|
|
|
|
var deletedSize = 0L
|
|
|
|
|
val urls = db.getLibraryMangas().executeOnIO().mapNotNull {
|
|
|
|
|
it.thumbnail_url?.let { url ->
|
|
|
|
|
return@mapNotNull DiskUtil.hashKeyForDisk(url)
|
|
|
|
|
}
|
|
|
|
|
null
|
|
|
|
|
}
|
|
|
|
|
val files = cacheDir.listFiles()?.iterator() ?: return@launch
|
|
|
|
|
while (files.hasNext()) {
|
|
|
|
|
val file = files.next()
|
|
|
|
|
if (file.name !in urls) {
|
|
|
|
|
deletedSize += file.length()
|
|
|
|
|
file.delete()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
withContext(Dispatchers.Main) {
|
|
|
|
|
context.toast(
|
|
|
|
|
context.getString(
|
|
|
|
|
R.string.deleted_, Formatter.formatFileSize(context, deletedSize)
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Returns the cover from cache.
|
|
|
|
|
*
|
|
|
|
|