Restore download from ComicInfo.xml if available

This commit is contained in:
FooIbar authored and Vladimir Dostoyevskiy committed 2024-01-27 20:21:11 +08:00
1 parent a2cfecd922
commit 1d4fe30e04
3 files changed
+33 -10

No files matched your search

@@ -40,5 +40,5 @@ object GalleryDetailUrlParser {
}
}
class Result(val gid: Long, val token: String)
data class Result(val gid: Long, val token: String)
}
@@ -4,7 +4,9 @@ import com.hippo.ehviewer.client.EhTagDatabase
import com.hippo.ehviewer.client.EhUrl
import com.hippo.ehviewer.client.data.GalleryInfo
import com.hippo.unifile.UniFile
import com.hippo.unifile.openInputStream
import com.hippo.unifile.openOutputStream
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@@ -68,6 +70,16 @@ fun ComicInfo.write(file: UniFile) {
}
}
fun readComicInfo(file: UniFile): ComicInfo? = runCatching {
file.openInputStream().use {
InputStreamReader(it, Charsets.UTF_8).use { reader ->
xmlStreaming.newGenericReader(reader).use { xmlReader ->
xml.decodeFromReader(ComicInfo.serializer(), xmlReader)
}
}
}
}.getOrNull()
@Serializable
data class ComicInfo(
@XmlElement
@@ -34,9 +34,12 @@ import com.hippo.ehviewer.client.EhEngine.fillGalleryListByApi
import com.hippo.ehviewer.client.EhUrl
import com.hippo.ehviewer.client.data.BaseGalleryInfo
import com.hippo.ehviewer.client.data.GalleryInfo
import com.hippo.ehviewer.client.parser.GalleryDetailUrlParser
import com.hippo.ehviewer.download.DownloadManager
import com.hippo.ehviewer.download.downloadLocation
import com.hippo.ehviewer.spider.SpiderQueen
import com.hippo.ehviewer.spider.COMIC_INFO_FILE
import com.hippo.ehviewer.spider.SpiderQueen.Companion.SPIDER_INFO_FILENAME
import com.hippo.ehviewer.spider.readComicInfo
import com.hippo.ehviewer.spider.readCompatFromUniFile
import com.hippo.ehviewer.ui.keepNoMediaFileStatus
import com.hippo.ehviewer.ui.legacy.BaseDialogBuilder
@@ -166,10 +169,16 @@ fun DownloadScreen(navigator: DestinationsNavigator) {
var restoreDirCount = 0
suspend fun getRestoreItem(file: UniFile): RestoreItem? {
if (!file.isDirectory) return null
val siFile = file.findFile(SpiderQueen.SPIDER_INFO_FILENAME) ?: return null
return runCatching {
val spiderInfo = readCompatFromUniFile(siFile) ?: return null
val gid = spiderInfo.gid
val (gid, token) = file.findFile(SPIDER_INFO_FILENAME)?.let {
readCompatFromUniFile(it)?.run {
GalleryDetailUrlParser.Result(gid, token!!)
}
} ?: file.findFile(COMIC_INFO_FILE)?.let {
readComicInfo(it)?.run {
GalleryDetailUrlParser.parse(web)
}
} ?: return null
val dirname = file.name ?: return null
if (DownloadManager.containDownloadInfo(gid)) {
// Restore download dir to avoid redownload
@@ -180,10 +189,7 @@ fun DownloadScreen(navigator: DestinationsNavigator) {
}
return null
}
RestoreItem(dirname).also {
it.gid = spiderInfo.gid
it.token = spiderInfo.token
}
RestoreItem(dirname, gid, token)
}.onFailure {
it.printStackTrace()
}.getOrNull()
@@ -237,7 +243,12 @@ fun DownloadScreen(navigator: DestinationsNavigator) {
}
}
private class RestoreItem(val dirname: String, val galleryInfo: BaseGalleryInfo = BaseGalleryInfo()) : GalleryInfo by galleryInfo
private class RestoreItem(
val dirname: String,
gid: Long,
token: String,
val galleryInfo: BaseGalleryInfo = BaseGalleryInfo(gid, token),
) : GalleryInfo by galleryInfo
private val RESTORE_NOT_FOUND = appCtx.getString(R.string.settings_download_restore_not_found)
private val RESTORE_COUNT_MSG = { cnt: Int -> if (cnt == 0) RESTORE_NOT_FOUND else appCtx.getString(R.string.settings_download_restore_successfully, cnt) }
private val NO_REDUNDANCY = appCtx.getString(R.string.settings_download_clean_redundancy_no_redundancy)