From 1824d24267ccd349a2f0f83f26e0ac03d0514e3a Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Fri, 5 Jul 2024 22:56:57 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/model/localBook/EpubFile.kt | 46 +++++++++---------- .../legado/app/model/localBook/LocalBook.kt | 17 +++++-- .../io/legado/app/model/localBook/PdfFile.kt | 46 +++++++++---------- .../io/legado/app/model/localBook/UmdFile.kt | 21 ++++----- .../app/ui/book/info/BookInfoViewModel.kt | 2 + 5 files changed, 71 insertions(+), 61 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt b/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt index 77a37b1cd..fac630c4f 100644 --- a/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt @@ -21,7 +21,6 @@ import me.ag2s.epublib.util.zip.AndroidZipFile import org.jsoup.Jsoup import org.jsoup.nodes.Element import org.jsoup.select.Elements -import java.io.File import java.io.FileOutputStream import java.io.IOException import java.io.InputStream @@ -95,29 +94,6 @@ class EpubFile(var book: Book) { return field } - init { - try { - epubBook?.let { - if (book.coverUrl.isNullOrEmpty()) { - book.coverUrl = LocalBook.getCoverPath(book) - } - if (!File(book.coverUrl!!).exists()) { - /*部分书籍DRM处理后,封面获取异常,待优化*/ - it.coverImage?.inputStream?.use { input -> - val cover = BitmapFactory.decodeStream(input) - val out = FileOutputStream(FileUtils.createFileIfNotExist(book.coverUrl!!)) - cover.compress(Bitmap.CompressFormat.JPEG, 90, out) - out.flush() - out.close() - } ?: AppLog.putDebug("Epub: 封面获取为空. path: ${book.bookUrl}") - } - } - } catch (e: Exception) { - AppLog.put("加载书籍封面失败\n${e.localizedMessage}", e) - e.printOnDebug() - } - } - /** * 重写epub文件解析代码,直接读出压缩包文件生成Resources给epublib,这样的好处是可以逐一修改某些文件的格式错误 */ @@ -267,11 +243,33 @@ class EpubFile(var book: Book) { return epubBook?.resources?.getByHref(abHref)?.inputStream } + private fun upBookCover() { + try { + epubBook?.let { + if (book.coverUrl.isNullOrEmpty()) { + book.coverUrl = LocalBook.getCoverPath(book) + } + /*部分书籍DRM处理后,封面获取异常,待优化*/ + it.coverImage?.inputStream?.use { input -> + val cover = BitmapFactory.decodeStream(input) + val out = FileOutputStream(FileUtils.createFileIfNotExist(book.coverUrl!!)) + cover.compress(Bitmap.CompressFormat.JPEG, 90, out) + out.flush() + out.close() + } ?: AppLog.putDebug("Epub: 封面获取为空. path: ${book.bookUrl}") + } + } catch (e: Exception) { + AppLog.put("加载书籍封面失败\n${e.localizedMessage}", e) + e.printOnDebug() + } + } + private fun upBookInfo() { if (epubBook == null) { eFile = null book.intro = "书籍导入异常" } else { + upBookCover() val metadata = epubBook!!.metadata book.name = metadata.firstTitle if (book.name.isEmpty()) { diff --git a/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt b/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt index 0c0c50252..96e4c787c 100644 --- a/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt +++ b/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt @@ -192,17 +192,25 @@ object LocalBook { latestChapterTime = updateTime, order = appDb.bookDao.minOrder - 1 ) - if (book.isEpub) EpubFile.upBookInfo(book) - if (book.isUmd) UmdFile.upBookInfo(book) - if (book.isPdf) PdfFile.upBookInfo(book) + upBookInfo(book) appDb.bookDao.insert(book) } else { + deleteBook(book, false) + upBookInfo(book) //已有书籍说明是更新,删除原有目录 appDb.bookChapterDao.delByBook(bookUrl) } return book } + fun upBookInfo(book: Book) { + when { + book.isEpub -> EpubFile.upBookInfo(book) + book.isUmd -> UmdFile.upBookInfo(book) + book.isPdf -> UmdFile.upBookInfo(book) + } + } + /* 导入压缩包内的书籍 */ fun importArchiveFile( archiveFileUri: Uri, @@ -306,6 +314,9 @@ object LocalBook { fun deleteBook(book: Book, deleteOriginal: Boolean) { kotlin.runCatching { BookHelp.clearCache(book) + if (!book.coverUrl.isNullOrEmpty()) { + FileUtils.delete(book.coverUrl!!) + } if (deleteOriginal) { if (book.bookUrl.isContentScheme()) { val uri = Uri.parse(book.bookUrl) diff --git a/app/src/main/java/io/legado/app/model/localBook/PdfFile.kt b/app/src/main/java/io/legado/app/model/localBook/PdfFile.kt index 4b7e0433a..26ff42613 100644 --- a/app/src/main/java/io/legado/app/model/localBook/PdfFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/PdfFile.kt @@ -8,7 +8,11 @@ import io.legado.app.constant.AppLog import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter import io.legado.app.help.book.getLocalUri -import io.legado.app.utils.* +import io.legado.app.utils.BitmapUtils +import io.legado.app.utils.FileUtils +import io.legado.app.utils.SystemUtils +import io.legado.app.utils.isContentScheme +import io.legado.app.utils.printOnDebug import splitties.init.appCtx import java.io.File import java.io.FileOutputStream @@ -70,28 +74,6 @@ class PdfFile(var book: Book) { return field } - - init { - try { - pdfRenderer?.let { renderer -> - if (book.coverUrl.isNullOrEmpty()) { - book.coverUrl = LocalBook.getCoverPath(book) - } - if (!File(book.coverUrl!!).exists()) { - - FileOutputStream(FileUtils.createFileIfNotExist(book.coverUrl!!)).use { out -> - openPdfPage(renderer, 0)?.compress(Bitmap.CompressFormat.JPEG, 90, out) - out.flush() - } - } - } - } catch (e: Exception) { - AppLog.put("加载书籍封面失败\n${e.localizedMessage}", e) - e.printOnDebug() - } - - } - /** * 读取PDF文件 * @@ -206,11 +188,29 @@ class PdfFile(var book: Book) { return chapterList } + private fun upBookCover() { + try { + pdfRenderer?.let { renderer -> + if (book.coverUrl.isNullOrEmpty()) { + book.coverUrl = LocalBook.getCoverPath(book) + } + FileOutputStream(FileUtils.createFileIfNotExist(book.coverUrl!!)).use { out -> + openPdfPage(renderer, 0)?.compress(Bitmap.CompressFormat.JPEG, 90, out) + out.flush() + } + } + } catch (e: Exception) { + AppLog.put("加载书籍封面失败\n${e.localizedMessage}", e) + e.printOnDebug() + } + } + private fun upBookInfo() { if (pdfRenderer == null) { pFile = null book.intro = "书籍导入异常" } else { + upBookCover() if (book.name.isEmpty()) { book.name = book.originName.replace(".pdf", "") } diff --git a/app/src/main/java/io/legado/app/model/localBook/UmdFile.kt b/app/src/main/java/io/legado/app/model/localBook/UmdFile.kt index 1f4d96d63..196727590 100644 --- a/app/src/main/java/io/legado/app/model/localBook/UmdFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/UmdFile.kt @@ -2,10 +2,11 @@ package io.legado.app.model.localBook import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter -import io.legado.app.utils.* +import io.legado.app.utils.DebugLog +import io.legado.app.utils.FileUtils +import io.legado.app.utils.printOnDebug import me.ag2s.umdlib.domain.UmdBook import me.ag2s.umdlib.umd.UmdReader -import java.io.File import java.io.InputStream class UmdFile(var book: Book) { @@ -57,32 +58,30 @@ class UmdFile(var book: Book) { return field } + private fun readUmd(): UmdBook? { + val input = LocalBook.getBookInputStream(book) + return UmdReader().read(input) + } - init { + private fun upBookCover() { try { umdBook?.let { if (book.coverUrl.isNullOrEmpty()) { book.coverUrl = LocalBook.getCoverPath(book) } - if (!File(book.coverUrl!!).exists()) { - FileUtils.writeBytes(book.coverUrl!!, it.cover.coverData) - } + FileUtils.writeBytes(book.coverUrl!!, it.cover.coverData) } } catch (e: Exception) { e.printOnDebug() } } - private fun readUmd(): UmdBook? { - val input = LocalBook.getBookInputStream(book) - return UmdReader().read(input) - } - private fun upBookInfo() { if (umdBook == null) { uFile = null book.intro = "书籍导入异常" } else { + upBookCover() val hd = umdBook!!.header book.name = hd.title book.author = hd.author diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt index b779eabf6..0d917bf30 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt @@ -165,6 +165,8 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { scope: CoroutineScope = viewModelScope ) { if (book.isLocal) { + LocalBook.upBookInfo(book) + bookData.postValue(book) loadChapter(book, scope) } else { val bookSource = bookSource ?: let {