diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt index d53bcd4b1..9300f2d50 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt @@ -7,9 +7,13 @@ import eu.kanade.tachiyomi.data.download.DownloadProvider import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter +import eu.kanade.tachiyomi.util.system.toast +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.GlobalScope import org.apache.commons.compress.archivers.dump.UnsupportedCompressionAlgorithmException import tachiyomi.core.i18n.stringResource import tachiyomi.core.storage.UniFileTempFileManager +import tachiyomi.core.util.lang.launchUI import tachiyomi.core.util.lang.withIOContext import tachiyomi.core.util.system.logcat import tachiyomi.domain.manga.model.Manga @@ -77,6 +81,7 @@ class ChapterLoader( /** * Returns the page loader to use for this [chapter]. */ + @OptIn(DelicateCoroutinesApi::class) private fun getPageLoader(chapter: ReaderChapter): PageLoader { val dbChapter = chapter.chapter val isDownloaded = downloadManager.isChapterDownloaded( @@ -101,8 +106,13 @@ class ChapterLoader( is Format.Zip -> ZipPageLoader(tempFileManager.createTempFile(format.file)) is Format.SevenZip -> try { SevenZipPageLoader(tempFileManager.createTempFile(format.file)) + { + GlobalScope.launchUI{ + context.toast(context.stringResource(MR.strings.loader_7zip_slow_archives, it)) + } + } } catch (e: UnsupportedCompressionAlgorithmException) { - error(context.stringResource(MR.strings.loader_ppmd_error)) + error(context.stringResource(MR.strings.loader_7zip_ppmd_error)) } is Format.Rar -> try { RarPageLoader(tempFileManager.createTempFile(format.file)) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/SevenZipPageLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/SevenZipPageLoader.kt index 9e4ca829a..cba928eed 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/SevenZipPageLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/SevenZipPageLoader.kt @@ -9,14 +9,17 @@ import java.io.File /** * Loader used to load a chapter from a .7z or .cb7 file. */ -internal class SevenZipPageLoader(file: File) : PageLoader() { +internal class SevenZipPageLoader( + private val file: File, + private val notifySlowArchive: (method: String) -> Unit +) : PageLoader() { private val zip by lazy { SevenZFile(file) } override var isLocal: Boolean = true override suspend fun getPages(): List { - return zip.getImages() + return zip.getImages(notifySlowArchive) .mapIndexed { i, entry -> ReaderPage(i).apply { stream = { entry.copyOf().inputStream() } diff --git a/core/src/main/java/eu/kanade/tachiyomi/util/storage/SevenZUtil.kt b/core/src/main/java/eu/kanade/tachiyomi/util/storage/SevenZUtil.kt index 6e5d55ef2..19c133e25 100644 --- a/core/src/main/java/eu/kanade/tachiyomi/util/storage/SevenZUtil.kt +++ b/core/src/main/java/eu/kanade/tachiyomi/util/storage/SevenZUtil.kt @@ -3,12 +3,19 @@ package eu.kanade.tachiyomi.util.storage import eu.kanade.tachiyomi.util.lang.compareToCaseInsensitiveNaturalOrder import org.apache.commons.compress.archivers.dump.UnsupportedCompressionAlgorithmException import org.apache.commons.compress.archivers.sevenz.SevenZFile +import org.apache.commons.compress.archivers.sevenz.SevenZMethod import tachiyomi.core.util.system.ImageUtil import java.io.IOException import java.io.InputStream object SevenZUtil { - fun SevenZFile.getImages(): Sequence { + private val GoodMethods = arrayOf( + SevenZMethod.LZMA2, + SevenZMethod.DEFLATE, + SevenZMethod.COPY, + ) + + fun SevenZFile.getImages(notifySlowArchives: (method: String) -> Unit): Sequence { return generateSequence { try { getNextEntry() @@ -16,6 +23,11 @@ object SevenZUtil { throw UnsupportedCompressionAlgorithmException() } }.filter { !it.isDirectory && ImageUtil.isImage(it.name) { getInputStream(it) } } + .onEachIndexed { i, it -> + if (i > 0) return@onEachIndexed + val method = it.contentMethods.first().method + if(method !in GoodMethods) notifySlowArchives(method.name) + } .sortedWith { f1, f2 -> f1.name.compareToCaseInsensitiveNaturalOrder(f2.name) } .map(::getInputStream) .map { it.use(InputStream::readBytes) } // ByteArray diff --git a/i18n/src/commonMain/resources/MR/base/strings.xml b/i18n/src/commonMain/resources/MR/base/strings.xml index 155340fb1..8efc44c9a 100644 --- a/i18n/src/commonMain/resources/MR/base/strings.xml +++ b/i18n/src/commonMain/resources/MR/base/strings.xml @@ -776,7 +776,8 @@ No pages found Source not found RARv5 format is not supported - PPMd compression is not supported + PPMd compression is not supported + %s Archive, expect slow loading times. Updating library diff --git a/source-local/src/androidMain/kotlin/tachiyomi/source/local/LocalSource.kt b/source-local/src/androidMain/kotlin/tachiyomi/source/local/LocalSource.kt index 5435c86c8..332de763b 100644 --- a/source-local/src/androidMain/kotlin/tachiyomi/source/local/LocalSource.kt +++ b/source-local/src/androidMain/kotlin/tachiyomi/source/local/LocalSource.kt @@ -344,7 +344,7 @@ actual class LocalSource( } is Format.SevenZip -> { SevenZFile(tempFileManager.createTempFile(format.file)).use { archive -> - val entry = archive.getImages().firstOrNull() + val entry = archive.getImages {} .firstOrNull() entry?.let { coverManager.update(manga, it.inputStream()) } }