[优化] 增加了部分 Sigma 版本的书源回调参数

This commit is contained in:
HapeLee
2026-02-26 01:31:02 +08:00
parent 0250001a27
commit 8956f1d682
4 changed files with 78 additions and 9 deletions
@@ -102,6 +102,7 @@ object AudioPlay : CoroutineScope by MainScope() {
durPlayUrl = ""
durAudioSize = 0
upDurChapter()
SourceCallBack.callBackBook(SourceCallBack.START_READ, bookSource, book, durChapter)
postEvent(EventBus.AUDIO_BUFFER_PROGRESS, 0)
}
@@ -360,6 +361,7 @@ object AudioPlay : CoroutineScope by MainScope() {
ContentProcessor.get(book.name, book.origin).getTitleReplaceRules(),
book.getUseReplaceRule()
)
SourceCallBack.callBackBook(SourceCallBack.SAVE_READ, bookSource, book, it)
}
}
book.update()
@@ -56,7 +56,7 @@ object SourceCallBack {
}
activity.lifecycleScope.launch(IO) {
val java = SourceLoginJsExtensions(activity, source)
runCatching {
kotlin.runCatching {
val result = runScriptWithContext {
source.evalJS(jsStr) {
put("event", event)
@@ -114,7 +114,7 @@ object SourceCallBack {
val jsStr = source.getContentRule().callBackJs
if (jsStr.isNullOrEmpty()) return
scope.launch(IO) {
runCatching {
kotlin.runCatching {
withTimeout(30000L) {
runScriptWithContext {
source.evalJS(jsStr) {
@@ -59,6 +59,7 @@ import io.legado.app.help.config.LocalConfig
import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.dialogs.selector
import io.legado.app.model.BookCover
import io.legado.app.model.SourceCallBack
import io.legado.app.model.remote.RemoteBookWebDav
import io.legado.app.ui.about.AppLogDialog
import io.legado.app.ui.book.audio.AudioPlayActivity
@@ -828,15 +829,47 @@ class BookInfoActivity :
}
tvAuthor.setOnClickListener {
viewModel.getBook(false)?.let { book ->
startActivity<SearchActivity> {
putExtra("key", book.author)
SourceCallBack.callBackBtn(
this@BookInfoActivity,
SourceCallBack.CLICK_AUTHOR,
viewModel.bookSource,
book,
null
) {
startActivity<SearchActivity> {
putExtra("key", book.author)
}
}
}
}
tvAuthor.setOnLongClickListener {
viewModel.getBook(false)?.let { book ->
SourceCallBack.callBackBtn(
this@BookInfoActivity,
SourceCallBack.LONG_CLICK_AUTHOR,
viewModel.bookSource,
book,
null
) {
startActivity<SearchActivity> {
putExtra("key", book.author)
}
}
}
true
}
tvName.setOnClickListener {
viewModel.getBook(false)?.let { book ->
startActivity<SearchActivity> {
putExtra("key", book.name)
SourceCallBack.callBackBtn(
this@BookInfoActivity,
SourceCallBack.CLICK_BOOK_NAME,
viewModel.bookSource,
book,
null
) {
startActivity<SearchActivity> {
putExtra("key", book.name)
}
}
}
}
@@ -922,14 +955,14 @@ class BookInfoActivity :
@SuppressLint("InflateParams")
private fun deleteBook() {
viewModel.getBook()?.let {
viewModel.getBook()?.let { book ->
if (LocalConfig.bookInfoDeleteAlert) {
alert(
titleResource = R.string.draw,
messageResource = R.string.sure_del
) {
var checkBox: CheckBox? = null
if (it.isLocal) {
if (book.isLocal) {
checkBox = CheckBox(this@BookInfoActivity).apply {
setText(R.string.delete_book_file)
isChecked = LocalConfig.deleteBookOriginal
@@ -944,6 +977,11 @@ class BookInfoActivity :
if (checkBox != null) {
LocalConfig.deleteBookOriginal = checkBox.isChecked
}
SourceCallBack.callBackBook(
SourceCallBack.DEL_BOOK_SHELF,
viewModel.bookSource,
book
) //确认后删除书架
viewModel.delBook(LocalConfig.deleteBookOriginal) {
setResult(RESULT_OK)
finish()
@@ -952,6 +990,11 @@ class BookInfoActivity :
noButton()
}
} else {
SourceCallBack.callBackBook(
SourceCallBack.DEL_BOOK_SHELF,
viewModel.bookSource,
book
) //点按钮直接删除书架
viewModel.delBook(LocalConfig.deleteBookOriginal) {
setResult(RESULT_OK)
finish()
@@ -23,6 +23,7 @@ import io.legado.app.help.book.sync
import io.legado.app.help.config.AppConfig
import io.legado.app.model.CacheBook
import io.legado.app.model.ReadBook
import io.legado.app.model.SourceCallBack
import io.legado.app.model.webBook.WebBook
import io.legado.app.service.CacheBookService
import io.legado.app.utils.onEachParallel
@@ -53,6 +54,7 @@ class MainViewModel(application: Application) : BaseViewModel(application) {
val onUpBooksLiveData = MutableLiveData<Int>()
private var upTocJob: Job? = null
private var cacheBookJob: Job? = null
private val eventListenerSource = ConcurrentHashMap<BookSource, Boolean>()
val booksListRecycledViewPool = RecycledViewPool().apply {
setMaxRecycledViews(0, 30)
}
@@ -156,6 +158,17 @@ class MainViewModel(application: Application) : BaseViewModel(application) {
}
return
}
if (source.eventListener) {
// 使用 putIfAbsent 确保只添加一次
if (eventListenerSource.putIfAbsent(source, true) == null) {
// 通知监听事件的书源,书架刷新开始
SourceCallBack.callBackSource(
viewModelScope,
SourceCallBack.START_SHELF_REFRESH,
source
)
}
}
kotlin.runCatching {
val oldBook = book.copy()
if (book.tocUrl.isBlank()) {
@@ -210,13 +223,24 @@ class MainViewModel(application: Application) : BaseViewModel(application) {
* 缓存书籍
*/
private fun cacheBook() {
//开始缓存前,通知监听事件的书源,书架刷新已完成
eventListenerSource.toList().forEach {
SourceCallBack.callBackSource(
viewModelScope,
SourceCallBack.END_SHELF_REFRESH,
it.first
)
}
eventListenerSource.clear()
if (AppConfig.preDownloadNum == 0) return
cacheBookJob?.cancel()
cacheBookJob = viewModelScope.launch(upTocPool) {
launch {
while (isActive && CacheBook.isRun) {
val isOnUpTocBooksEmpty =
onUpTocBooks.isEmpty()
//有目录更新是不缓存,优先更新目录,现在更多网站限制并发
CacheBook.setWorkingState(waitUpTocBooks.isEmpty() && onUpTocBooks.isEmpty())
CacheBook.setWorkingState(waitUpTocBooks.isEmpty() && isOnUpTocBooksEmpty)
delay(1000)
}
}