From 1d4fe30e04b825561ae2d0f96e0179070fa916a7 Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Sat, 27 Jan 2024 15:26:25 +0800 Subject: [PATCH] Restore download from ComicInfo.xml if available --- .../client/parser/GalleryDetailUrlParser.kt | 2 +- .../com/hippo/ehviewer/spider/ComicInfo.kt | 12 ++++++++ .../ehviewer/ui/settings/DownloadScreen.kt | 29 +++++++++++++------ 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/client/parser/GalleryDetailUrlParser.kt b/app/src/main/kotlin/com/hippo/ehviewer/client/parser/GalleryDetailUrlParser.kt index 457ad9c6d..22158917b 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/client/parser/GalleryDetailUrlParser.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/client/parser/GalleryDetailUrlParser.kt @@ -40,5 +40,5 @@ object GalleryDetailUrlParser { } } - class Result(val gid: Long, val token: String) + data class Result(val gid: Long, val token: String) } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/spider/ComicInfo.kt b/app/src/main/kotlin/com/hippo/ehviewer/spider/ComicInfo.kt index 15902151a..cbc032bce 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/spider/ComicInfo.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/spider/ComicInfo.kt @@ -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 diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/DownloadScreen.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/DownloadScreen.kt index bf4009b08..85c4924c3 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/DownloadScreen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/settings/DownloadScreen.kt @@ -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)