kunfei 4 лет назад
Родитель
Сommit
bdbda29d4b

+ 1 - 1
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())

+ 34 - 32
app/src/main/java/io/legado/app/model/webBook/WebBook.kt

@@ -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
-            )
         }
     }
 

+ 1 - 1
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) {

+ 2 - 2
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)
             }
         }

+ 12 - 5
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 {

+ 1 - 1
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
                 }

+ 1 - 1
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())