Fix serialization
This commit is contained in:
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;
|
||||
|
||||
Reference in new issue
Block a user