hotfix
This commit is contained in:
@@ -21,7 +21,7 @@ package xyz.quaver.pupil.util.download
|
||||
import android.content.Context
|
||||
import android.content.ContextWrapper
|
||||
import android.util.Base64
|
||||
import androidx.documentfile.provider.DocumentFile
|
||||
import android.util.Log
|
||||
import androidx.preference.PreferenceManager
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@@ -34,7 +34,8 @@ import kotlinx.serialization.stringify
|
||||
import xyz.quaver.Code
|
||||
import xyz.quaver.hitomi.GalleryBlock
|
||||
import xyz.quaver.hitomi.Reader
|
||||
import xyz.quaver.pupil.util.*
|
||||
import xyz.quaver.pupil.util.getCachedGallery
|
||||
import xyz.quaver.pupil.util.getDownloadDirectory
|
||||
import java.io.File
|
||||
import java.net.URL
|
||||
|
||||
@@ -44,29 +45,20 @@ class Cache(context: Context) : ContextWrapper(context) {
|
||||
|
||||
// Search in this order
|
||||
// Download -> Cache
|
||||
fun getCachedGallery(galleryID: Int) : DocumentFile? {
|
||||
var file = getDownloadDirectory(this).findFile(galleryID.toString())
|
||||
|
||||
if (file?.exists() == true)
|
||||
return file
|
||||
|
||||
file = DocumentFile.fromFile(File(cacheDir, "imageCache/$galleryID"))
|
||||
|
||||
return if (file.exists())
|
||||
file
|
||||
else
|
||||
null
|
||||
fun getCachedGallery(galleryID: Int) = getCachedGallery(this, galleryID).also {
|
||||
if (!it.exists())
|
||||
it.mkdirs()
|
||||
}
|
||||
|
||||
@UseExperimental(ImplicitReflectionSerializer::class)
|
||||
fun getCachedMetadata(galleryID: Int) : Metadata? {
|
||||
val file = (getCachedGallery(galleryID) ?: return null).findFile(".metadata")
|
||||
val file = File(getCachedGallery(galleryID), ".metadata")
|
||||
|
||||
if (file?.exists() != true)
|
||||
if (!file.exists())
|
||||
return null
|
||||
|
||||
return try {
|
||||
Json.parse(file.readText(this))
|
||||
Json.parse(file.readText())
|
||||
} catch (e: Exception) {
|
||||
//File corrupted
|
||||
file.delete()
|
||||
@@ -76,13 +68,12 @@ class Cache(context: Context) : ContextWrapper(context) {
|
||||
|
||||
@UseExperimental(ImplicitReflectionSerializer::class)
|
||||
fun setCachedMetadata(galleryID: Int, metadata: Metadata) {
|
||||
val file = getCachedGallery(galleryID)?.findFile(".metadata") ?:
|
||||
DocumentFile.fromFile(File(cacheDir, "imageCache/$galleryID").also {
|
||||
val file = File(getCachedGallery(galleryID), ".metadata").also {
|
||||
if (!it.exists())
|
||||
it.mkdirs()
|
||||
}).createFile("null", ".metadata") ?: return
|
||||
it.createNewFile()
|
||||
}
|
||||
|
||||
file.writeText(this, Json.stringify(metadata))
|
||||
file.writeText(Json.stringify(metadata))
|
||||
}
|
||||
|
||||
suspend fun getThumbnail(galleryID: Int): String? {
|
||||
@@ -186,46 +177,39 @@ class Cache(context: Context) : ContextWrapper(context) {
|
||||
return reader
|
||||
}
|
||||
|
||||
fun getImages(galleryID: Int): List<DocumentFile?>? {
|
||||
val gallery = getCachedGallery(galleryID) ?: return null
|
||||
fun getImages(galleryID: Int): List<File?>? {
|
||||
val started = System.currentTimeMillis()
|
||||
val gallery = getCachedGallery(galleryID)
|
||||
val reader = getReaderOrNull(galleryID) ?: return null
|
||||
val images = gallery.listFiles()
|
||||
val images = gallery.listFiles() ?: return null
|
||||
|
||||
Log.i("PUPILD", "${System.currentTimeMillis() - started} ms")
|
||||
return reader.galleryInfo.indices.map { index ->
|
||||
images.firstOrNull { file -> file.name?.startsWith("%05d".format(index)) == true }
|
||||
images.firstOrNull { file -> file.name.startsWith("%05d".format(index)) }
|
||||
}
|
||||
}
|
||||
|
||||
fun putImage(galleryID: Int, name: String, data: ByteArray) {
|
||||
val cache = getCachedGallery(galleryID) ?:
|
||||
DocumentFile.fromFile(File(cacheDir, "imageCache/$galleryID").also {
|
||||
val cache = File(getCachedGallery(galleryID), name).also {
|
||||
if (!it.exists())
|
||||
it.mkdirs()
|
||||
}) ?: return
|
||||
it.createNewFile()
|
||||
}
|
||||
|
||||
if (!Regex("""^[0-9]+.+$""").matches(name))
|
||||
throw IllegalArgumentException("File name is not a number")
|
||||
|
||||
cache.let {
|
||||
if (it.findFile(name) != null)
|
||||
it
|
||||
else
|
||||
it.createFile("null", name)
|
||||
}?.writeBytes(this, data)
|
||||
cache.writeBytes(data)
|
||||
}
|
||||
|
||||
fun moveToDownload(galleryID: Int) {
|
||||
val cache = getCachedGallery(galleryID)
|
||||
val cache = getCachedGallery(galleryID).also {
|
||||
if (!it.exists())
|
||||
return
|
||||
}
|
||||
val download = File(getDownloadDirectory(this), galleryID.toString())
|
||||
|
||||
if (cache != null) {
|
||||
val download = getDownloadDirectory(this)
|
||||
|
||||
if (!download.isParentOf(cache)) {
|
||||
cache.copyRecursively(this, download)
|
||||
cache.deleteRecursively()
|
||||
}
|
||||
} else
|
||||
getDownloadDirectory(this).createDirectory(galleryID.toString())
|
||||
cache.copyRecursively(download, true)
|
||||
cache.deleteRecursively()
|
||||
}
|
||||
|
||||
fun isDownloading(galleryID: Int) = getCachedMetadata(galleryID)?.isDownloading == true
|
||||
|
||||
@@ -214,28 +214,8 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont
|
||||
fun isCompleted(galleryID: Int) = progress[galleryID]?.all { !it.isFinite() } == true
|
||||
|
||||
private fun queueDownload(galleryID: Int, reader: Reader, index: Int, callback: Callback) {
|
||||
val cache = Cache(this@DownloadWorker).getImages(galleryID)
|
||||
val lowQuality = preferences.getBoolean("low_quality", false)
|
||||
|
||||
//Cache exists :P
|
||||
cache?.get(index)?.let {
|
||||
progress[galleryID]?.set(index, Float.POSITIVE_INFINITY)
|
||||
|
||||
notify(galleryID)
|
||||
|
||||
if (isCompleted(galleryID)) {
|
||||
with(Cache(this@DownloadWorker)) {
|
||||
if (isDownloading(galleryID)) {
|
||||
moveToDownload(galleryID)
|
||||
setDownloading(galleryID, false)
|
||||
}
|
||||
}
|
||||
nRunners--
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
val request = Request.Builder().apply {
|
||||
when (reader.code) {
|
||||
Code.HITOMI -> {
|
||||
@@ -276,7 +256,14 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont
|
||||
return@launch
|
||||
}
|
||||
|
||||
progress.put(galleryID, reader.galleryInfo.map { 0F }.toMutableList())
|
||||
val cache = Cache(this@DownloadWorker).getImages(galleryID)
|
||||
|
||||
progress.put(galleryID, reader.galleryInfo.indices.map { index ->
|
||||
if (cache?.get(index) != null)
|
||||
Float.POSITIVE_INFINITY
|
||||
else
|
||||
0F
|
||||
}.toMutableList())
|
||||
exception.put(galleryID, reader.galleryInfo.map { null }.toMutableList())
|
||||
|
||||
if (notification[galleryID] == null)
|
||||
@@ -285,6 +272,18 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont
|
||||
notification[galleryID].setContentTitle(reader.title)
|
||||
notify(galleryID)
|
||||
|
||||
if (isCompleted(galleryID)) {
|
||||
with(Cache(this@DownloadWorker)) {
|
||||
if (isDownloading(galleryID)) {
|
||||
moveToDownload(galleryID)
|
||||
setDownloading(galleryID, false)
|
||||
}
|
||||
}
|
||||
nRunners--
|
||||
|
||||
return@launch
|
||||
}
|
||||
|
||||
for (i in reader.galleryInfo.indices) {
|
||||
val callback = object : Callback {
|
||||
override fun onFailure(call: Call, e: IOException) {
|
||||
@@ -297,10 +296,11 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont
|
||||
notify(galleryID)
|
||||
|
||||
if (isCompleted(galleryID)) {
|
||||
val cache = Cache(this@DownloadWorker)
|
||||
if (cache.isDownloading(galleryID)) {
|
||||
cache.moveToDownload(galleryID)
|
||||
cache.setDownloading(galleryID, false)
|
||||
with(Cache(this@DownloadWorker)) {
|
||||
if (isDownloading(galleryID)) {
|
||||
moveToDownload(galleryID)
|
||||
setDownloading(galleryID, false)
|
||||
}
|
||||
}
|
||||
nRunners--
|
||||
}
|
||||
@@ -319,17 +319,19 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont
|
||||
notify(galleryID)
|
||||
|
||||
if (isCompleted(galleryID)) {
|
||||
val cache = Cache(this@DownloadWorker)
|
||||
if (cache.isDownloading(galleryID)) {
|
||||
cache.moveToDownload(galleryID)
|
||||
cache.setDownloading(galleryID, false)
|
||||
with(Cache(this@DownloadWorker)) {
|
||||
if (isDownloading(galleryID)) {
|
||||
moveToDownload(galleryID)
|
||||
setDownloading(galleryID, false)
|
||||
}
|
||||
}
|
||||
nRunners--
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
queueDownload(galleryID, reader, i, callback)
|
||||
if (progress[galleryID]?.get(i)?.isFinite() == true)
|
||||
queueDownload(galleryID, reader, i, callback)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user