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 ->