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 android.app.Application
import eu.kanade.domain.track.model.toDbTrack import eu.kanade.domain.track.model.toDbTrack
import eu.kanade.domain.track.model.toDomainTrack 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.Tracker
import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.data.track.TrackerManager
import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.system.toast
@ -26,10 +27,16 @@ class RefreshTracks(
/** /**
* Fetches updated tracking data from all logged in trackers. * 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. * @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 {
return@supervisorScope getTracks.await(mangaId) return@supervisorScope getTracks.await(mangaId)
.map { it to trackerManager.get(it.trackerId) } .map { it to trackerManager.get(it.trackerId) }
@ -39,7 +46,13 @@ class RefreshTracks(
return@async try { return@async try {
val updatedTrack = service!!.refresh(track.toDbTrack()).toDomainTrack()!! val updatedTrack = service!!.refresh(track.toDbTrack()).toDomainTrack()!!
insertTrack.await(updatedTrack) insertTrack.await(updatedTrack)
syncChapterProgressWithTrack.await(mangaId, updatedTrack, service) // KMK -->
if (!enhancedTrackersOnly) {
syncChapterProgressWithTrack.sync(mangaId, updatedTrack, service)
} else {
// KMK <--
syncChapterProgressWithTrack.await(mangaId, updatedTrack, service)
}
// KMK --> // KMK -->
?.let { ?.let {
val context = Injekt.get<Application>() val context = Injekt.get<Application>()

View file

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

View file

@ -23,6 +23,11 @@ class TrackChapter(
private val delayedTrackingStore: DelayedTrackingStore, 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) { suspend fun await(context: Context, mangaId: Long, chapterNumber: Double, setupJobOnFailure: Boolean = true) {
withNonCancellableContext { withNonCancellableContext {
val tracks = getTracks.await(mangaId) val tracks = getTracks.await(mangaId)

View file

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