This commit is contained in:
kunfei
2022-04-09 19:30:44 +08:00
parent 8fc9394b63
commit bbb6548b5d
7 changed files with 52 additions and 43 deletions
@@ -124,7 +124,7 @@ object BookController {
if (book.tocUrl.isBlank()) {
WebBook.getBookInfoAwait(this, bookSource, book)
}
WebBook.getChapterListAwait(this, bookSource, book)
WebBook.getChapterListAwait(this, bookSource, book).getOrThrow()
}
appDb.bookChapterDao.delByBook(book.bookUrl)
appDb.bookChapterDao.insert(*toc.toTypedArray())
@@ -188,7 +188,7 @@ object WebBook {
context: CoroutineContext = Dispatchers.IO
): Coroutine<List<BookChapter>> {
return Coroutine.async(scope, context) {
getChapterListAwait(scope, bookSource, book)
getChapterListAwait(scope, bookSource, book).getOrThrow()
}
}
@@ -196,40 +196,42 @@ object WebBook {
scope: CoroutineScope,
bookSource: BookSource,
book: Book,
): List<BookChapter> {
): Result<List<BookChapter>> {
book.type = bookSource.bookSourceType
return if (book.bookUrl == book.tocUrl && !book.tocHtml.isNullOrEmpty()) {
BookChapterList.analyzeChapterList(
scope = scope,
bookSource = bookSource,
book = book,
baseUrl = book.tocUrl,
redirectUrl = book.tocUrl,
body = book.tocHtml
)
} else {
val analyzeUrl = AnalyzeUrl(
mUrl = book.tocUrl,
baseUrl = book.bookUrl,
source = bookSource,
ruleData = book,
headerMapF = bookSource.getHeaderMap(true)
)
var res = analyzeUrl.getStrResponseAwait()
//检测书源是否已登录
bookSource.loginCheckJs?.let { checkJs ->
if (checkJs.isNotBlank()) {
res = analyzeUrl.evalJS(checkJs, result = res) as StrResponse
return kotlin.runCatching {
if (book.bookUrl == book.tocUrl && !book.tocHtml.isNullOrEmpty()) {
BookChapterList.analyzeChapterList(
scope = scope,
bookSource = bookSource,
book = book,
baseUrl = book.tocUrl,
redirectUrl = book.tocUrl,
body = book.tocHtml
)
} else {
val analyzeUrl = AnalyzeUrl(
mUrl = book.tocUrl,
baseUrl = book.bookUrl,
source = bookSource,
ruleData = book,
headerMapF = bookSource.getHeaderMap(true)
)
var res = analyzeUrl.getStrResponseAwait()
//检测书源是否已登录
bookSource.loginCheckJs?.let { checkJs ->
if (checkJs.isNotBlank()) {
res = analyzeUrl.evalJS(checkJs, result = res) as StrResponse
}
}
BookChapterList.analyzeChapterList(
scope = scope,
bookSource = bookSource,
book = book,
baseUrl = book.tocUrl,
redirectUrl = res.url,
body = res.body
)
}
BookChapterList.analyzeChapterList(
scope = scope,
bookSource = bookSource,
book = book,
baseUrl = book.tocUrl,
redirectUrl = res.url,
body = res.body
)
}
}
@@ -213,7 +213,7 @@ class CheckSourceService : BaseService() {
}
//校验目录
if (CheckSource.checkCategory) {
val toc = WebBook.getChapterListAwait(this, source, mBook)
val toc = WebBook.getChapterListAwait(this, source, mBook).getOrThrow()
val nextChapterUrl = toc.getOrNull(1)?.url ?: toc.first().url
//校验正文
if (CheckSource.checkContent) {
@@ -195,7 +195,7 @@ open class ChangeBookSourceViewModel(application: Application) : BaseViewModel(a
}
private suspend fun loadBookToc(scope: CoroutineScope, source: BookSource, book: Book) {
val chapters = WebBook.getChapterListAwait(scope, source, book)
val chapters = WebBook.getChapterListAwait(scope, source, book).getOrThrow()
tocMap[book.bookUrl] = chapters
book.latestChapterTitle = chapters.last().title
val searchBook: SearchBook = book.toSearchBook()
@@ -300,7 +300,7 @@ open class ChangeBookSourceViewModel(application: Application) : BaseViewModel(a
if (book.tocUrl.isEmpty()) {
WebBook.getBookInfoAwait(this, source, book)
}
val toc = WebBook.getChapterListAwait(this, source, book)
val toc = WebBook.getChapterListAwait(this, source, book).getOrThrow()
Pair(toc, source)
}
}
@@ -8,6 +8,7 @@ import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookSource
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.model.webBook.WebBook
import io.legado.app.utils.toastOnUi
class BookshelfManageViewModel(application: Application) : BaseViewModel(application) {
@@ -47,11 +48,17 @@ class BookshelfManageViewModel(application: Application) : BaseViewModel(applica
if (book.isLocalBook()) return@forEachIndexed
if (book.origin == source.bookSourceUrl) return@forEachIndexed
WebBook.preciseSearchAwait(this, source, book.name, book.author)
.getOrNull()?.let { newBook ->
val toc = WebBook.getChapterListAwait(this, source, newBook)
book.changeTo(newBook, toc)
appDb.bookDao.insert(newBook)
appDb.bookChapterDao.insert(*toc.toTypedArray())
.onFailure {
context.toastOnUi("获取书籍出错\n${it.localizedMessage}")
}.getOrNull()?.let { newBook ->
WebBook.getChapterListAwait(this, source, newBook)
.onFailure {
context.toastOnUi("获取目录出错\n${it.localizedMessage}")
}.getOrNull()?.let { toc ->
book.changeTo(newBook, toc)
appDb.bookDao.insert(newBook)
appDb.bookChapterDao.insert(*toc.toTypedArray())
}
}
}
}.onFinally {
@@ -231,7 +231,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
if (book.tocUrl.isEmpty()) {
WebBook.getBookInfoAwait(this, source, book)
}
val toc = WebBook.getChapterListAwait(this, source, book)
val toc = WebBook.getChapterListAwait(this, source, book).getOrThrow()
changeTo(source, book, toc)
return@execute
}
@@ -118,7 +118,7 @@ class MainViewModel(application: Application) : BaseViewModel(application) {
if (book.tocUrl.isBlank()) {
WebBook.getBookInfoAwait(this, source, book)
}
val toc = WebBook.getChapterListAwait(this, source, book)
val toc = WebBook.getChapterListAwait(this, source, book).getOrThrow()
appDb.bookDao.update(book)
appDb.bookChapterDao.delByBook(book.bookUrl)
appDb.bookChapterDao.insert(*toc.toTypedArray())