diff --git a/app/src/main/kotlin/com/hippo/ehviewer/client/parser/ParserUtils.kt b/app/src/main/kotlin/com/hippo/ehviewer/client/parser/ParserUtils.kt index 3a1483b48..fd64e048e 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/client/parser/ParserUtils.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/client/parser/ParserUtils.kt @@ -15,6 +15,7 @@ */ package com.hippo.ehviewer.client.parser +import com.hippo.ehviewer.util.toEpochMillis import com.hippo.ehviewer.util.toIntOrDefault import com.hippo.ehviewer.util.toLocalDateTime import com.hippo.ehviewer.util.toLongOrDefault @@ -41,6 +42,10 @@ object ParserUtils { return formatter.format(time.toLocalDateTime()) } + fun parseDate(str: String): Long { + return formatter.parse(str).toEpochMillis() + } + fun trim(str: String?): String { return str?.unescapeXml()?.trim() ?: "" } 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 59c5478a6..ebe861ab4 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 @@ -28,6 +28,7 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import arrow.fx.coroutines.parMap +import arrow.fx.coroutines.parMapNotNull import com.hippo.ehviewer.EhDB import com.hippo.ehviewer.R import com.hippo.ehviewer.Settings @@ -36,7 +37,10 @@ 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.client.parser.ParserUtils +import com.hippo.ehviewer.dao.DownloadInfo import com.hippo.ehviewer.download.DownloadManager +import com.hippo.ehviewer.download.downloadDir import com.hippo.ehviewer.download.downloadLocation import com.hippo.ehviewer.spider.COMIC_INFO_FILE import com.hippo.ehviewer.spider.SpiderDen @@ -46,6 +50,7 @@ import com.hippo.ehviewer.spider.readCompatFromUniFile import com.hippo.ehviewer.ui.keepNoMediaFileStatus import com.hippo.ehviewer.ui.tools.observed import com.hippo.ehviewer.ui.tools.rememberedAccessor +import com.hippo.ehviewer.util.displayString import com.hippo.unifile.UniFile import com.hippo.unifile.asUniFile import com.hippo.unifile.displayPath @@ -157,6 +162,33 @@ fun DownloadScreen(navigator: DestinationsNavigator) { summary = stringResource(id = R.string.settings_download_archive_metadata_summary), value = Settings::archiveMetadata, ) + WorkPreference( + title = stringResource(id = R.string.settings_download_reload_metadata), + summary = stringResource(id = R.string.settings_download_reload_metadata_summary), + ) { + fun DownloadInfo.isStable(): Boolean { + val downloadTime = downloadDir?.findFile(COMIC_INFO_FILE)?.lastModified() ?: return false + val postedTime = posted?.let { ParserUtils.parseDate(it) } ?: return false + // stable 30 days after posted + val stableTime = postedTime + 30L * 24L * 60L * 60L * 1000L + return downloadTime > stableTime + } + + runSuspendCatching { + DownloadManager.downloadInfoList.parMapNotNull { + if (it.state == DownloadInfo.STATE_FINISH && !it.isStable()) it else null + }.apply { + fillGalleryListByApi(this, EhUrl.referer) + val toUpdate = parMap { di -> + di.galleryInfo.also { SpiderDen(it, di.dirname!!).writeComicInfo(false) } + } + EhDB.updateGalleryInfo(toUpdate) + launchSnackBar(context.getString(R.string.settings_download_reload_metadata_successfully, toUpdate.size)) + } + }.onFailure { + launchSnackBar(context.getString(R.string.settings_download_reload_metadata_failed, it.displayString())) + } + } WorkPreference( title = stringResource(id = R.string.settings_download_restore_download_items), summary = stringResource(id = R.string.settings_download_restore_download_items_summary), diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 92fb61bb9..2ca7a2417 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -329,6 +329,10 @@ 保存为 CBZ 压缩包 压缩包元数据 下载压缩包时生成 ComicInfo.xml + 重新加载元数据 + 为标签可能发生变动的下载项更新 ComicInfo.xml + 成功加载 %d 项 + 加载元数据失败: %s 允许媒体扫描 请避免他人翻看你的图库应用 大多数图库应用将不会显示下载目录中的图片 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 760550f1b..b4d89052f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -375,6 +375,10 @@ Save as CBZ archive Archive metadata Generate ComicInfo.xml on archive download + Reload metadata + Regenerate the ComicInfo.xml for download items whose tags may have changed + Reload %d items successfully + Reload metadata failed: %s Restore download items Restore all download items in download location Not found download items to restore