diff --git a/app/src/main/java/io/legado/app/api/controller/BookController.kt b/app/src/main/java/io/legado/app/api/controller/BookController.kt index ab55f75ba..85d6acc69 100644 --- a/app/src/main/java/io/legado/app/api/controller/BookController.kt +++ b/app/src/main/java/io/legado/app/api/controller/BookController.kt @@ -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()) diff --git a/app/src/main/java/io/legado/app/model/webBook/WebBook.kt b/app/src/main/java/io/legado/app/model/webBook/WebBook.kt index 04234cbd0..805a33281 100644 --- a/app/src/main/java/io/legado/app/model/webBook/WebBook.kt +++ b/app/src/main/java/io/legado/app/model/webBook/WebBook.kt @@ -188,7 +188,7 @@ object WebBook { context: CoroutineContext = Dispatchers.IO ): Coroutine> { 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 { + ): Result> { 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 - ) } } diff --git a/app/src/main/java/io/legado/app/service/CheckSourceService.kt b/app/src/main/java/io/legado/app/service/CheckSourceService.kt index 9f08fcb2a..82dc6c823 100644 --- a/app/src/main/java/io/legado/app/service/CheckSourceService.kt +++ b/app/src/main/java/io/legado/app/service/CheckSourceService.kt @@ -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) { diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceViewModel.kt index 337d6fae9..625428657 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceViewModel.kt @@ -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) } } diff --git a/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageViewModel.kt b/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageViewModel.kt index 340363742..66448d1f3 100644 --- a/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageViewModel.kt @@ -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 { diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index d6fc3381b..8b56c76b7 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -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 } diff --git a/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt b/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt index 753340946..ff69c934f 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt @@ -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())