pull/2114/head
kunfei 2 years ago
parent 7222778aa3
commit 6e3bf6d736
  1. 25
      app/src/main/java/io/legado/app/help/BookHelp.kt
  2. 24
      app/src/main/java/io/legado/app/model/localBook/EpubFile.kt

@ -1,5 +1,7 @@
package io.legado.app.help
import android.net.Uri
import androidx.documentfile.provider.DocumentFile
import io.legado.app.constant.AppLog
import io.legado.app.constant.AppPattern
import io.legado.app.constant.EventBus
@ -15,8 +17,11 @@ import kotlinx.coroutines.Dispatchers.IO
import org.apache.commons.text.similarity.JaccardSimilarity
import splitties.init.appCtx
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.util.concurrent.CopyOnWriteArraySet
import java.util.regex.Pattern
import java.util.zip.ZipFile
import kotlin.math.abs
import kotlin.math.max
import kotlin.math.min
@ -158,6 +163,26 @@ object BookHelp {
return suffix
}
@Throws(IOException::class)
fun getEpubFile(book: Book): ZipFile {
val uri = Uri.parse(book.bookUrl)
if (uri.isContentScheme()) {
val path = FileUtils.getPath(downloadDir, cacheFolderName, book.originName)
val file = File(path)
val doc = DocumentFile.fromSingleUri(appCtx, uri)
?: throw IOException("文件不存在")
if (!file.exists() || doc.lastModified() > book.latestChapterTime) {
LocalBook.getBookInputStream(book).use { inputStream ->
FileOutputStream(file).use { outputStream ->
inputStream.copyTo(outputStream)
}
}
}
return ZipFile(file)
}
return ZipFile(uri.path)
}
fun getChapterFiles(book: Book): List<String> {
val fileNameList = arrayListOf<String>()
if (book.isLocalTxt()) {

@ -2,10 +2,10 @@ package io.legado.app.model.localBook
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.net.Uri
import android.text.TextUtils
import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookChapter
import io.legado.app.help.BookHelp
import io.legado.app.utils.*
import me.ag2s.epublib.domain.EpubBook
import me.ag2s.epublib.domain.Resource
@ -15,13 +15,11 @@ import org.jsoup.Jsoup
import org.jsoup.nodes.Element
import org.jsoup.select.Elements
import splitties.init.appCtx
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.io.InputStream
import java.nio.charset.Charset
import java.util.zip.ZipFile
class EpubFile(var book: Book) {
@ -104,19 +102,13 @@ class EpubFile(var book: Book) {
* 重写epub文件解析代码直接读出压缩包文件生成Resources给epublib这样的好处是可以逐一修改某些文件的格式错误
*/
private fun readEpub(): EpubBook? {
try {
val uri = Uri.parse(book.bookUrl)
return if (uri.isContentScheme()) {
//高版本的手机内存一般足够大,直接加载到内存中最快
EpubReader().readEpub(LocalBook.getBookInputStream(book), "utf-8")
} else {
//低版本的使用懒加载
EpubReader().readEpubLazy(ZipFile(uri.path), "utf-8")
}
} catch (e: Exception) {
e.printOnDebug()
}
return null
return kotlin.runCatching {
//ContentScheme拷贝到私有文件夹采用懒加载防止OOM
val zipFile = BookHelp.getEpubFile(book)
EpubReader().readEpubLazy(zipFile, "utf-8")
}.onFailure {
it.printOnDebug()
}.getOrNull()
}
private fun getContent(chapter: BookChapter): String? {

Loading…
Cancel
Save