|
|
@@ -2,6 +2,7 @@ package io.legado.app.ui.book.audio
|
|
|
|
|
|
import android.app.Application
|
|
|
import android.content.Intent
|
|
|
+import androidx.lifecycle.viewModelScope
|
|
|
import io.legado.app.R
|
|
|
import io.legado.app.base.BaseViewModel
|
|
|
import io.legado.app.constant.BookType
|
|
|
@@ -12,70 +13,63 @@ import io.legado.app.data.entities.BookChapter
|
|
|
import io.legado.app.data.entities.BookSource
|
|
|
import io.legado.app.help.book.removeType
|
|
|
import io.legado.app.model.AudioPlay
|
|
|
+import io.legado.app.model.AudioPlay.durChapter
|
|
|
import io.legado.app.model.webBook.WebBook
|
|
|
import io.legado.app.utils.postEvent
|
|
|
import io.legado.app.utils.toastOnUi
|
|
|
-import kotlinx.coroutines.Dispatchers
|
|
|
+import kotlinx.coroutines.Dispatchers.IO
|
|
|
|
|
|
class AudioPlayViewModel(application: Application) : BaseViewModel(application) {
|
|
|
|
|
|
fun initData(intent: Intent) = AudioPlay.apply {
|
|
|
execute {
|
|
|
- val bookUrl = intent.getStringExtra("bookUrl")
|
|
|
- if (bookUrl != null && bookUrl != book?.bookUrl) {
|
|
|
- stop(context)
|
|
|
- inBookshelf = intent.getBooleanExtra("inBookshelf", true)
|
|
|
- book = appDb.bookDao.getBook(bookUrl)
|
|
|
- book?.let { book ->
|
|
|
- titleData.postValue(book.name)
|
|
|
- coverData.postValue(book.getDisplayCover())
|
|
|
- durChapter = appDb.bookChapterDao.getChapter(book.bookUrl, book.durChapterIndex)
|
|
|
- upDurChapter(book)
|
|
|
- bookSource = appDb.bookSourceDao.getBookSource(book.origin)
|
|
|
- if (durChapter == null) {
|
|
|
- if (book.tocUrl.isEmpty()) {
|
|
|
- loadBookInfo(book)
|
|
|
- } else {
|
|
|
- loadChapterList(book)
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ val bookUrl = intent.getStringExtra("bookUrl") ?: return@execute
|
|
|
+ val book = appDb.bookDao.getBook(bookUrl) ?: return@execute
|
|
|
+ inBookshelf = intent.getBooleanExtra("inBookshelf", true)
|
|
|
+ initBook(book)
|
|
|
+ }.onFinally {
|
|
|
saveRead()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private fun loadBookInfo(book: Book) {
|
|
|
- execute {
|
|
|
- AudioPlay.bookSource?.let {
|
|
|
- WebBook.getBookInfo(this, it, book)
|
|
|
- .onSuccess {
|
|
|
- loadChapterList(book)
|
|
|
- }
|
|
|
+ private fun initBook(book: Book) {
|
|
|
+ val isSameBook = AudioPlay.book?.bookUrl == book.bookUrl
|
|
|
+ if (isSameBook) {
|
|
|
+ AudioPlay.upData(context, book)
|
|
|
+ } else {
|
|
|
+ AudioPlay.resetData(context, book)
|
|
|
+ }
|
|
|
+ if (durChapter == null) {
|
|
|
+ if (book.tocUrl.isEmpty()) {
|
|
|
+ loadBookInfo(book)
|
|
|
+ } else {
|
|
|
+ loadChapterList(book)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private fun loadBookInfo(book: Book) {
|
|
|
+ val bookSource = AudioPlay.bookSource ?: return
|
|
|
+ WebBook.getBookInfo(viewModelScope, bookSource, book).onSuccess(IO) {
|
|
|
+ loadChapterList(book)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private fun loadChapterList(book: Book) {
|
|
|
- execute {
|
|
|
- AudioPlay.bookSource?.let {
|
|
|
- WebBook.getChapterList(this, it, book)
|
|
|
- .onSuccess(Dispatchers.IO) { cList ->
|
|
|
- book.save()
|
|
|
- appDb.bookChapterDao.insert(*cList.toTypedArray())
|
|
|
- AudioPlay.upDurChapter(book)
|
|
|
- }.onError {
|
|
|
- context.toastOnUi(R.string.error_load_toc)
|
|
|
- }
|
|
|
- }
|
|
|
+ val bookSource = AudioPlay.bookSource ?: return
|
|
|
+ WebBook.getChapterList(viewModelScope, bookSource, book).onSuccess(IO) { cList ->
|
|
|
+ book.save()
|
|
|
+ appDb.bookChapterDao.insert(*cList.toTypedArray())
|
|
|
+ AudioPlay.upDurChapter(book)
|
|
|
+ }.onError {
|
|
|
+ context.toastOnUi(R.string.error_load_toc)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
fun upSource() {
|
|
|
execute {
|
|
|
- AudioPlay.book?.let { book ->
|
|
|
- AudioPlay.bookSource = appDb.bookSourceDao.getBookSource(book.origin)
|
|
|
- }
|
|
|
+ val book = AudioPlay.book ?: return@execute
|
|
|
+ AudioPlay.bookSource = book.getBookSource()
|
|
|
}
|
|
|
}
|
|
|
|