mirror of
https://github.com/null2264/yokai.git
synced 2025-06-21 10:44:42 +00:00
change Track.last_chapter_read to Float
each TrackService can convert it to Int if decimal chapters are not supported Co-Authored-By: Gauthier <2139133+gotson@users.noreply.github.com>
This commit is contained in:
parent
4b8dbc17fb
commit
25ba20cd2a
30 changed files with 131 additions and 101 deletions
|
@ -33,7 +33,7 @@ data class BackupTracking(
|
|||
library_id = this@BackupTracking.libraryId
|
||||
title = this@BackupTracking.title
|
||||
// convert from float to int because of 1.x types
|
||||
last_chapter_read = this@BackupTracking.lastChapterRead.toInt()
|
||||
last_chapter_read = this@BackupTracking.lastChapterRead
|
||||
total_chapters = this@BackupTracking.totalChapters
|
||||
score = this@BackupTracking.score
|
||||
status = this@BackupTracking.status
|
||||
|
@ -52,7 +52,7 @@ data class BackupTracking(
|
|||
libraryId = track.library_id!!,
|
||||
title = track.title,
|
||||
// convert to float for 1.x
|
||||
lastChapterRead = track.last_chapter_read.toFloat(),
|
||||
lastChapterRead = track.last_chapter_read,
|
||||
totalChapters = track.total_chapters,
|
||||
score = track.score,
|
||||
status = track.status,
|
||||
|
|
|
@ -46,7 +46,7 @@ object TrackTypeAdapter {
|
|||
SYNC -> track.sync_id = nextInt()
|
||||
MEDIA -> track.media_id = nextInt()
|
||||
LIBRARY -> track.library_id = nextLong()
|
||||
LAST_READ -> track.last_chapter_read = nextInt()
|
||||
LAST_READ -> track.last_chapter_read = nextInt().toFloat()
|
||||
TRACKING_URL -> track.tracking_url = nextString()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@ class DbOpenCallback : SupportSQLiteOpenHelper.Callback(DATABASE_VERSION) {
|
|||
/**
|
||||
* Version of the database.
|
||||
*/
|
||||
const val DATABASE_VERSION = 14
|
||||
const val DATABASE_VERSION = 15
|
||||
}
|
||||
|
||||
override fun onCreate(db: SupportSQLiteDatabase) = with(db) {
|
||||
|
@ -90,6 +90,12 @@ class DbOpenCallback : SupportSQLiteOpenHelper.Callback(DATABASE_VERSION) {
|
|||
if (oldVersion < 14) {
|
||||
db.execSQL(MangaTable.addFilteredScanlators)
|
||||
}
|
||||
if (oldVersion < 15) {
|
||||
db.execSQL(TrackTable.renameTableToTemp)
|
||||
db.execSQL(TrackTable.createTableQuery)
|
||||
db.execSQL(TrackTable.insertFromTempTable)
|
||||
db.execSQL(TrackTable.dropTempTable)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onConfigure(db: SupportSQLiteDatabase) {
|
||||
|
|
|
@ -64,19 +64,19 @@ class TrackPutResolver : DefaultPutResolver<Track>() {
|
|||
class TrackGetResolver : DefaultGetResolver<Track>() {
|
||||
|
||||
override fun mapFromCursor(cursor: Cursor): Track = TrackImpl().apply {
|
||||
id = cursor.getLong(cursor.getColumnIndex(COL_ID))
|
||||
manga_id = cursor.getLong(cursor.getColumnIndex(COL_MANGA_ID))
|
||||
sync_id = cursor.getInt(cursor.getColumnIndex(COL_SYNC_ID))
|
||||
media_id = cursor.getInt(cursor.getColumnIndex(COL_MEDIA_ID))
|
||||
library_id = cursor.getLong(cursor.getColumnIndex(COL_LIBRARY_ID))
|
||||
title = cursor.getString(cursor.getColumnIndex(COL_TITLE))
|
||||
last_chapter_read = cursor.getInt(cursor.getColumnIndex(COL_LAST_CHAPTER_READ))
|
||||
total_chapters = cursor.getInt(cursor.getColumnIndex(COL_TOTAL_CHAPTERS))
|
||||
status = cursor.getInt(cursor.getColumnIndex(COL_STATUS))
|
||||
score = cursor.getFloat(cursor.getColumnIndex(COL_SCORE))
|
||||
tracking_url = cursor.getString(cursor.getColumnIndex(COL_TRACKING_URL))
|
||||
started_reading_date = cursor.getLong(cursor.getColumnIndex(COL_START_DATE))
|
||||
finished_reading_date = cursor.getLong(cursor.getColumnIndex(COL_FINISH_DATE))
|
||||
id = cursor.getLong(cursor.getColumnIndexOrThrow(COL_ID))
|
||||
manga_id = cursor.getLong(cursor.getColumnIndexOrThrow(COL_MANGA_ID))
|
||||
sync_id = cursor.getInt(cursor.getColumnIndexOrThrow(COL_SYNC_ID))
|
||||
media_id = cursor.getInt(cursor.getColumnIndexOrThrow(COL_MEDIA_ID))
|
||||
library_id = cursor.getLong(cursor.getColumnIndexOrThrow(COL_LIBRARY_ID))
|
||||
title = cursor.getString(cursor.getColumnIndexOrThrow(COL_TITLE))
|
||||
last_chapter_read = cursor.getFloat(cursor.getColumnIndexOrThrow(COL_LAST_CHAPTER_READ))
|
||||
total_chapters = cursor.getInt(cursor.getColumnIndexOrThrow(COL_TOTAL_CHAPTERS))
|
||||
status = cursor.getInt(cursor.getColumnIndexOrThrow(COL_STATUS))
|
||||
score = cursor.getFloat(cursor.getColumnIndexOrThrow(COL_SCORE))
|
||||
tracking_url = cursor.getString(cursor.getColumnIndexOrThrow(COL_TRACKING_URL))
|
||||
started_reading_date = cursor.getLong(cursor.getColumnIndexOrThrow(COL_START_DATE))
|
||||
finished_reading_date = cursor.getLong(cursor.getColumnIndexOrThrow(COL_FINISH_DATE))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ interface Track : Serializable {
|
|||
|
||||
var title: String
|
||||
|
||||
var last_chapter_read: Int
|
||||
var last_chapter_read: Float
|
||||
|
||||
var total_chapters: Int
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@ class TrackImpl : Track {
|
|||
|
||||
override lateinit var title: String
|
||||
|
||||
override var last_chapter_read: Int = 0
|
||||
override var last_chapter_read: Float = 0f
|
||||
|
||||
override var total_chapters: Int = 0
|
||||
|
||||
|
|
|
@ -39,7 +39,7 @@ object TrackTable {
|
|||
$COL_MEDIA_ID INTEGER NOT NULL,
|
||||
$COL_LIBRARY_ID INTEGER,
|
||||
$COL_TITLE TEXT NOT NULL,
|
||||
$COL_LAST_CHAPTER_READ INTEGER NOT NULL,
|
||||
$COL_LAST_CHAPTER_READ REAL NOT NULL,
|
||||
$COL_TOTAL_CHAPTERS INTEGER NOT NULL,
|
||||
$COL_STATUS INTEGER NOT NULL,
|
||||
$COL_SCORE FLOAT NOT NULL,
|
||||
|
@ -62,4 +62,19 @@ object TrackTable {
|
|||
|
||||
val addFinishDate: String
|
||||
get() = "ALTER TABLE $TABLE ADD COLUMN $COL_FINISH_DATE LONG NOT NULL DEFAULT 0"
|
||||
|
||||
val renameTableToTemp: String
|
||||
get() =
|
||||
"ALTER TABLE $TABLE RENAME TO ${TABLE}_tmp"
|
||||
|
||||
val insertFromTempTable: String
|
||||
get() =
|
||||
"""
|
||||
|INSERT INTO $TABLE($COL_ID,$COL_MANGA_ID,$COL_SYNC_ID,$COL_MEDIA_ID,$COL_LIBRARY_ID,$COL_TITLE,$COL_LAST_CHAPTER_READ,$COL_TOTAL_CHAPTERS,$COL_STATUS,$COL_SCORE,$COL_TRACKING_URL,$COL_START_DATE,$COL_FINISH_DATE)
|
||||
|SELECT $COL_ID,$COL_MANGA_ID,$COL_SYNC_ID,$COL_MEDIA_ID,$COL_LIBRARY_ID,$COL_TITLE,$COL_LAST_CHAPTER_READ,$COL_TOTAL_CHAPTERS,$COL_STATUS,$COL_SCORE,$COL_TRACKING_URL,$COL_START_DATE,$COL_FINISH_DATE
|
||||
|FROM ${TABLE}_tmp
|
||||
""".trimMargin()
|
||||
|
||||
val dropTempTable: String
|
||||
get() = "DROP TABLE ${TABLE}_tmp"
|
||||
}
|
||||
|
|
|
@ -32,7 +32,7 @@ class DelayedTrackingUpdateJob(context: Context, workerParams: WorkerParameters)
|
|||
} else {
|
||||
val mangaId = items[0].toLongOrNull() ?: return@mapNotNull null
|
||||
val trackId = items[1].toIntOrNull() ?: return@mapNotNull null
|
||||
val chapterNumber = items[2].toIntOrNull() ?: return@mapNotNull null
|
||||
val chapterNumber = items[2].toFloatOrNull() ?: return@mapNotNull null
|
||||
mangaId to (trackId to chapterNumber)
|
||||
}
|
||||
}.groupBy { it.first }
|
||||
|
|
|
@ -38,6 +38,8 @@ abstract class TrackService(val id: Int) {
|
|||
abstract fun isCompletedStatus(index: Int): Boolean
|
||||
|
||||
abstract fun completedStatus(): Int
|
||||
abstract fun readingStatus(): Int
|
||||
abstract fun planningStatus(): Int
|
||||
|
||||
abstract fun getStatus(status: Int): String
|
||||
|
||||
|
@ -53,7 +55,7 @@ abstract class TrackService(val id: Int) {
|
|||
|
||||
abstract suspend fun add(track: Track): Track
|
||||
|
||||
abstract suspend fun update(track: Track, setToReadStatus: Boolean = false): Track
|
||||
abstract suspend fun update(track: Track, setToRead: Boolean = false): Track
|
||||
|
||||
abstract suspend fun bind(track: Track): Track
|
||||
|
||||
|
@ -65,6 +67,24 @@ abstract class TrackService(val id: Int) {
|
|||
|
||||
open suspend fun removeFromService(track: Track): Boolean = false
|
||||
|
||||
open fun updateTrackStatus(
|
||||
track: Track,
|
||||
setToReadStatus: Boolean,
|
||||
setToComplete: Boolean = false,
|
||||
mustReadToComplete: Boolean = false,
|
||||
) {
|
||||
if (setToReadStatus && track.status == planningStatus() && track.last_chapter_read != 0f) {
|
||||
track.status = readingStatus()
|
||||
}
|
||||
if (setToComplete &&
|
||||
(!mustReadToComplete || track.status == readingStatus()) &&
|
||||
track.total_chapters != 0 &&
|
||||
track.last_chapter_read.toInt() == track.total_chapters
|
||||
) {
|
||||
track.status = completedStatus()
|
||||
}
|
||||
}
|
||||
|
||||
@CallSuper
|
||||
open fun logout() {
|
||||
preferences.setTrackCredentials(this, "", "")
|
||||
|
@ -92,9 +112,9 @@ suspend fun TrackService.updateNewTrackInfo(track: Track, planningStatus: Int) {
|
|||
track.finished_reading_date = getCompletedDate(track, allRead)
|
||||
}
|
||||
track.last_chapter_read = getLastChapterRead(track).takeUnless {
|
||||
it == 0 && allRead
|
||||
} ?: 1
|
||||
if (track.last_chapter_read == 0) {
|
||||
it == 0f && allRead
|
||||
} ?: 1f
|
||||
if (track.last_chapter_read == 0f) {
|
||||
track.status = planningStatus
|
||||
}
|
||||
if (allRead) {
|
||||
|
@ -120,8 +140,8 @@ suspend fun TrackService.getCompletedDate(track: Track, allRead: Boolean): Long
|
|||
return 0L
|
||||
}
|
||||
|
||||
suspend fun TrackService.getLastChapterRead(track: Track): Int {
|
||||
suspend fun TrackService.getLastChapterRead(track: Track): Float {
|
||||
val chapters = db.getChapters(track.manga_id).executeOnIO()
|
||||
val lastChapterRead = chapters.filter { it.read }.minByOrNull { it.source_order }
|
||||
return lastChapterRead?.takeIf { it.isRecognizedNumber }?.chapter_number?.toInt() ?: 0
|
||||
return lastChapterRead?.takeIf { it.isRecognizedNumber }?.chapter_number ?: 0f
|
||||
}
|
||||
|
|
|
@ -45,6 +45,8 @@ class Anilist(private val context: Context, id: Int) : TrackService(id) {
|
|||
override fun isCompletedStatus(index: Int) = getStatusList()[index] == COMPLETED
|
||||
|
||||
override fun completedStatus() = COMPLETED
|
||||
override fun readingStatus() = READING
|
||||
override fun planningStatus() = PLANNING
|
||||
|
||||
override fun getStatus(status: Int): String = with(context) {
|
||||
when (status) {
|
||||
|
@ -133,11 +135,12 @@ class Anilist(private val context: Context, id: Int) : TrackService(id) {
|
|||
return api.addLibManga(track)
|
||||
}
|
||||
|
||||
override suspend fun update(track: Track, setToReadStatus: Boolean): Track {
|
||||
if (setToReadStatus && track.status == PLANNING && track.last_chapter_read != 0) {
|
||||
override suspend fun update(track: Track, setToRead: Boolean): Track {
|
||||
updateTrackStatus(track, setToRead, setToComplete = true, mustReadToComplete = true)
|
||||
if (setToRead && track.status == PLANNING && track.last_chapter_read != 0f) {
|
||||
track.status = READING
|
||||
}
|
||||
if (track.status == READING && track.total_chapters != 0 && track.last_chapter_read == track.total_chapters) {
|
||||
if (track.status == READING && track.total_chapters != 0 && track.last_chapter_read.toInt() == track.total_chapters) {
|
||||
track.status = COMPLETED
|
||||
}
|
||||
// If user was using API v1 fetch library_id
|
||||
|
|
|
@ -35,7 +35,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
|
|||
return withContext(Dispatchers.IO) {
|
||||
val variables = jsonObject(
|
||||
"mangaId" to track.media_id,
|
||||
"progress" to track.last_chapter_read,
|
||||
"progress" to track.last_chapter_read.toInt(),
|
||||
"status" to track.toAnilistStatus()
|
||||
)
|
||||
createDate(track.started_reading_date)?.let {
|
||||
|
@ -68,7 +68,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
|
|||
return withContext(Dispatchers.IO) {
|
||||
val variables = jsonObject(
|
||||
"listId" to track.library_id,
|
||||
"progress" to track.last_chapter_read,
|
||||
"progress" to track.last_chapter_read.toInt(),
|
||||
"status" to track.toAnilistStatus(),
|
||||
"score" to track.score.toInt()
|
||||
)
|
||||
|
|
|
@ -65,7 +65,7 @@ data class ALUserManga(
|
|||
score = score_raw.toFloat()
|
||||
started_reading_date = start_date_fuzzy
|
||||
finished_reading_date = completed_date_fuzzy
|
||||
last_chapter_read = chapters_read
|
||||
last_chapter_read = chapters_read.toFloat()
|
||||
library_id = this@ALUserManga.library_id
|
||||
total_chapters = manga.total_chapters
|
||||
}
|
||||
|
|
|
@ -8,7 +8,6 @@ import eu.kanade.tachiyomi.R
|
|||
import eu.kanade.tachiyomi.data.database.models.Track
|
||||
import eu.kanade.tachiyomi.data.track.TrackService
|
||||
import eu.kanade.tachiyomi.data.track.model.TrackSearch
|
||||
import eu.kanade.tachiyomi.data.track.myanimelist.MyAnimeList
|
||||
import eu.kanade.tachiyomi.data.track.updateNewTrackInfo
|
||||
import timber.log.Timber
|
||||
import uy.kohesive.injekt.injectLazy
|
||||
|
@ -32,13 +31,8 @@ class Bangumi(private val context: Context, id: Int) : TrackService(id) {
|
|||
return track.score.toInt().toString()
|
||||
}
|
||||
|
||||
override suspend fun update(track: Track, setToReadStatus: Boolean): Track {
|
||||
if (setToReadStatus && track.status == PLANNING && track.last_chapter_read != 0) {
|
||||
track.status = READING
|
||||
}
|
||||
if (track.total_chapters != 0 && track.last_chapter_read == track.total_chapters) {
|
||||
track.status = COMPLETED
|
||||
}
|
||||
override suspend fun update(track: Track, setToRead: Boolean): Track {
|
||||
updateTrackStatus(track, setToRead, setToComplete = true, mustReadToComplete = false)
|
||||
return api.updateLibManga(track)
|
||||
}
|
||||
|
||||
|
@ -89,7 +83,9 @@ class Bangumi(private val context: Context, id: Int) : TrackService(id) {
|
|||
|
||||
override fun isCompletedStatus(index: Int) = getStatusList()[index] == COMPLETED
|
||||
|
||||
override fun completedStatus(): Int = MyAnimeList.COMPLETED
|
||||
override fun completedStatus(): Int = COMPLETED
|
||||
override fun readingStatus() = READING
|
||||
override fun planningStatus() = PLANNING
|
||||
|
||||
override fun getStatus(status: Int): String = with(context) {
|
||||
when (status) {
|
||||
|
|
|
@ -38,7 +38,7 @@ class BangumiApi(private val client: OkHttpClient, interceptor: BangumiIntercept
|
|||
// chapter update
|
||||
return withContext(Dispatchers.IO) {
|
||||
val body =
|
||||
FormBody.Builder().add("watched_eps", track.last_chapter_read.toString()).build()
|
||||
FormBody.Builder().add("watched_eps", track.last_chapter_read.toInt().toString()).build()
|
||||
val request =
|
||||
Request.Builder().url("$apiUrl/subject/${track.media_id}/update/watched_eps")
|
||||
.post(body).build()
|
||||
|
@ -120,7 +120,7 @@ class BangumiApi(private val client: OkHttpClient, interceptor: BangumiIntercept
|
|||
val resp = response.body?.toString()
|
||||
val coll = gson.fromJson(resp, Collection::class.java)
|
||||
track.status = coll.status?.id!!
|
||||
track.last_chapter_read = coll.ep_status!!
|
||||
track.last_chapter_read = coll.ep_status!!.toFloat()
|
||||
return track
|
||||
}
|
||||
|
||||
|
|
|
@ -7,7 +7,6 @@ import eu.kanade.tachiyomi.R
|
|||
import eu.kanade.tachiyomi.data.database.models.Track
|
||||
import eu.kanade.tachiyomi.data.track.TrackService
|
||||
import eu.kanade.tachiyomi.data.track.model.TrackSearch
|
||||
import eu.kanade.tachiyomi.data.track.myanimelist.MyAnimeList
|
||||
import eu.kanade.tachiyomi.data.track.updateNewTrackInfo
|
||||
import kotlinx.serialization.decodeFromString
|
||||
import kotlinx.serialization.encodeToString
|
||||
|
@ -50,7 +49,9 @@ class Kitsu(private val context: Context, id: Int) : TrackService(id) {
|
|||
|
||||
override fun isCompletedStatus(index: Int) = getStatusList()[index] == COMPLETED
|
||||
|
||||
override fun completedStatus(): Int = MyAnimeList.COMPLETED
|
||||
override fun completedStatus(): Int = COMPLETED
|
||||
override fun readingStatus() = READING
|
||||
override fun planningStatus() = PLAN_TO_READ
|
||||
|
||||
override fun getStatus(status: Int): String = with(context) {
|
||||
when (status) {
|
||||
|
@ -88,14 +89,8 @@ class Kitsu(private val context: Context, id: Int) : TrackService(id) {
|
|||
return df.format(track.score)
|
||||
}
|
||||
|
||||
override suspend fun update(track: Track, setToReadStatus: Boolean): Track {
|
||||
if (setToReadStatus && track.status == PLAN_TO_READ && track.last_chapter_read != 0) {
|
||||
track.status = READING
|
||||
}
|
||||
if (track.total_chapters != 0 && track.last_chapter_read == track.total_chapters) {
|
||||
track.status = COMPLETED
|
||||
}
|
||||
|
||||
override suspend fun update(track: Track, setToRead: Boolean): Track {
|
||||
updateTrackStatus(track, setToRead, setToComplete = true, mustReadToComplete = false)
|
||||
return api.updateLibManga(track)
|
||||
}
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor)
|
|||
put("type", "libraryEntries")
|
||||
putJsonObject("attributes") {
|
||||
put("status", track.toKitsuStatus())
|
||||
put("progress", track.last_chapter_read)
|
||||
put("progress", track.last_chapter_read.toInt())
|
||||
}
|
||||
putJsonObject("relationships") {
|
||||
putJsonObject("user") {
|
||||
|
@ -84,7 +84,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor)
|
|||
put("id", track.media_id)
|
||||
putJsonObject("attributes") {
|
||||
put("status", track.toKitsuStatus())
|
||||
put("progress", track.last_chapter_read)
|
||||
put("progress", track.last_chapter_read.toInt())
|
||||
put("ratingTwenty", track.toKitsuScore())
|
||||
put("startedAt", KitsuDateHelper.convert(track.started_reading_date))
|
||||
put("finishedAt", KitsuDateHelper.convert(track.finished_reading_date))
|
||||
|
|
|
@ -79,7 +79,7 @@ class KitsuLibManga(obj: JsonObject, manga: JsonObject) {
|
|||
finished_reading_date = KitsuDateHelper.parse(finishedAt)
|
||||
status = toTrackStatus()
|
||||
score = ratingTwenty?.let { it.toInt() / 2f } ?: 0f
|
||||
last_chapter_read = progress
|
||||
last_chapter_read = progress.toFloat()
|
||||
}
|
||||
|
||||
private fun toTrackStatus() = when (status) {
|
||||
|
|
|
@ -62,6 +62,8 @@ class Komga(private val context: Context, id: Int) : TrackService(id), EnhancedT
|
|||
}
|
||||
|
||||
override fun completedStatus(): Int = COMPLETED
|
||||
override fun readingStatus() = READING
|
||||
override fun planningStatus() = UNREAD
|
||||
|
||||
override fun getScoreList(): List<String> = emptyList()
|
||||
|
||||
|
@ -72,10 +74,8 @@ class Komga(private val context: Context, id: Int) : TrackService(id), EnhancedT
|
|||
return api.updateProgress(track)
|
||||
}
|
||||
|
||||
override suspend fun update(track: Track, setToReadStatus: Boolean): Track {
|
||||
if (setToReadStatus && track.status == UNREAD && track.last_chapter_read != 0) {
|
||||
track.status = READING
|
||||
}
|
||||
override suspend fun update(track: Track, setToRead: Boolean): Track {
|
||||
updateTrackStatus(track, setToRead)
|
||||
return api.updateProgress(track)
|
||||
}
|
||||
|
||||
|
|
|
@ -51,7 +51,7 @@ class KomgaApi(private val client: OkHttpClient) {
|
|||
progress.booksReadCount -> Komga.COMPLETED
|
||||
else -> Komga.READING
|
||||
}
|
||||
last_chapter_read = progress.lastReadContinuousIndex
|
||||
last_chapter_read = progress.lastReadContinuousIndex.toFloat()
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Timber.w(e, "Could not get item: $url")
|
||||
|
@ -60,7 +60,7 @@ class KomgaApi(private val client: OkHttpClient) {
|
|||
}
|
||||
|
||||
suspend fun updateProgress(track: Track): Track {
|
||||
val progress = ReadProgressUpdateDto(track.last_chapter_read)
|
||||
val progress = ReadProgressUpdateDto(track.last_chapter_read.toInt())
|
||||
val payload = json.encodeToString(progress)
|
||||
client.newCall(
|
||||
Request.Builder()
|
||||
|
|
|
@ -16,7 +16,7 @@ class TrackSearch : Track {
|
|||
|
||||
override lateinit var title: String
|
||||
|
||||
override var last_chapter_read: Int = 0
|
||||
override var last_chapter_read: Float = 0f
|
||||
|
||||
override var total_chapters: Int = 0
|
||||
|
||||
|
|
|
@ -58,6 +58,8 @@ class MyAnimeList(private val context: Context, id: Int) : TrackService(id) {
|
|||
override fun isCompletedStatus(index: Int) = getStatusList()[index] == COMPLETED
|
||||
|
||||
override fun completedStatus(): Int = COMPLETED
|
||||
override fun readingStatus() = READING
|
||||
override fun planningStatus() = PLAN_TO_READ
|
||||
|
||||
override fun getScoreList(): List<String> {
|
||||
return IntRange(0, 10).map(Int::toString)
|
||||
|
@ -74,10 +76,8 @@ class MyAnimeList(private val context: Context, id: Int) : TrackService(id) {
|
|||
return api.updateItem(track)
|
||||
}
|
||||
|
||||
override suspend fun update(track: Track, setToReadStatus: Boolean): Track {
|
||||
if (setToReadStatus && track.status == PLAN_TO_READ && track.last_chapter_read != 0) {
|
||||
track.status = READING
|
||||
}
|
||||
override suspend fun update(track: Track, setToRead: Boolean): Track {
|
||||
updateTrackStatus(track, setToRead)
|
||||
return api.updateItem(track)
|
||||
}
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@ import kotlinx.coroutines.awaitAll
|
|||
import kotlinx.serialization.json.JsonObject
|
||||
import kotlinx.serialization.json.boolean
|
||||
import kotlinx.serialization.json.contentOrNull
|
||||
import kotlinx.serialization.json.float
|
||||
import kotlinx.serialization.json.int
|
||||
import kotlinx.serialization.json.jsonArray
|
||||
import kotlinx.serialization.json.jsonObject
|
||||
|
@ -118,7 +119,7 @@ class MyAnimeListApi(private val client: OkHttpClient, interceptor: MyAnimeListI
|
|||
.add("status", track.toMyAnimeListStatus() ?: "reading")
|
||||
.add("is_rereading", (track.status == MyAnimeList.REREADING).toString())
|
||||
.add("score", track.score.toString())
|
||||
.add("num_chapters_read", track.last_chapter_read.toString())
|
||||
.add("num_chapters_read", track.last_chapter_read.toInt().toString())
|
||||
convertToIsoDate(track.started_reading_date)?.let {
|
||||
formBodyBuilder.add("start_date", it)
|
||||
}
|
||||
|
@ -206,7 +207,7 @@ class MyAnimeListApi(private val client: OkHttpClient, interceptor: MyAnimeListI
|
|||
return track.apply {
|
||||
val isRereading = obj["is_rereading"]!!.jsonPrimitive.boolean
|
||||
status = if (isRereading) MyAnimeList.REREADING else getStatus(obj["status"]!!.jsonPrimitive.content)
|
||||
last_chapter_read = obj["num_chapters_read"]!!.jsonPrimitive.int
|
||||
last_chapter_read = obj["num_chapters_read"]!!.jsonPrimitive.float
|
||||
score = obj["score"]!!.jsonPrimitive.int.toFloat()
|
||||
val startedDate = parseDate(obj["start_date"]?.jsonPrimitive?.content ?: "")
|
||||
if (track.started_reading_date <= 0L || startedDate > 0) {
|
||||
|
|
|
@ -34,6 +34,8 @@ class Shikimori(private val context: Context, id: Int) : TrackService(id) {
|
|||
override fun isCompletedStatus(index: Int) = getStatusList()[index] == COMPLETED
|
||||
|
||||
override fun completedStatus(): Int = MyAnimeList.COMPLETED
|
||||
override fun readingStatus() = READING
|
||||
override fun planningStatus() = PLANNING
|
||||
|
||||
override fun getStatus(status: Int): String = with(context) {
|
||||
when (status) {
|
||||
|
@ -67,13 +69,8 @@ class Shikimori(private val context: Context, id: Int) : TrackService(id) {
|
|||
return track.score.toInt().toString()
|
||||
}
|
||||
|
||||
override suspend fun update(track: Track, setToReadStatus: Boolean): Track {
|
||||
if (setToReadStatus && track.status == PLANNING && track.last_chapter_read != 0) {
|
||||
track.status = READING
|
||||
}
|
||||
if (track.total_chapters != 0 && track.last_chapter_read == track.total_chapters) {
|
||||
track.status = COMPLETED
|
||||
}
|
||||
override suspend fun update(track: Track, setToRead: Boolean): Track {
|
||||
updateTrackStatus(track, setToRead, setToComplete = true, mustReadToComplete = false)
|
||||
return api.updateLibManga(track, getUsername())
|
||||
}
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ class ShikimoriApi(private val client: OkHttpClient, interceptor: ShikimoriInter
|
|||
"user_id" to user_id,
|
||||
"target_id" to track.media_id,
|
||||
"target_type" to "Manga",
|
||||
"chapters" to track.last_chapter_read,
|
||||
"chapters" to track.last_chapter_read.toInt(),
|
||||
"score" to track.score.toInt(),
|
||||
"status" to track.toShikimoriStatus()
|
||||
)
|
||||
|
@ -106,7 +106,7 @@ class ShikimoriApi(private val client: OkHttpClient, interceptor: ShikimoriInter
|
|||
title = mangas["name"].asString
|
||||
media_id = obj["id"].asInt
|
||||
total_chapters = mangas["chapters"].asInt
|
||||
last_chapter_read = obj["chapters"].asInt
|
||||
last_chapter_read = obj["chapters"].asFloat
|
||||
score = (obj["score"].asInt).toFloat()
|
||||
status = toTrackStatus(obj["status"].asString)
|
||||
tracking_url = baseUrl + mangas["url"].asString
|
||||
|
|
|
@ -977,7 +977,7 @@ class MangaDetailsPresenter(
|
|||
val track = item.track!!
|
||||
track.status = item.service.getStatusList()[index]
|
||||
if (item.service.isCompletedStatus(index) && track.total_chapters > 0) {
|
||||
track.last_chapter_read = track.total_chapters
|
||||
track.last_chapter_read = track.total_chapters.toFloat()
|
||||
}
|
||||
updateRemote(track, item.service)
|
||||
}
|
||||
|
@ -990,7 +990,7 @@ class MangaDetailsPresenter(
|
|||
|
||||
fun setLastChapterRead(item: TrackItem, chapterNumber: Int) {
|
||||
val track = item.track!!
|
||||
track.last_chapter_read = chapterNumber
|
||||
track.last_chapter_read = chapterNumber.toFloat()
|
||||
updateRemote(track, item.service)
|
||||
}
|
||||
|
||||
|
|
|
@ -57,17 +57,17 @@ class TrackHolder(view: View, adapter: TrackAdapter) : BaseViewHolder(view) {
|
|||
binding.trackTitle.text = track.title
|
||||
with(binding.trackChapters) {
|
||||
text = when {
|
||||
track.total_chapters > 0 && track.last_chapter_read == track.total_chapters -> context.getString(
|
||||
track.total_chapters > 0 && track.last_chapter_read.toInt() == track.total_chapters -> context.getString(
|
||||
R.string.all_chapters_read
|
||||
)
|
||||
track.total_chapters > 0 -> context.getString(
|
||||
R.string.chapter_x_of_y,
|
||||
track.last_chapter_read,
|
||||
track.last_chapter_read.toInt(),
|
||||
track.total_chapters
|
||||
)
|
||||
track.last_chapter_read > 0 -> context.getString(
|
||||
R.string.chapter_,
|
||||
track.last_chapter_read.toString()
|
||||
track.last_chapter_read.toInt().toString()
|
||||
)
|
||||
else -> context.getString(R.string.not_started)
|
||||
}
|
||||
|
|
|
@ -469,7 +469,7 @@ class TrackingBottomSheet(private val controller: MangaDetailsController) :
|
|||
|
||||
val np = binding.chaptersPicker
|
||||
// Set initial value
|
||||
np.value = item.track.last_chapter_read
|
||||
np.value = item.track.last_chapter_read.toInt()
|
||||
if (item.track.total_chapters > 0) {
|
||||
np.wrapSelectorWheel = true
|
||||
np.maxValue = item.track.total_chapters
|
||||
|
|
|
@ -879,7 +879,7 @@ class ReaderPresenter(
|
|||
if (!preferences.autoUpdateTrack()) return
|
||||
|
||||
launchIO {
|
||||
val newChapterRead = readerChapter.chapter.chapter_number.toInt()
|
||||
val newChapterRead = readerChapter.chapter.chapter_number
|
||||
updateTrackChapterRead(db, preferences, manga?.id, newChapterRead, true)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,15 +26,12 @@ import uy.kohesive.injekt.api.get
|
|||
fun syncChaptersWithTrackServiceTwoWay(db: DatabaseHelper, chapters: List<Chapter>, remoteTrack: Track, service: TrackService) {
|
||||
val sortedChapters = chapters.sortedBy { it.chapter_number }
|
||||
sortedChapters
|
||||
.filterIndexed { index, chapter -> index < remoteTrack.last_chapter_read && !chapter.read }
|
||||
.filter { chapter -> chapter.chapter_number <= remoteTrack.last_chapter_read && !chapter.read }
|
||||
.forEach { it.read = true }
|
||||
db.updateChaptersProgress(sortedChapters).executeAsBlocking()
|
||||
|
||||
val localLastRead = when {
|
||||
sortedChapters.all { it.read } -> sortedChapters.size
|
||||
sortedChapters.any { !it.read } -> sortedChapters.indexOfFirst { !it.read }
|
||||
else -> 0
|
||||
}
|
||||
// only take into account continuous reading
|
||||
val localLastRead = sortedChapters.takeWhile { it.read }.lastOrNull()?.chapter_number ?: 0F
|
||||
|
||||
// update remote
|
||||
remoteTrack.last_chapter_read = localLastRead
|
||||
|
@ -49,7 +46,7 @@ fun syncChaptersWithTrackServiceTwoWay(db: DatabaseHelper, chapters: List<Chapte
|
|||
}
|
||||
}
|
||||
|
||||
private var trackingJobs = HashMap<Long, Pair<Job?, Int?>>()
|
||||
private var trackingJobs = HashMap<Long, Pair<Job?, Float?>>()
|
||||
|
||||
/**
|
||||
* Starts the service that updates the last chapter read in sync services. This operation
|
||||
|
@ -66,10 +63,10 @@ fun updateTrackChapterMarkedAsRead(
|
|||
if (!preferences.trackMarkedAsRead()) return
|
||||
mangaId ?: return
|
||||
|
||||
val newChapterRead = newLastChapter?.chapter_number?.toInt() ?: 0
|
||||
val newChapterRead = newLastChapter?.chapter_number ?: 0f
|
||||
|
||||
// To avoid unnecessary calls if multiple marked as read for same manga
|
||||
if (trackingJobs[mangaId]?.second ?: 0 < newChapterRead) {
|
||||
if (trackingJobs[mangaId]?.second ?: 0f < newChapterRead) {
|
||||
trackingJobs[mangaId]?.first?.cancel()
|
||||
|
||||
// We want these to execute even if the presenter is destroyed
|
||||
|
@ -86,7 +83,7 @@ suspend fun updateTrackChapterRead(
|
|||
db: DatabaseHelper,
|
||||
preferences: PreferencesHelper,
|
||||
mangaId: Long?,
|
||||
newChapterRead: Int,
|
||||
newChapterRead: Float,
|
||||
retryWhenOnline: Boolean = false
|
||||
) {
|
||||
val trackManager = Injekt.get<TrackManager>()
|
||||
|
@ -103,7 +100,7 @@ suspend fun updateTrackChapterRead(
|
|||
DelayedTrackingUpdateJob.setupTask(preferences.context)
|
||||
} else if (preferences.context.isOnline()) {
|
||||
try {
|
||||
track.last_chapter_read = newChapterRead
|
||||
track.last_chapter_read = newChapterRead.toFloat()
|
||||
service.update(track, true)
|
||||
db.insertTrack(track).executeAsBlocking()
|
||||
} catch (e: Exception) {
|
||||
|
|
|
@ -306,16 +306,16 @@ class BackupTest {
|
|||
// Create track and add it to database
|
||||
// This tests duplicate errors.
|
||||
val track = getSingleTrack(manga)
|
||||
track.last_chapter_read = 5
|
||||
track.last_chapter_read = 5f
|
||||
backupManager.databaseHelper.insertTrack(track).executeAsBlocking()
|
||||
var trackDB = backupManager.databaseHelper.getTracks(manga).executeAsBlocking()
|
||||
assertThat(trackDB).hasSize(1)
|
||||
assertThat(trackDB[0].last_chapter_read).isEqualTo(5)
|
||||
track.last_chapter_read = 7
|
||||
track.last_chapter_read = 7f
|
||||
|
||||
// Create track for different manga to test track not in database
|
||||
val track2 = getSingleTrack(manga2)
|
||||
track2.last_chapter_read = 10
|
||||
track2.last_chapter_read = 10f
|
||||
|
||||
// Check parser and restore already in database
|
||||
var trackList = listOf(track)
|
||||
|
@ -330,7 +330,7 @@ class BackupTest {
|
|||
assertThat(trackDB[0].last_chapter_read).isEqualTo(7)
|
||||
|
||||
// Check parser and restore already in database with lower chapter_read
|
||||
track.last_chapter_read = 5
|
||||
track.last_chapter_read = 5f
|
||||
trackList = listOf(track)
|
||||
backupManager.restoreTrackForManga(manga, trackList)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue