添加单章换源
This commit is contained in:
@@ -265,29 +265,20 @@ object BookHelp {
|
|||||||
*/
|
*/
|
||||||
fun getDurChapter(
|
fun getDurChapter(
|
||||||
oldDurChapterIndex: Int,
|
oldDurChapterIndex: Int,
|
||||||
oldChapterListSize: Int,
|
|
||||||
oldDurChapterName: String?,
|
oldDurChapterName: String?,
|
||||||
newChapterList: List<BookChapter>
|
newChapterList: List<BookChapter>,
|
||||||
|
oldChapterListSize: Int = 0
|
||||||
): Int {
|
): Int {
|
||||||
if (oldChapterListSize == 0) return oldDurChapterIndex
|
if (oldDurChapterIndex == 0) return oldDurChapterIndex
|
||||||
if (newChapterList.isEmpty()) return oldDurChapterIndex
|
if (newChapterList.isEmpty()) return oldDurChapterIndex
|
||||||
val oldChapterNum = getChapterNum(oldDurChapterName)
|
val oldChapterNum = getChapterNum(oldDurChapterName)
|
||||||
val oldName = getPureChapterName(oldDurChapterName)
|
val oldName = getPureChapterName(oldDurChapterName)
|
||||||
val newChapterSize = newChapterList.size
|
val newChapterSize = newChapterList.size
|
||||||
val min = max(
|
val durIndex =
|
||||||
0,
|
if (oldChapterListSize == 0) oldDurChapterIndex
|
||||||
min(
|
else oldDurChapterIndex * oldChapterListSize / newChapterSize
|
||||||
oldDurChapterIndex,
|
val min = max(0, min(oldDurChapterIndex, durIndex) - 10)
|
||||||
oldDurChapterIndex - oldChapterListSize + newChapterSize
|
val max = min(newChapterSize - 1, max(oldDurChapterIndex, durIndex) + 10)
|
||||||
) - 10
|
|
||||||
)
|
|
||||||
val max = min(
|
|
||||||
newChapterSize - 1,
|
|
||||||
max(
|
|
||||||
oldDurChapterIndex,
|
|
||||||
oldDurChapterIndex - oldChapterListSize + newChapterSize
|
|
||||||
) + 10
|
|
||||||
)
|
|
||||||
var nameSim = 0.0
|
var nameSim = 0.0
|
||||||
var newIndex = 0
|
var newIndex = 0
|
||||||
var newNum = 0
|
var newNum = 0
|
||||||
|
|||||||
@@ -116,9 +116,9 @@ class AudioPlayViewModel(application: Application) : BaseViewModel(application)
|
|||||||
execute {
|
execute {
|
||||||
book.durChapterIndex = BookHelp.getDurChapter(
|
book.durChapterIndex = BookHelp.getDurChapter(
|
||||||
book.durChapterIndex,
|
book.durChapterIndex,
|
||||||
oldTocSize,
|
|
||||||
book.durChapterTitle,
|
book.durChapterTitle,
|
||||||
chapters
|
chapters,
|
||||||
|
oldTocSize
|
||||||
)
|
)
|
||||||
book.durChapterTitle = chapters[book.durChapterIndex].title
|
book.durChapterTitle = chapters[book.durChapterIndex].title
|
||||||
appDb.bookDao.update(book)
|
appDb.bookDao.update(book)
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import io.legado.app.data.entities.BookSource
|
|||||||
import io.legado.app.data.entities.SearchBook
|
import io.legado.app.data.entities.SearchBook
|
||||||
import io.legado.app.databinding.DialogChapterChangeSourceBinding
|
import io.legado.app.databinding.DialogChapterChangeSourceBinding
|
||||||
import io.legado.app.help.AppConfig
|
import io.legado.app.help.AppConfig
|
||||||
|
import io.legado.app.help.BookHelp
|
||||||
import io.legado.app.lib.theme.primaryColor
|
import io.legado.app.lib.theme.primaryColor
|
||||||
import io.legado.app.ui.book.source.edit.BookSourceEditActivity
|
import io.legado.app.ui.book.source.edit.BookSourceEditActivity
|
||||||
import io.legado.app.ui.book.source.manage.BookSourceActivity
|
import io.legado.app.ui.book.source.manage.BookSourceActivity
|
||||||
@@ -53,6 +54,16 @@ class ChangeChapterSourceDialog() : BaseDialogFragment(R.layout.dialog_chapter_c
|
|||||||
registerForActivityResult(StartActivityContract(BookSourceEditActivity::class.java)) {
|
registerForActivityResult(StartActivityContract(BookSourceEditActivity::class.java)) {
|
||||||
viewModel.startSearch()
|
viewModel.startSearch()
|
||||||
}
|
}
|
||||||
|
private val tocSuccess: (toc: List<BookChapter>) -> Unit = {
|
||||||
|
tocAdapter.durChapterIndex =
|
||||||
|
BookHelp.getDurChapter(viewModel.chapterIndex, viewModel.chapterTitle, it)
|
||||||
|
binding.loadingToc.hide()
|
||||||
|
tocAdapter.setItems(it)
|
||||||
|
binding.recyclerViewToc.scrollToPosition(tocAdapter.durChapterIndex - 5)
|
||||||
|
}
|
||||||
|
private val contentSuccess: (content: String) -> Unit = {
|
||||||
|
callBack?.replaceContent(it)
|
||||||
|
}
|
||||||
private val searchBookAdapter by lazy {
|
private val searchBookAdapter by lazy {
|
||||||
ChangeChapterSourceAdapter(requireContext(), viewModel, this)
|
ChangeChapterSourceAdapter(requireContext(), viewModel, this)
|
||||||
}
|
}
|
||||||
@@ -211,13 +222,6 @@ class ChangeChapterSourceDialog() : BaseDialogFragment(R.layout.dialog_chapter_c
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
private val tocSuccess: (toc: List<BookChapter>) -> Unit = {
|
|
||||||
tocAdapter.durChapterIndex = viewModel.chapterIndex
|
|
||||||
binding.loadingToc.hide()
|
|
||||||
tocAdapter.setItems(it)
|
|
||||||
binding.recyclerViewToc.scrollToPosition(tocAdapter.durChapterIndex - 5)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun openToc(searchBook: SearchBook) {
|
override fun openToc(searchBook: SearchBook) {
|
||||||
this.searchBook = searchBook
|
this.searchBook = searchBook
|
||||||
tocAdapter.setItems(null)
|
tocAdapter.setItems(null)
|
||||||
@@ -259,8 +263,12 @@ class ChangeChapterSourceDialog() : BaseDialogFragment(R.layout.dialog_chapter_c
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun clickChapter(bookChapter: BookChapter) {
|
override fun clickChapter(bookChapter: BookChapter, nextChapterUrl: String?) {
|
||||||
TODO("Not yet implemented")
|
searchBook?.let {
|
||||||
|
viewModel.getContent(it.toBook(), bookChapter, nextChapterUrl, contentSuccess) { msg ->
|
||||||
|
toastOnUi(msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun changeSource(searchBook: SearchBook) {
|
private fun changeSource(searchBook: SearchBook) {
|
||||||
|
|||||||
@@ -294,6 +294,24 @@ class ChangeChapterSourceViewModel(application: Application) : BaseViewModel(app
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun getContent(
|
||||||
|
book: Book,
|
||||||
|
chapter: BookChapter,
|
||||||
|
nextChapterUrl: String?,
|
||||||
|
success: (content: String) -> Unit,
|
||||||
|
error: (msg: String) -> Unit
|
||||||
|
) {
|
||||||
|
execute {
|
||||||
|
val bookSource = appDb.bookSourceDao.getBookSource(book.origin)
|
||||||
|
?: throw NoStackTraceException("书源不存在")
|
||||||
|
WebBook.getContentAwait(this, bookSource, book, chapter, nextChapterUrl, false)
|
||||||
|
}.onSuccess {
|
||||||
|
success.invoke(it)
|
||||||
|
}.onError {
|
||||||
|
error.invoke(it.localizedMessage ?: "获取正文出错")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun disableSource(searchBook: SearchBook) {
|
fun disableSource(searchBook: SearchBook) {
|
||||||
execute {
|
execute {
|
||||||
appDb.bookSourceDao.getBookSource(searchBook.origin)?.let { source ->
|
appDb.bookSourceDao.getBookSource(searchBook.origin)?.let { source ->
|
||||||
|
|||||||
@@ -59,12 +59,12 @@ class ChangeChapterTocAdapter(context: Context, val callback: Callback) :
|
|||||||
override fun registerListener(holder: ItemViewHolder, binding: ItemChapterListBinding) {
|
override fun registerListener(holder: ItemViewHolder, binding: ItemChapterListBinding) {
|
||||||
holder.itemView.setOnClickListener {
|
holder.itemView.setOnClickListener {
|
||||||
getItem(holder.layoutPosition)?.let {
|
getItem(holder.layoutPosition)?.let {
|
||||||
callback.clickChapter(it)
|
callback.clickChapter(it, getItem(holder.layoutPosition + 1)?.url)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Callback {
|
interface Callback {
|
||||||
fun clickChapter(bookChapter: BookChapter)
|
fun clickChapter(bookChapter: BookChapter, nextChapterUrl: String?)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -195,9 +195,9 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
execute {
|
execute {
|
||||||
book.durChapterIndex = BookHelp.getDurChapter(
|
book.durChapterIndex = BookHelp.getDurChapter(
|
||||||
book.durChapterIndex,
|
book.durChapterIndex,
|
||||||
oldTocSize,
|
|
||||||
book.durChapterTitle,
|
book.durChapterTitle,
|
||||||
chapters
|
chapters,
|
||||||
|
oldTocSize
|
||||||
)
|
)
|
||||||
book.durChapterTitle = chapters[book.durChapterIndex].title
|
book.durChapterTitle = chapters[book.durChapterIndex].title
|
||||||
if (inBookshelf) {
|
if (inBookshelf) {
|
||||||
|
|||||||
@@ -185,9 +185,9 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
|
|||||||
val oldBook = ReadBook.book!!
|
val oldBook = ReadBook.book!!
|
||||||
book.durChapterIndex = BookHelp.getDurChapter(
|
book.durChapterIndex = BookHelp.getDurChapter(
|
||||||
oldBook.durChapterIndex,
|
oldBook.durChapterIndex,
|
||||||
oldBook.totalChapterNum,
|
|
||||||
oldBook.durChapterTitle,
|
oldBook.durChapterTitle,
|
||||||
chapters
|
chapters,
|
||||||
|
oldBook.totalChapterNum
|
||||||
)
|
)
|
||||||
book.durChapterTitle = chapters[book.durChapterIndex].title
|
book.durChapterTitle = chapters[book.durChapterIndex].title
|
||||||
oldBook.changeTo(book)
|
oldBook.changeTo(book)
|
||||||
|
|||||||
@@ -60,8 +60,8 @@
|
|||||||
|
|
||||||
<io.legado.app.ui.widget.anima.RotateLoading
|
<io.legado.app.ui.widget.anima.RotateLoading
|
||||||
android:id="@+id/loading_toc"
|
android:id="@+id/loading_toc"
|
||||||
android:layout_width="36dp"
|
android:layout_width="48dp"
|
||||||
android:layout_height="36dp"
|
android:layout_height="48dp"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
app:layout_constraintTop_toTopOf="@+id/recycler_view_toc"
|
app:layout_constraintTop_toTopOf="@+id/recycler_view_toc"
|
||||||
app:layout_constraintLeft_toLeftOf="@+id/recycler_view_toc"
|
app:layout_constraintLeft_toLeftOf="@+id/recycler_view_toc"
|
||||||
|
|||||||
Reference in New Issue
Block a user