Update parsers and migrate to float chapter numbers

This commit is contained in:
Koitharu
2024-01-22 17:11:00 +02:00
parent 83cb35fe6e
commit 5d9a59d577
11 changed files with 49 additions and 20 deletions

View File

@@ -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'
} }

View File

@@ -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())
}

View File

@@ -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)

View File

@@ -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())

View File

@@ -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,
) )

View File

@@ -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 {

View File

@@ -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"),

View File

@@ -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(),

View File

@@ -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,

View File

@@ -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(),

View File

@@ -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
} }