Fix serialization

This commit is contained in:
tarsin committed 2023-02-01 11:28:24 +08:00
1 parent a7bce9c8e9
commit 37804e67c1
5 files changed
+71 -78

No files matched your search

@@ -26,9 +26,10 @@ import com.hippo.ehviewer.client.data.GalleryInfo
import com.hippo.ehviewer.dao.DownloadInfo
import com.hippo.ehviewer.dao.DownloadLabel
import com.hippo.ehviewer.spider.SpiderDen
import com.hippo.ehviewer.spider.SpiderInfo
import com.hippo.ehviewer.spider.SpiderQueen
import com.hippo.ehviewer.spider.SpiderQueen.OnSpiderListener
import com.hippo.ehviewer.spider.readCompatFromUniFile
import com.hippo.ehviewer.spider.write
import com.hippo.image.Image
import com.hippo.util.IoThreadPoolExecutor
import com.hippo.yorozuya.ConcurrentPool
@@ -581,7 +582,7 @@ class DownloadManager : OnSpiderListener {
galleryInfo.rating = downloadInfo.rating
val downloadDir = SpiderDen.getGalleryDownloadDir(galleryInfo.gid) ?: continue
val file = downloadDir.findFile(SpiderQueen.SPIDER_INFO_FILENAME) ?: continue
val spiderInfo = SpiderInfo.readCompatFromUniFile(file) ?: continue
val spiderInfo = readCompatFromUniFile(file) ?: continue
spiderInfo.startPage = 0
try {
spiderInfo.write(file)
@@ -27,8 +27,8 @@ import com.hippo.ehviewer.client.EhEngine.fillGalleryListByApi
import com.hippo.ehviewer.client.EhUrl
import com.hippo.ehviewer.client.data.BaseGalleryInfo
import com.hippo.ehviewer.download.DownloadManager
import com.hippo.ehviewer.spider.SpiderInfo
import com.hippo.ehviewer.spider.SpiderQueen
import com.hippo.ehviewer.spider.readCompatFromUniFile
import com.hippo.ehviewer.ui.scene.BaseScene
import com.hippo.unifile.UniFile
import com.hippo.util.ExceptionUtils
@@ -52,7 +52,7 @@ class RestoreDownloadPreference constructor(
}
val siFile = file.findFile(SpiderQueen.SPIDER_INFO_FILENAME) ?: return null
return try {
val spiderInfo = SpiderInfo.readCompatFromUniFile(siFile) ?: return null
val spiderInfo = readCompatFromUniFile(siFile) ?: return null
val gid = spiderInfo.gid
val dirname = file.name
if (mManager.containDownloadInfo(gid)) {
@@ -1,18 +1,6 @@
@file:OptIn(ExperimentalSerializationApi::class)
package com.hippo.ehviewer.spider
import coil.annotation.ExperimentalCoilApi
import coil.disk.DiskCache
import com.hippo.compat.readLegacySpiderInfo
import com.hippo.ehviewer.EhApplication
import com.hippo.unifile.UniFile
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.Serializable
import kotlinx.serialization.cbor.Cbor
import kotlinx.serialization.decodeFromByteArray
import kotlinx.serialization.encodeToByteArray
import java.io.File
@Serializable
class SpiderInfo @JvmOverloads constructor(
@@ -29,57 +17,4 @@ class SpiderInfo @JvmOverloads constructor(
var previewPages: Int = -1,
var previewPerPage: Int = -1
) {
fun write(file: UniFile) {
file.openOutputStream().use {
it.write(Cbor.encodeToByteArray(this))
}
}
@OptIn(ExperimentalCoilApi::class)
fun saveToCache() {
val entry = spiderInfoCache.edit(gid.toString()) ?: return
runCatching {
entry.data.toFile().writeBytes(Cbor.encodeToByteArray(this))
}.onFailure {
it.printStackTrace()
entry.abort()
}.onSuccess {
entry.commit()
}
}
companion object {
private val spiderInfoCache by lazy {
DiskCache.Builder()
.directory(File(EhApplication.application.cacheDir, "spider_info_v2_1"))
.maxSizeBytes(20 * 1024 * 1024).build()
}
@JvmStatic
@OptIn(ExperimentalCoilApi::class)
fun readFromCache(gid: Long): SpiderInfo? {
val snapshot = spiderInfoCache[gid.toString()] ?: return null
return runCatching {
snapshot.use {
return Cbor.decodeFromByteArray(it.data.toFile().readBytes())
}
}.onFailure {
it.printStackTrace()
}.getOrNull()
}
@JvmStatic
fun readCompatFromUniFile(file: UniFile): SpiderInfo? {
return runCatching {
file.openInputStream().use {
Cbor.decodeFromByteArray<SpiderInfo>(it.readBytes())
}
}.getOrNull() ?: runCatching {
file.openInputStream().use { readLegacySpiderInfo(it) }
}.getOrNull()
}
const val TOKEN_FAILED = "failed"
}
}
)
@@ -0,0 +1,57 @@
package com.hippo.ehviewer.spider
import coil.disk.DiskCache
import com.hippo.compat.readLegacySpiderInfo
import com.hippo.ehviewer.EhApplication
import com.hippo.unifile.UniFile
import kotlinx.serialization.cbor.Cbor
import kotlinx.serialization.decodeFromByteArray
import kotlinx.serialization.encodeToByteArray
import java.io.File
fun SpiderInfo.write(file: UniFile) {
file.openOutputStream().use {
it.write(Cbor.encodeToByteArray(this))
}
}
fun SpiderInfo.saveToCache() {
val entry = spiderInfoCache.edit(gid.toString()) ?: return
runCatching {
entry.data.toFile().writeBytes(Cbor.encodeToByteArray(this))
}.onFailure {
it.printStackTrace()
entry.abort()
}.onSuccess {
entry.commit()
}
}
private val spiderInfoCache by lazy {
DiskCache.Builder()
.directory(File(EhApplication.application.cacheDir, "spider_info_v2_1"))
.maxSizeBytes(20 * 1024 * 1024).build()
}
fun readFromCache(gid: Long): SpiderInfo? {
val snapshot = spiderInfoCache[gid.toString()] ?: return null
return runCatching {
snapshot.use {
return Cbor.decodeFromByteArray(it.data.toFile().readBytes())
}
}.onFailure {
it.printStackTrace()
}.getOrNull()
}
fun readCompatFromUniFile(file: UniFile): SpiderInfo? {
return runCatching {
file.openInputStream().use {
Cbor.decodeFromByteArray<SpiderInfo>(it.readBytes())
}
}.getOrNull() ?: runCatching {
file.openInputStream().use { readLegacySpiderInfo(it) }
}.getOrNull()
}
const val TOKEN_FAILED = "failed"
@@ -598,7 +598,7 @@ public final class SpiderQueen implements Runnable {
// Slow path, read diskcache
if (spiderInfo == null) {
spiderInfo = SpiderInfo.readFromCache(gid);
spiderInfo = SpiderInfoUtilsKt.readFromCache(gid);
}
if (spiderInfo == null) return 0;
@@ -630,7 +630,7 @@ public final class SpiderQueen implements Runnable {
if (downloadDir != null) {
UniFile file = downloadDir.findFile(SPIDER_INFO_FILENAME);
if (file != null) {
spiderInfo = SpiderInfo.readCompatFromUniFile(file);
spiderInfo = SpiderInfoUtilsKt.readCompatFromUniFile(file);
if (spiderInfo != null && spiderInfo.getGid() == mGalleryInfo.getGid() &&
spiderInfo.getToken().equals(mGalleryInfo.getToken())) {
return spiderInfo;
@@ -639,7 +639,7 @@ public final class SpiderQueen implements Runnable {
}
// Read from cache
spiderInfo = SpiderInfo.readFromCache(mGalleryInfo.getGid());
spiderInfo = SpiderInfoUtilsKt.readFromCache(mGalleryInfo.getGid());
if (spiderInfo != null && spiderInfo.getGid() == mGalleryInfo.getGid() && spiderInfo.getToken().equals(mGalleryInfo.getToken())) {
return spiderInfo;
}
@@ -766,9 +766,9 @@ public final class SpiderQueen implements Runnable {
UniFile downloadDir = mSpiderDen.getDownloadDir();
if (downloadDir != null) {
UniFile file = downloadDir.createFile(SPIDER_INFO_FILENAME);
spiderInfo.write(file);
SpiderInfoUtilsKt.write(spiderInfo, file);
}
spiderInfo.saveToCache();
SpiderInfoUtilsKt.saveToCache(spiderInfo);
}
}
@@ -864,7 +864,7 @@ public final class SpiderQueen implements Runnable {
if (null == pToken) {
// If failed, set the pToken "failed"
synchronized (mPTokenLock) {
spiderInfo.getPTokenMap().put(index, SpiderInfo.TOKEN_FAILED);
spiderInfo.getPTokenMap().put(index, SpiderInfoUtilsKt.TOKEN_FAILED);
}
}
@@ -1284,7 +1284,7 @@ public final class SpiderQueen implements Runnable {
if (force) {
synchronized (mPTokenLock) {
String pToken = spiderInfo.getPTokenMap().get(index);
if (SpiderInfo.TOKEN_FAILED.equals(pToken)) {
if (SpiderInfoUtilsKt.TOKEN_FAILED.equals(pToken)) {
spiderInfo.getPTokenMap().remove(index);
}
}
@@ -1360,7 +1360,7 @@ public final class SpiderQueen implements Runnable {
}
}
if (SpiderInfo.TOKEN_FAILED.equals(pToken)) {
if (SpiderInfoUtilsKt.TOKEN_FAILED.equals(pToken)) {
// Get token failed
updatePageState(index, STATE_FAILED, GetText.getString(R.string.error_get_ptoken_error));
return true;