notify user of slow compression methods

This commit is contained in:
AbdallahMehiz 2024-01-22 21:18:32 +01:00
parent 9bfb34982e
commit 463e6f85f6
No known key found for this signature in database
GPG Key ID: 975266399F5BAF34
5 changed files with 32 additions and 6 deletions

View File

@ -7,9 +7,13 @@ import eu.kanade.tachiyomi.data.download.DownloadProvider
import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter 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 org.apache.commons.compress.archivers.dump.UnsupportedCompressionAlgorithmException
import tachiyomi.core.i18n.stringResource import tachiyomi.core.i18n.stringResource
import tachiyomi.core.storage.UniFileTempFileManager import tachiyomi.core.storage.UniFileTempFileManager
import tachiyomi.core.util.lang.launchUI
import tachiyomi.core.util.lang.withIOContext import tachiyomi.core.util.lang.withIOContext
import tachiyomi.core.util.system.logcat import tachiyomi.core.util.system.logcat
import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.manga.model.Manga
@ -77,6 +81,7 @@ class ChapterLoader(
/** /**
* Returns the page loader to use for this [chapter]. * Returns the page loader to use for this [chapter].
*/ */
@OptIn(DelicateCoroutinesApi::class)
private fun getPageLoader(chapter: ReaderChapter): PageLoader { private fun getPageLoader(chapter: ReaderChapter): PageLoader {
val dbChapter = chapter.chapter val dbChapter = chapter.chapter
val isDownloaded = downloadManager.isChapterDownloaded( val isDownloaded = downloadManager.isChapterDownloaded(
@ -101,8 +106,13 @@ class ChapterLoader(
is Format.Zip -> ZipPageLoader(tempFileManager.createTempFile(format.file)) is Format.Zip -> ZipPageLoader(tempFileManager.createTempFile(format.file))
is Format.SevenZip -> try { is Format.SevenZip -> try {
SevenZipPageLoader(tempFileManager.createTempFile(format.file)) SevenZipPageLoader(tempFileManager.createTempFile(format.file))
{
GlobalScope.launchUI{
context.toast(context.stringResource(MR.strings.loader_7zip_slow_archives, it))
}
}
} catch (e: UnsupportedCompressionAlgorithmException) { } catch (e: UnsupportedCompressionAlgorithmException) {
error(context.stringResource(MR.strings.loader_ppmd_error)) error(context.stringResource(MR.strings.loader_7zip_ppmd_error))
} }
is Format.Rar -> try { is Format.Rar -> try {
RarPageLoader(tempFileManager.createTempFile(format.file)) RarPageLoader(tempFileManager.createTempFile(format.file))

View File

@ -9,14 +9,17 @@ import java.io.File
/** /**
* Loader used to load a chapter from a .7z or .cb7 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) } private val zip by lazy { SevenZFile(file) }
override var isLocal: Boolean = true override var isLocal: Boolean = true
override suspend fun getPages(): List<ReaderPage> { override suspend fun getPages(): List<ReaderPage> {
return zip.getImages() return zip.getImages(notifySlowArchive)
.mapIndexed { i, entry -> .mapIndexed { i, entry ->
ReaderPage(i).apply { ReaderPage(i).apply {
stream = { entry.copyOf().inputStream() } stream = { entry.copyOf().inputStream() }

View File

@ -3,12 +3,19 @@ package eu.kanade.tachiyomi.util.storage
import eu.kanade.tachiyomi.util.lang.compareToCaseInsensitiveNaturalOrder import eu.kanade.tachiyomi.util.lang.compareToCaseInsensitiveNaturalOrder
import org.apache.commons.compress.archivers.dump.UnsupportedCompressionAlgorithmException import org.apache.commons.compress.archivers.dump.UnsupportedCompressionAlgorithmException
import org.apache.commons.compress.archivers.sevenz.SevenZFile import org.apache.commons.compress.archivers.sevenz.SevenZFile
import org.apache.commons.compress.archivers.sevenz.SevenZMethod
import tachiyomi.core.util.system.ImageUtil import tachiyomi.core.util.system.ImageUtil
import java.io.IOException import java.io.IOException
import java.io.InputStream import java.io.InputStream
object SevenZUtil { object SevenZUtil {
fun SevenZFile.getImages(): Sequence<ByteArray> { private val GoodMethods = arrayOf(
SevenZMethod.LZMA2,
SevenZMethod.DEFLATE,
SevenZMethod.COPY,
)
fun SevenZFile.getImages(notifySlowArchives: (method: String) -> Unit): Sequence<ByteArray> {
return generateSequence { return generateSequence {
try { try {
getNextEntry() getNextEntry()
@ -16,6 +23,11 @@ object SevenZUtil {
throw UnsupportedCompressionAlgorithmException() throw UnsupportedCompressionAlgorithmException()
} }
}.filter { !it.isDirectory && ImageUtil.isImage(it.name) { getInputStream(it) } } }.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) } .sortedWith { f1, f2 -> f1.name.compareToCaseInsensitiveNaturalOrder(f2.name) }
.map(::getInputStream) .map(::getInputStream)
.map { it.use(InputStream::readBytes) } // ByteArray .map { it.use(InputStream::readBytes) } // ByteArray

View File

@ -776,7 +776,8 @@
<string name="page_list_empty_error">No pages found</string> <string name="page_list_empty_error">No pages found</string>
<string name="loader_not_implemented_error">Source not found</string> <string name="loader_not_implemented_error">Source not found</string>
<string name="loader_rar5_error">RARv5 format is not supported</string> <string name="loader_rar5_error">RARv5 format is not supported</string>
<string name="loader_ppmd_error">PPMd compression is not supported</string> <string name="loader_7zip_ppmd_error">PPMd compression is not supported</string>
<string name="loader_7zip_slow_archives">%s Archive, expect slow loading times.</string>
<!-- Updates --> <!-- Updates -->
<string name="updating_library">Updating library</string> <string name="updating_library">Updating library</string>

View File

@ -344,7 +344,7 @@ actual class LocalSource(
} }
is Format.SevenZip -> { is Format.SevenZip -> {
SevenZFile(tempFileManager.createTempFile(format.file)).use { archive -> SevenZFile(tempFileManager.createTempFile(format.file)).use { archive ->
val entry = archive.getImages().firstOrNull() val entry = archive.getImages {} .firstOrNull()
entry?.let { coverManager.update(manga, it.inputStream()) } entry?.let { coverManager.update(manga, it.inputStream()) }
} }