Fix: Messed up trackers progress update always auto sync (#794)

This commit is contained in:
Cuong-Tran 2025-03-27 00:44:37 +07:00 committed by GitHub
parent ee5b3d0d92
commit edc0bd34ff
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 41 additions and 15 deletions

View file

@ -3,6 +3,7 @@ package eu.kanade.domain.track.interactor
import android.app.Application
import eu.kanade.domain.track.model.toDbTrack
import eu.kanade.domain.track.model.toDomainTrack
import eu.kanade.tachiyomi.data.track.EnhancedTracker
import eu.kanade.tachiyomi.data.track.Tracker
import eu.kanade.tachiyomi.data.track.TrackerManager
import eu.kanade.tachiyomi.util.system.toast
@ -26,10 +27,16 @@ class RefreshTracks(
/**
* Fetches updated tracking data from all logged in trackers.
* Also sync chapter progress with the [EnhancedTracker] or all trackers based on [enhancedTrackersOnly].
*
* @return Failed updates.
*/
suspend fun await(mangaId: Long): List<Pair<Tracker?, Throwable>> {
suspend fun await(
mangaId: Long,
// KMK -->
enhancedTrackersOnly: Boolean = true,
// KMK <--
): List<Pair<Tracker?, Throwable>> {
return supervisorScope {
return@supervisorScope getTracks.await(mangaId)
.map { it to trackerManager.get(it.trackerId) }
@ -39,7 +46,13 @@ class RefreshTracks(
return@async try {
val updatedTrack = service!!.refresh(track.toDbTrack()).toDomainTrack()!!
insertTrack.await(updatedTrack)
syncChapterProgressWithTrack.await(mangaId, updatedTrack, service)
// KMK -->
if (!enhancedTrackersOnly) {
syncChapterProgressWithTrack.sync(mangaId, updatedTrack, service)
} else {
// KMK <--
syncChapterProgressWithTrack.await(mangaId, updatedTrack, service)
}
// KMK -->
?.let {
val context = Injekt.get<Application>()

View file

@ -1,7 +1,7 @@
package eu.kanade.domain.track.interactor
import eu.kanade.domain.track.model.toDbTrack
import eu.kanade.domain.track.service.TrackPreferences
import eu.kanade.tachiyomi.data.track.EnhancedTracker
import eu.kanade.tachiyomi.data.track.Tracker
import logcat.LogPriority
import tachiyomi.core.common.util.system.logcat
@ -10,8 +10,6 @@ import tachiyomi.domain.chapter.interactor.UpdateChapter
import tachiyomi.domain.chapter.model.toChapterUpdate
import tachiyomi.domain.track.interactor.InsertTrack
import tachiyomi.domain.track.model.Track
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import kotlin.math.max
class SyncChapterProgressWithTrack(
@ -19,19 +17,30 @@ class SyncChapterProgressWithTrack(
private val insertTrack: InsertTrack,
private val getChaptersByMangaId: GetChaptersByMangaId,
) {
val trackPreferences: TrackPreferences = Injekt.get()
/**
* Sync chapter progress with the [EnhancedTracker]
*/
suspend fun await(
mangaId: Long,
remoteTrack: Track,
tracker: Tracker,
): Int? {
// KKM -->
// if (tracker !is EnhancedTracker) {
// return
// }
// <-- KKM
if (tracker !is EnhancedTracker) {
return null
}
// KMK -->
return sync(mangaId, remoteTrack, tracker)
}
/**
* Sync chapter progress with the all trackers.
*/
suspend fun sync(
mangaId: Long,
remoteTrack: Track,
tracker: Tracker,
): Int? {
// KMK <--
// Current chapters in database, sort by source's order because database's order is a mess
val dbChapters = getChaptersByMangaId.await(mangaId)
// KMK -->
@ -78,7 +87,6 @@ class SyncChapterProgressWithTrack(
// KMK -->
// Always update local chapters following Tracker even past chapters
if (chapterUpdates.isNotEmpty() &&
trackPreferences.autoSyncProgressFromTrackers().get() &&
!tracker.hasNotStartedReading(remoteTrack.status)
) {
updateChapter.awaitAll(chapterUpdates)

View file

@ -23,6 +23,11 @@ class TrackChapter(
private val delayedTrackingStore: DelayedTrackingStore,
) {
/**
* Fetches updated tracking data from all logged in trackers.
* Then update chapter progress to all trackers.
* This does not update local chapters' read status.
*/
suspend fun await(context: Context, mangaId: Long, chapterNumber: Double, setupJobOnFailure: Boolean = true) {
withNonCancellableContext {
val tracks = getTracks.await(mangaId)

View file

@ -176,6 +176,7 @@ class MangaScreenModel(
private val uiPreferences: UiPreferences = Injekt.get(),
// KMK -->
private val sourcePreferences: SourcePreferences = Injekt.get(),
private val refreshTracks: RefreshTracks = Injekt.get(),
// KMK <--
private val trackerManager: TrackerManager = Injekt.get(),
private val trackChapter: TrackChapter = Injekt.get(),
@ -562,8 +563,7 @@ class MangaScreenModel(
private suspend fun syncTrackers() {
if (!trackPreferences.autoSyncProgressFromTrackers().get()) return
val refreshTracks = Injekt.get<RefreshTracks>()
refreshTracks.await(mangaId)
refreshTracks.await(mangaId, enhancedTrackersOnly = false)
.filter { it.first != null }
.forEach { (track, e) ->
logcat(LogPriority.ERROR, e) {