Update parsers and migrate to float chapter numbers
This commit is contained in:
@@ -82,7 +82,7 @@ afterEvaluate {
|
|||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
//noinspection GradleDependency
|
//noinspection GradleDependency
|
||||||
implementation('com.github.KotatsuApp:kotatsu-parsers:8852d1e22e') {
|
implementation('com.github.KotatsuApp:kotatsu-parsers:a8f9423307') {
|
||||||
exclude group: 'org.json', module: 'json'
|
exclude group: 'org.json', module: 'json'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ import org.koitharu.kotatsu.parsers.model.MangaChapter
|
|||||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaState
|
import org.koitharu.kotatsu.parsers.model.MangaState
|
||||||
import org.koitharu.kotatsu.parsers.util.mapToSet
|
import org.koitharu.kotatsu.parsers.util.mapToSet
|
||||||
|
import java.text.DecimalFormat
|
||||||
|
import java.text.DecimalFormatSymbols
|
||||||
import com.google.android.material.R as materialR
|
import com.google.android.material.R as materialR
|
||||||
|
|
||||||
@JvmName("mangaIds")
|
@JvmName("mangaIds")
|
||||||
@@ -113,3 +115,16 @@ val Manga.appUrl: Uri
|
|||||||
.appendQueryParameter("name", title)
|
.appendQueryParameter("name", title)
|
||||||
.appendQueryParameter("url", url)
|
.appendQueryParameter("url", url)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
|
private val chaptersNumberFormat = DecimalFormat("#.#").also { f ->
|
||||||
|
f.decimalFormatSymbols = DecimalFormatSymbols.getInstance().also {
|
||||||
|
it.decimalSeparator = '.'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun MangaChapter.formatNumber(): String? {
|
||||||
|
if (number <= 0f) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
return chaptersNumberFormat.format(number.toDouble())
|
||||||
|
}
|
||||||
|
|||||||
@@ -19,7 +19,8 @@ data class ParcelableChapter(
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = parcel.readLong(),
|
id = parcel.readLong(),
|
||||||
name = parcel.readString().orEmpty(),
|
name = parcel.readString().orEmpty(),
|
||||||
number = parcel.readInt(),
|
number = parcel.readFloat(),
|
||||||
|
volume = parcel.readInt(),
|
||||||
url = parcel.readString().orEmpty(),
|
url = parcel.readString().orEmpty(),
|
||||||
scanlator = parcel.readString(),
|
scanlator = parcel.readString(),
|
||||||
uploadDate = parcel.readLong(),
|
uploadDate = parcel.readLong(),
|
||||||
@@ -31,7 +32,8 @@ data class ParcelableChapter(
|
|||||||
override fun ParcelableChapter.write(parcel: Parcel, flags: Int) = with(chapter) {
|
override fun ParcelableChapter.write(parcel: Parcel, flags: Int) = with(chapter) {
|
||||||
parcel.writeLong(id)
|
parcel.writeLong(id)
|
||||||
parcel.writeString(name)
|
parcel.writeString(name)
|
||||||
parcel.writeInt(number)
|
parcel.writeFloat(number)
|
||||||
|
parcel.writeInt(volume)
|
||||||
parcel.writeString(url)
|
parcel.writeString(url)
|
||||||
parcel.writeString(scanlator)
|
parcel.writeString(scanlator)
|
||||||
parcel.writeLong(uploadDate)
|
parcel.writeLong(uploadDate)
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package org.koitharu.kotatsu.details.ui.model
|
|||||||
|
|
||||||
import android.text.format.DateUtils
|
import android.text.format.DateUtils
|
||||||
import org.jsoup.internal.StringUtil.StringJoiner
|
import org.jsoup.internal.StringUtil.StringJoiner
|
||||||
|
import org.koitharu.kotatsu.core.model.formatNumber
|
||||||
import org.koitharu.kotatsu.list.ui.model.ListModel
|
import org.koitharu.kotatsu.list.ui.model.ListModel
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaChapter
|
import org.koitharu.kotatsu.parsers.model.MangaChapter
|
||||||
|
|
||||||
@@ -49,8 +50,8 @@ data class ChapterListItem(
|
|||||||
|
|
||||||
private fun buildDescription(): String {
|
private fun buildDescription(): String {
|
||||||
val joiner = StringJoiner(" • ")
|
val joiner = StringJoiner(" • ")
|
||||||
if (chapter.number != 0) {
|
chapter.formatNumber()?.let {
|
||||||
joiner.add("#").append(chapter.number.toString())
|
joiner.add("#").append(it)
|
||||||
}
|
}
|
||||||
uploadDate?.let { date ->
|
uploadDate?.let { date ->
|
||||||
joiner.add(date.toString())
|
joiner.add(date.toString())
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import kotlinx.coroutines.plus
|
|||||||
import kotlinx.coroutines.sync.Mutex
|
import kotlinx.coroutines.sync.Mutex
|
||||||
import kotlinx.coroutines.sync.withLock
|
import kotlinx.coroutines.sync.withLock
|
||||||
import org.koitharu.kotatsu.R
|
import org.koitharu.kotatsu.R
|
||||||
|
import org.koitharu.kotatsu.core.model.formatNumber
|
||||||
import org.koitharu.kotatsu.core.parser.MangaDataRepository
|
import org.koitharu.kotatsu.core.parser.MangaDataRepository
|
||||||
import org.koitharu.kotatsu.core.parser.MangaRepository
|
import org.koitharu.kotatsu.core.parser.MangaRepository
|
||||||
import org.koitharu.kotatsu.core.parser.RemoteMangaRepository
|
import org.koitharu.kotatsu.core.parser.RemoteMangaRepository
|
||||||
@@ -306,7 +307,7 @@ class DownloadsViewModel @Inject constructor(
|
|||||||
return chapters.mapNotNullTo(ArrayList(size)) {
|
return chapters.mapNotNullTo(ArrayList(size)) {
|
||||||
if (chapterIds == null || it.id in chapterIds) {
|
if (chapterIds == null || it.id in chapterIds) {
|
||||||
DownloadChapter(
|
DownloadChapter(
|
||||||
number = it.number,
|
number = it.formatNumber(),
|
||||||
name = it.name,
|
name = it.name,
|
||||||
isDownloaded = it.id in localChapters,
|
isDownloaded = it.id in localChapters,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import org.koitharu.kotatsu.list.ui.ListModelDiffCallback
|
|||||||
import org.koitharu.kotatsu.list.ui.model.ListModel
|
import org.koitharu.kotatsu.list.ui.model.ListModel
|
||||||
|
|
||||||
data class DownloadChapter(
|
data class DownloadChapter(
|
||||||
val number: Int,
|
val number: String?,
|
||||||
val name: String,
|
val name: String,
|
||||||
val isDownloaded: Boolean,
|
val isDownloaded: Boolean,
|
||||||
) : ListModel {
|
) : ListModel {
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ import org.koitharu.kotatsu.parsers.model.MangaState
|
|||||||
import org.koitharu.kotatsu.parsers.model.MangaTag
|
import org.koitharu.kotatsu.parsers.model.MangaTag
|
||||||
import org.koitharu.kotatsu.parsers.util.find
|
import org.koitharu.kotatsu.parsers.util.find
|
||||||
import org.koitharu.kotatsu.parsers.util.json.getBooleanOrDefault
|
import org.koitharu.kotatsu.parsers.util.json.getBooleanOrDefault
|
||||||
|
import org.koitharu.kotatsu.parsers.util.json.getFloatOrDefault
|
||||||
|
import org.koitharu.kotatsu.parsers.util.json.getIntOrDefault
|
||||||
import org.koitharu.kotatsu.parsers.util.json.getLongOrDefault
|
import org.koitharu.kotatsu.parsers.util.json.getLongOrDefault
|
||||||
import org.koitharu.kotatsu.parsers.util.json.getStringOrNull
|
import org.koitharu.kotatsu.parsers.util.json.getStringOrNull
|
||||||
import org.koitharu.kotatsu.parsers.util.json.mapJSONToSet
|
import org.koitharu.kotatsu.parsers.util.json.mapJSONToSet
|
||||||
@@ -91,6 +93,7 @@ class MangaIndex(source: String?) {
|
|||||||
if (!chapters.has(chapter.id.toString())) {
|
if (!chapters.has(chapter.id.toString())) {
|
||||||
val jo = JSONObject()
|
val jo = JSONObject()
|
||||||
jo.put("number", chapter.number)
|
jo.put("number", chapter.number)
|
||||||
|
jo.put("volume", chapter.volume)
|
||||||
jo.put("url", chapter.url)
|
jo.put("url", chapter.url)
|
||||||
jo.put("name", chapter.name)
|
jo.put("name", chapter.name)
|
||||||
jo.put("uploadDate", chapter.uploadDate)
|
jo.put("uploadDate", chapter.uploadDate)
|
||||||
@@ -162,7 +165,8 @@ class MangaIndex(source: String?) {
|
|||||||
id = k.toLong(),
|
id = k.toLong(),
|
||||||
name = v.getString("name"),
|
name = v.getString("name"),
|
||||||
url = v.getString("url"),
|
url = v.getString("url"),
|
||||||
number = v.getInt("number"),
|
number = v.getFloatOrDefault("number", 0f),
|
||||||
|
volume = v.getIntOrDefault("volume", 0),
|
||||||
uploadDate = v.getLongOrDefault("uploadDate", 0L),
|
uploadDate = v.getLongOrDefault("uploadDate", 0L),
|
||||||
scanlator = v.getStringOrNull("scanlator"),
|
scanlator = v.getStringOrNull("scanlator"),
|
||||||
branch = v.getStringOrNull("branch"),
|
branch = v.getStringOrNull("branch"),
|
||||||
|
|||||||
@@ -71,7 +71,8 @@ class LocalMangaDirInput(root: File) : LocalMangaInput(root) {
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = "$i${f.name}".longHashCode(),
|
id = "$i${f.name}".longHashCode(),
|
||||||
name = f.nameWithoutExtension.toHumanReadable(),
|
name = f.nameWithoutExtension.toHumanReadable(),
|
||||||
number = i + 1,
|
number = 0f,
|
||||||
|
volume = 0,
|
||||||
source = MangaSource.LOCAL,
|
source = MangaSource.LOCAL,
|
||||||
uploadDate = f.creationTime,
|
uploadDate = f.creationTime,
|
||||||
url = f.toUri().toString(),
|
url = f.toUri().toString(),
|
||||||
|
|||||||
@@ -100,6 +100,7 @@ sealed class LocalMangaInput(
|
|||||||
id = id,
|
id = id,
|
||||||
name = name,
|
name = name,
|
||||||
number = number,
|
number = number,
|
||||||
|
volume = volume,
|
||||||
url = url,
|
url = url,
|
||||||
scanlator = scanlator,
|
scanlator = scanlator,
|
||||||
uploadDate = uploadDate,
|
uploadDate = uploadDate,
|
||||||
|
|||||||
@@ -76,7 +76,8 @@ class LocalMangaZipInput(root: File) : LocalMangaInput(root) {
|
|||||||
MangaChapter(
|
MangaChapter(
|
||||||
id = "$i$s".longHashCode(),
|
id = "$i$s".longHashCode(),
|
||||||
name = s.ifEmpty { title },
|
name = s.ifEmpty { title },
|
||||||
number = i + 1,
|
number = 0f,
|
||||||
|
volume = 0,
|
||||||
source = MangaSource.LOCAL,
|
source = MangaSource.LOCAL,
|
||||||
uploadDate = 0L,
|
uploadDate = 0L,
|
||||||
url = uriBuilder.fragment(s).build().toString(),
|
url = uriBuilder.fragment(s).build().toString(),
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ import org.koitharu.kotatsu.history.data.PROGRESS_NONE
|
|||||||
import org.koitharu.kotatsu.history.domain.HistoryUpdateUseCase
|
import org.koitharu.kotatsu.history.domain.HistoryUpdateUseCase
|
||||||
import org.koitharu.kotatsu.parsers.model.Manga
|
import org.koitharu.kotatsu.parsers.model.Manga
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaPage
|
import org.koitharu.kotatsu.parsers.model.MangaPage
|
||||||
|
import org.koitharu.kotatsu.parsers.util.assertNotNull
|
||||||
import org.koitharu.kotatsu.reader.domain.ChaptersLoader
|
import org.koitharu.kotatsu.reader.domain.ChaptersLoader
|
||||||
import org.koitharu.kotatsu.reader.domain.DetectReaderModeUseCase
|
import org.koitharu.kotatsu.reader.domain.DetectReaderModeUseCase
|
||||||
import org.koitharu.kotatsu.reader.domain.PageLoader
|
import org.koitharu.kotatsu.reader.domain.PageLoader
|
||||||
@@ -381,18 +382,20 @@ class ReaderViewModel @Inject constructor(
|
|||||||
|
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
private fun notifyStateChanged() {
|
private fun notifyStateChanged() {
|
||||||
val state = getCurrentState()
|
val state = getCurrentState().assertNotNull("state") ?: return
|
||||||
val chapter = state?.chapterId?.let { chaptersLoader.peekChapter(it) }
|
val chapter = chaptersLoader.peekChapter(state.chapterId).assertNotNull("chapter") ?: return
|
||||||
|
val m = manga.assertNotNull("manga") ?: return
|
||||||
|
val chapterIndex = m.chapters[chapter.branch]?.indexOf(chapter) ?: -1
|
||||||
val newState = ReaderUiState(
|
val newState = ReaderUiState(
|
||||||
mangaName = manga?.toManga()?.title,
|
mangaName = m.toManga().title,
|
||||||
branch = chapter?.branch,
|
branch = chapter.branch,
|
||||||
chapterName = chapter?.name,
|
chapterName = chapter.name,
|
||||||
chapterNumber = chapter?.number ?: 0,
|
chapterNumber = chapterIndex + 1,
|
||||||
chaptersTotal = manga?.chapters?.get(chapter?.branch)?.size ?: 0,
|
chaptersTotal = m.chapters[chapter.branch]?.size ?: 0,
|
||||||
totalPages = if (chapter != null) chaptersLoader.getPagesCount(chapter.id) else 0,
|
totalPages = chaptersLoader.getPagesCount(chapter.id),
|
||||||
currentPage = state?.page ?: 0,
|
currentPage = state.page,
|
||||||
isSliderEnabled = settings.isReaderSliderEnabled,
|
isSliderEnabled = settings.isReaderSliderEnabled,
|
||||||
percent = if (state != null) computePercent(state.chapterId, state.page) else PROGRESS_NONE,
|
percent = computePercent(state.chapterId, state.page),
|
||||||
)
|
)
|
||||||
uiState.value = newState
|
uiState.value = newState
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user