mirror of
https://github.com/mihonapp/mihon.git
synced 2025-02-13 02:28:53 +01:00
fix: Fix crash when reading local 7zip manga (#1)
This commit is contained in:
parent
ed18014430
commit
9e8b14d141
@ -2,9 +2,8 @@ package eu.kanade.tachiyomi.ui.reader.loader
|
|||||||
|
|
||||||
import eu.kanade.tachiyomi.source.model.Page
|
import eu.kanade.tachiyomi.source.model.Page
|
||||||
import eu.kanade.tachiyomi.ui.reader.model.ReaderPage
|
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 org.apache.commons.compress.archivers.sevenz.SevenZFile
|
||||||
import tachiyomi.core.util.system.ImageUtil
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -12,23 +11,18 @@ import java.io.File
|
|||||||
*/
|
*/
|
||||||
internal class SevenZipPageLoader(file: File) : PageLoader() {
|
internal class SevenZipPageLoader(file: File) : PageLoader() {
|
||||||
|
|
||||||
private val zip = 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.entries.asSequence()
|
return zip.getImages()
|
||||||
.filter { !it.isDirectory && ImageUtil.isImage(it.name) { zip.getInputStream(it) } }
|
|
||||||
.sortedWith { f1, f2 -> f1.name.compareToCaseInsensitiveNaturalOrder(f2.name) }
|
|
||||||
.mapIndexed { i, entry ->
|
.mapIndexed { i, entry ->
|
||||||
ReaderPage(i).apply {
|
ReaderPage(i).apply {
|
||||||
stream = {
|
stream = { entry }
|
||||||
zip.getInputStream(entry)
|
|
||||||
}
|
|
||||||
status = Page.State.READY
|
status = Page.State.READY
|
||||||
}
|
}
|
||||||
}
|
}.toList()
|
||||||
.toList()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun loadPage(page: ReaderPage) {
|
override suspend fun loadPage(page: ReaderPage) {
|
||||||
|
@ -32,6 +32,7 @@ dependencies {
|
|||||||
implementation(libs.image.decoder)
|
implementation(libs.image.decoder)
|
||||||
|
|
||||||
implementation(libs.unifile)
|
implementation(libs.unifile)
|
||||||
|
implementation(libs.bundles.sevenzip)
|
||||||
|
|
||||||
api(kotlinx.coroutines.core)
|
api(kotlinx.coroutines.core)
|
||||||
api(kotlinx.serialization.json)
|
api(kotlinx.serialization.json)
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
@ -11,6 +11,7 @@ import eu.kanade.tachiyomi.source.model.SChapter
|
|||||||
import eu.kanade.tachiyomi.source.model.SManga
|
import eu.kanade.tachiyomi.source.model.SManga
|
||||||
import eu.kanade.tachiyomi.util.lang.compareToCaseInsensitiveNaturalOrder
|
import eu.kanade.tachiyomi.util.lang.compareToCaseInsensitiveNaturalOrder
|
||||||
import eu.kanade.tachiyomi.util.storage.EpubFile
|
import eu.kanade.tachiyomi.util.storage.EpubFile
|
||||||
|
import eu.kanade.tachiyomi.util.storage.SevenZUtil.getImages
|
||||||
import kotlinx.coroutines.async
|
import kotlinx.coroutines.async
|
||||||
import kotlinx.coroutines.awaitAll
|
import kotlinx.coroutines.awaitAll
|
||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
@ -342,11 +343,9 @@ actual class LocalSource(
|
|||||||
}
|
}
|
||||||
is Format.SevenZip -> {
|
is Format.SevenZip -> {
|
||||||
SevenZFile(format.file.toTempFile(context)).use { archive ->
|
SevenZFile(format.file.toTempFile(context)).use { archive ->
|
||||||
val entry = archive.entries.toList()
|
val entry = archive.getImages().firstOrNull()
|
||||||
.sortedWith { f1, f2 -> f1.name.compareToCaseInsensitiveNaturalOrder(f2.name) }
|
|
||||||
.find { !it.isDirectory && ImageUtil.isImage(it.name) { archive.getInputStream(it) } }
|
|
||||||
|
|
||||||
entry?.let { coverManager.update(manga, archive.getInputStream(it)) }
|
entry?.let { coverManager.update(manga, it) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is Format.Rar -> {
|
is Format.Rar -> {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user