优化代码

pull/783/head
gedoor 4 years ago
parent 1acfa8307f
commit 9ebe1c003e
  1. 2
      app/src/main/java/io/legado/app/api/controller/BookshelfController.kt
  2. 2
      app/src/main/java/io/legado/app/model/webBook/BookInfo.kt
  3. 143
      app/src/main/java/io/legado/app/model/webBook/WebBook.kt
  4. 2
      app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt

@ -66,7 +66,7 @@ object BookshelfController {
} else { } else {
App.db.bookSourceDao.getBookSource(book.origin)?.let { source -> App.db.bookSourceDao.getBookSource(book.origin)?.let { source ->
runBlocking { runBlocking {
WebBook(source).getContentSuspend(book, chapter) WebBook(source).getContentAwait(book, chapter)
}.let { }.let {
saveBookReadIndex(book, index) saveBookReadIndex(book, index)
returnData.setData(it) returnData.setData(it)

@ -10,11 +10,13 @@ import io.legado.app.model.analyzeRule.AnalyzeRule
import io.legado.app.utils.NetworkUtils import io.legado.app.utils.NetworkUtils
import io.legado.app.utils.StringUtils.wordCountFormat import io.legado.app.utils.StringUtils.wordCountFormat
import io.legado.app.utils.htmlFormat import io.legado.app.utils.htmlFormat
import kotlinx.coroutines.CoroutineScope
object BookInfo { object BookInfo {
@Throws(Exception::class) @Throws(Exception::class)
fun analyzeBookInfo( fun analyzeBookInfo(
scope: CoroutineScope,
book: Book, book: Book,
body: String?, body: String?,
bookSource: BookSource, bookSource: BookSource,

@ -11,6 +11,7 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
@Suppress("MemberVisibilityCanBePrivate")
class WebBook(val bookSource: BookSource) { class WebBook(val bookSource: BookSource) {
val sourceUrl: String val sourceUrl: String
@ -26,11 +27,11 @@ class WebBook(val bookSource: BookSource) {
context: CoroutineContext = Dispatchers.IO, context: CoroutineContext = Dispatchers.IO,
): Coroutine<ArrayList<SearchBook>> { ): Coroutine<ArrayList<SearchBook>> {
return Coroutine.async(scope, context) { return Coroutine.async(scope, context) {
searchBookSuspend(scope, key, page) searchBookAwait(scope, key, page)
} }
} }
suspend fun searchBookSuspend( suspend fun searchBookAwait(
scope: CoroutineScope, scope: CoroutineScope,
key: String, key: String,
page: Int? = 1, page: Int? = 1,
@ -68,28 +69,36 @@ class WebBook(val bookSource: BookSource) {
scope: CoroutineScope = Coroutine.DEFAULT, scope: CoroutineScope = Coroutine.DEFAULT,
context: CoroutineContext = Dispatchers.IO, context: CoroutineContext = Dispatchers.IO,
): Coroutine<List<SearchBook>> { ): Coroutine<List<SearchBook>> {
val variableBook = SearchBook()
return Coroutine.async(scope, context) { return Coroutine.async(scope, context) {
val analyzeUrl = AnalyzeUrl( exploreBookAwait(url, page, scope)
ruleUrl = url,
page = page,
baseUrl = sourceUrl,
book = variableBook,
headerMapF = bookSource.getHeaderMap()
)
val res = analyzeUrl.getStrResponse(bookSource.bookSourceUrl)
BookList.analyzeBookList(
scope,
res.body,
bookSource,
analyzeUrl,
res.url,
variableBook,
false
)
} }
} }
suspend fun exploreBookAwait(
url: String,
page: Int? = 1,
scope: CoroutineScope = Coroutine.DEFAULT
): ArrayList<SearchBook> {
val variableBook = SearchBook()
val analyzeUrl = AnalyzeUrl(
ruleUrl = url,
page = page,
baseUrl = sourceUrl,
book = variableBook,
headerMapF = bookSource.getHeaderMap()
)
val res = analyzeUrl.getStrResponse(bookSource.bookSourceUrl)
return BookList.analyzeBookList(
scope,
res.body,
bookSource,
analyzeUrl,
res.url,
variableBook,
false
)
}
/** /**
* 书籍信息 * 书籍信息
*/ */
@ -100,23 +109,38 @@ class WebBook(val bookSource: BookSource) {
canReName: Boolean = true, canReName: Boolean = true,
): Coroutine<Book> { ): Coroutine<Book> {
return Coroutine.async(scope, context) { return Coroutine.async(scope, context) {
book.type = bookSource.bookSourceType getBookInfoAwait(book, scope, canReName)
if (!book.infoHtml.isNullOrEmpty()) {
book.infoHtml
BookInfo.analyzeBookInfo(book, book.infoHtml, bookSource, book.bookUrl, canReName)
} else {
val res = AnalyzeUrl(
ruleUrl = book.bookUrl,
baseUrl = sourceUrl,
headerMapF = bookSource.getHeaderMap(),
book = book
).getStrResponse(bookSource.bookSourceUrl)
BookInfo.analyzeBookInfo(book, res.body, bookSource, book.bookUrl, canReName)
}
book
} }
} }
suspend fun getBookInfoAwait(
book: Book,
scope: CoroutineScope = Coroutine.DEFAULT,
canReName: Boolean = true,
): Book {
book.type = bookSource.bookSourceType
if (!book.infoHtml.isNullOrEmpty()) {
book.infoHtml
BookInfo.analyzeBookInfo(
scope,
book,
book.infoHtml,
bookSource,
book.bookUrl,
canReName
)
} else {
val res = AnalyzeUrl(
ruleUrl = book.bookUrl,
baseUrl = sourceUrl,
headerMapF = bookSource.getHeaderMap(),
book = book
).getStrResponse(bookSource.bookSourceUrl)
BookInfo.analyzeBookInfo(scope, book, res.body, bookSource, book.bookUrl, canReName)
}
return book
}
/** /**
* 目录 * 目录
*/ */
@ -126,31 +150,25 @@ class WebBook(val bookSource: BookSource) {
context: CoroutineContext = Dispatchers.IO context: CoroutineContext = Dispatchers.IO
): Coroutine<List<BookChapter>> { ): Coroutine<List<BookChapter>> {
return Coroutine.async(scope, context) { return Coroutine.async(scope, context) {
book.type = bookSource.bookSourceType getChapterListAwait(book, scope)
if (book.bookUrl == book.tocUrl && !book.tocHtml.isNullOrEmpty()) { }
BookChapterList.analyzeChapterList( }
this,
book,
book.tocHtml,
bookSource,
book.tocUrl
)
} else {
val res = AnalyzeUrl(
book = book,
ruleUrl = book.tocUrl,
baseUrl = book.bookUrl,
headerMapF = bookSource.getHeaderMap()
).getStrResponse(bookSource.bookSourceUrl)
BookChapterList.analyzeChapterList(
this,
book,
res.body,
bookSource,
book.tocUrl
)
}
suspend fun getChapterListAwait(
book: Book,
scope: CoroutineScope = Coroutine.DEFAULT
): List<BookChapter> {
book.type = bookSource.bookSourceType
return if (book.bookUrl == book.tocUrl && !book.tocHtml.isNullOrEmpty()) {
BookChapterList.analyzeChapterList(scope, book, book.tocHtml, bookSource, book.tocUrl)
} else {
val res = AnalyzeUrl(
book = book,
ruleUrl = book.tocUrl,
baseUrl = book.bookUrl,
headerMapF = bookSource.getHeaderMap()
).getStrResponse(bookSource.bookSourceUrl)
BookChapterList.analyzeChapterList(scope, book, res.body, bookSource, book.tocUrl)
} }
} }
@ -165,16 +183,11 @@ class WebBook(val bookSource: BookSource) {
context: CoroutineContext = Dispatchers.IO context: CoroutineContext = Dispatchers.IO
): Coroutine<String> { ): Coroutine<String> {
return Coroutine.async(scope, context) { return Coroutine.async(scope, context) {
getContentSuspend( getContentAwait(book, bookChapter, nextChapterUrl, scope)
book, bookChapter, nextChapterUrl, scope
)
} }
} }
/** suspend fun getContentAwait(
* 章节内容
*/
suspend fun getContentSuspend(
book: Book, book: Book,
bookChapter: BookChapter, bookChapter: BookChapter,
nextChapterUrl: String? = null, nextChapterUrl: String? = null,

@ -216,7 +216,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
App.db.bookSourceDao.allTextEnabled.forEach { source -> App.db.bookSourceDao.allTextEnabled.forEach { source ->
try { try {
WebBook(source) WebBook(source)
.searchBookSuspend(this, name) .searchBookAwait(this, name)
.getOrNull(0)?.let { .getOrNull(0)?.let {
if (it.name == name && (it.author == author || author == "")) { if (it.name == name && (it.author == author || author == "")) {
val book = it.toBook() val book = it.toBook()

Loading…
Cancel
Save