From a5f4ff16bcc7b08d054b7e22e0ff490c75377df5 Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Fri, 13 May 2022 09:08:12 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=E5=8D=95=E4=B8=AA=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=94=AF=E6=8C=81=E7=9B=B4=E6=8E=A5=E5=AF=BC?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/model/localBook/LocalBook.kt | 21 ++++++++++--- .../app/ui/book/info/BookInfoActivity.kt | 6 +++- .../app/ui/book/info/BookInfoViewModel.kt | 31 +++++++++++++++++-- 3 files changed, 51 insertions(+), 7 deletions(-) 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 b1cc82a4a..9a1d57104 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 @@ -88,16 +88,16 @@ object LocalBook { fun importFile( str: String, fileName: String, - source: BaseSource? = null + source: BaseSource? = null, + onLineBook: Book? = null ): Book { val bytes = when { str.isAbsUrl() -> AnalyzeUrl(str, source = source).getByteArray() str.isDataUrl() -> Base64.decode(str.substringAfter("base64,"), Base64.DEFAULT) else -> throw NoStackTraceException("在线导入书籍支持http/https/DataURL") } - //从文件头识别文件格式 - - return importFile(bytes, fileName) + val localBook = importFile(bytes, fileName) + return mergeBook(localBook, onLineBook) } fun importFile( @@ -230,4 +230,17 @@ object LocalBook { Uri.fromFile(file) } } + + //文件类书源 合并在线书籍信息 在线 > 本地 + private fun mergeBook(localBook: Book, onLineBook: Book?): Book { + onLineBook ?: return localBook + val mergeBook = localBook + mergeBook.name = if (onLineBook.name.isBlank()) localBook.name else onLineBook.name + mergeBook.author = if (onLineBook.author.isBlank()) localBook.author else onLineBook.author + mergeBook.coverUrl = onLineBook.coverUrl + mergeBook.intro = if (onLineBook.intro.isNullOrBlank()) localBook.intro else onLineBook.intro + mergeBook.save() + return mergeBook + } + } diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt index 5b437029d..d21ecfa05 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt @@ -279,7 +279,11 @@ class BookInfoActivity : } tvRead.setOnClickListener { viewModel.bookData.value?.let { - readBook(it) + if (viewModel.isImportBookOnLine) { + viewModel.importBookFileOnLine() + } else { + readBook(it) + } } ?: toastOnUi("Book is null") } tvShelf.setOnClickListener { 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 2b43af08c..59eda63f0 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 @@ -7,6 +7,7 @@ import androidx.lifecycle.viewModelScope import io.legado.app.R import io.legado.app.base.BaseViewModel import io.legado.app.constant.AppLog +import io.legado.app.constant.BookType import io.legado.app.constant.EventBus import io.legado.app.data.appDb import io.legado.app.data.entities.Book @@ -30,6 +31,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { var inBookshelf = false var bookSource: BookSource? = null private var changeSourceCoroutine: Coroutine<*>? = null + var isImportBookOnLine = false fun initData(intent: Intent) { execute { @@ -73,9 +75,10 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { upCoverByRule(book) bookSource = if (book.isLocalBook()) null else appDb.bookSourceDao.getBookSource(book.origin) + isImportBookOnLine = bookSource?.bookSourceType ?: BookType.local == BookType.file if (book.tocUrl.isEmpty()) { loadBookInfo(book) - } else { + } else if (!isImportBookOnLine) { val chapterList = appDb.bookChapterDao.getChapterList(book.bookUrl) if (chapterList.isNotEmpty()) { chapterListData.postValue(chapterList) @@ -108,7 +111,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { execute(scope) { if (book.isLocalBook()) { loadChapter(book, scope) - } else { + } else if (!isImportBookOnLine) { bookSource?.let { bookSource -> WebBook.getBookInfo(this, bookSource, book, canReName = canReName) .onSuccess(IO) { @@ -282,4 +285,28 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { } } } + + fun importBookFileOnLine() { + execute { + //下载类书源的目录链接视为文件链接 + val book = bookData.value!! + val fileUrl = book.tocUrl + //切下载链接获取文件名 + var fileName = fileUrl.substringAfterLast("/") + if (fileName.isEmpty()) { + fileName = book.name + } + LocalBook.importFile(fileUrl, fileName, bookSource, book) + }.onSuccess { + bookData.postValue(it) + LocalBook.getChapterList(it).let { toc -> + chapterListData.postValue(toc) + } + isImportBookOnLine = false + inBookshelf = true + }.onError { + context.toastOnUi("自动导入出错\n${it.localizedMessage}") + } + } + } \ No newline at end of file From d7d8845e98594aed143dc0566aae2de8c8a2c903 Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Fri, 13 May 2022 12:14:30 +0800 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20=E5=AF=BC=E5=85=A5=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=E6=96=87=E4=BB=B6bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/book/info/BookInfoActivity.kt | 2 +- .../main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt | 4 +++- app/src/main/res/values-es-rES/strings.xml | 1 + app/src/main/res/values-ja-rJP/strings.xml | 1 + app/src/main/res/values-pt-rBR/strings.xml | 1 + app/src/main/res/values-zh-rHK/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values-zh/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 9 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt index d21ecfa05..dfad88975 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt @@ -230,7 +230,7 @@ class BookInfoActivity : binding.tvToc.text = getString(R.string.toc_s, getString(R.string.loading)) } chapterList.isNullOrEmpty() -> { - binding.tvToc.text = getString(R.string.toc_s, getString(R.string.error_load_toc)) + binding.tvToc.text = if (viewModel.isImportBookOnLine) getString(R.string.click_read_button_load) else getString(R.string.toc_s, getString(R.string.error_load_toc)) } else -> { viewModel.bookData.value?.let { 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 59eda63f0..a76e97a97 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 @@ -111,7 +111,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { execute(scope) { if (book.isLocalBook()) { loadChapter(book, scope) - } else if (!isImportBookOnLine) { + } else { bookSource?.let { bookSource -> WebBook.getBookInfo(this, bookSource, book, canReName = canReName) .onSuccess(IO) { @@ -144,6 +144,8 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { appDb.bookChapterDao.insert(*it.toTypedArray()) chapterListData.postValue(it) } + } else if(!isImportBookOnLine) { + chapterListData.postValue(emptyList()) } else { bookSource?.let { bookSource -> WebBook.getChapterList(this, bookSource, book) diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index a3a5e4521..7e6011d0b 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -979,5 +979,6 @@ 导入主题 导入txt目录规则 CookieJar + 点击阅读加载目录 diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index e98d5fa0b..06cff97fc 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -982,5 +982,6 @@ 导入主题 导入txt目录规则 CookieJar + 点击阅读加载目录 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 7646b005e..09cc15699 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -982,5 +982,6 @@ 导入主题 导入txt目录规则 CookieJar + 点击阅读加载目录 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 90eb8bc6d..eb359a20f 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -979,5 +979,6 @@ 导入主题 导入txt目录规则 CookieJar + 点击阅读加载目录 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 0de83ac2f..8ae5eaca7 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -981,5 +981,6 @@ 导入主题 导入txt目录规则 CookieJar + 点击阅读加载目录 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 19069a3f2..a9a530cc1 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -981,5 +981,6 @@ 导入主题 导入txt目录规则 CookieJar + 点击阅读加载目录 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 582890f12..3243f3d87 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -982,5 +982,6 @@ 导入主题 导入txt目录规则 CookieJar + 点击阅读加载目录 From 7898997516ef1dcd116cd06f04a725f82f5943d7 Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Fri, 13 May 2022 12:14:30 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=E5=AF=BC=E5=85=A5=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=E6=96=87=E4=BB=B6bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/info/BookInfoViewModel.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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 a0f9e71b0..7a029f588 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 @@ -78,7 +78,9 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { isImportBookOnLine = (bookSource?.bookSourceType ?: BookType.local) == BookType.file if (book.tocUrl.isEmpty()) { loadBookInfo(book) - } else if (!isImportBookOnLine) { + } else if (isImportBookOnLine) { + chapterListData.postValue(emptyList()) + } else { val chapterList = appDb.bookChapterDao.getChapterList(book.bookUrl) if (chapterList.isNotEmpty()) { chapterListData.postValue(chapterList) @@ -111,7 +113,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { execute(scope) { if (book.isLocalBook()) { loadChapter(book, scope) - } else if (!isImportBookOnLine) { + } else { bookSource?.let { bookSource -> WebBook.getBookInfo(this, bookSource, book, canReName = canReName) .onSuccess(IO) { @@ -144,7 +146,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { appDb.bookChapterDao.insert(*it.toTypedArray()) chapterListData.postValue(it) } - } else if(!isImportBookOnLine) { + } else if (isImportBookOnLine) { chapterListData.postValue(emptyList()) } else { bookSource?.let { bookSource ->