fix: Fix crash when reading local 7zip manga (#1)

This commit is contained in:
Claudemirovsky 2024-01-02 21:24:51 -03:00 committed by GitHub
parent ed18014430
commit 9e8b14d141
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 25 additions and 15 deletions

View File

@ -2,9 +2,8 @@ package eu.kanade.tachiyomi.ui.reader.loader
import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.ui.reader.model.ReaderPage
import eu.kanade.tachiyomi.util.lang.compareToCaseInsensitiveNaturalOrder
import eu.kanade.tachiyomi.util.storage.SevenZUtil.getImages
import org.apache.commons.compress.archivers.sevenz.SevenZFile
import tachiyomi.core.util.system.ImageUtil
import java.io.File
/**
@ -12,23 +11,18 @@ import java.io.File
*/
internal class SevenZipPageLoader(file: File) : PageLoader() {
private val zip = SevenZFile(file)
private val zip by lazy { SevenZFile(file) }
override var isLocal: Boolean = true
override suspend fun getPages(): List<ReaderPage> {
return zip.entries.asSequence()
.filter { !it.isDirectory && ImageUtil.isImage(it.name) { zip.getInputStream(it) } }
.sortedWith { f1, f2 -> f1.name.compareToCaseInsensitiveNaturalOrder(f2.name) }
return zip.getImages()
.mapIndexed { i, entry ->
ReaderPage(i).apply {
stream = {
zip.getInputStream(entry)
}
stream = { entry }
status = Page.State.READY
}
}
.toList()
}.toList()
}
override suspend fun loadPage(page: ReaderPage) {

View File

@ -32,6 +32,7 @@ dependencies {
implementation(libs.image.decoder)
implementation(libs.unifile)
implementation(libs.bundles.sevenzip)
api(kotlinx.coroutines.core)
api(kotlinx.serialization.json)

View File

@ -0,0 +1,16 @@
package eu.kanade.tachiyomi.util.storage
import eu.kanade.tachiyomi.util.lang.compareToCaseInsensitiveNaturalOrder
import org.apache.commons.compress.archivers.sevenz.SevenZFile
import tachiyomi.core.util.system.ImageUtil
import java.io.InputStream
object SevenZUtil {
fun SevenZFile.getImages(): Sequence<InputStream> {
return generateSequence { runCatching { getNextEntry() }.getOrNull() }
.filter { !it.isDirectory && ImageUtil.isImage(it.name) { getInputStream(it) } }
.sortedWith { f1, f2 -> f1.name.compareToCaseInsensitiveNaturalOrder(f2.name) }
.map(::getInputStream)
.map { it.use(InputStream::readBytes).inputStream() } // ByteArrayInputStream
}
}

View File

@ -11,6 +11,7 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.util.lang.compareToCaseInsensitiveNaturalOrder
import eu.kanade.tachiyomi.util.storage.EpubFile
import eu.kanade.tachiyomi.util.storage.SevenZUtil.getImages
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.serialization.json.Json
@ -342,11 +343,9 @@ actual class LocalSource(
}
is Format.SevenZip -> {
SevenZFile(format.file.toTempFile(context)).use { archive ->
val entry = archive.entries.toList()
.sortedWith { f1, f2 -> f1.name.compareToCaseInsensitiveNaturalOrder(f2.name) }
.find { !it.isDirectory && ImageUtil.isImage(it.name) { archive.getInputStream(it) } }
val entry = archive.getImages().firstOrNull()
entry?.let { coverManager.update(manga, archive.getInputStream(it)) }
entry?.let { coverManager.update(manga, it) }
}
}
is Format.Rar -> {