mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-03 23:58:55 +01:00 
			
		
		
		
	Refresh tracks before updating progress
Closes #1652 Also removes the ability to trigger refreshes for the entire library or as part of a library update as it should no longer be needed. Opening the tracking sheet already refreshes the data too, so stale data is irrelevant there. Also closes #4775 since it would no longer be relevant.
This commit is contained in:
		@@ -2,6 +2,7 @@ package eu.kanade.domain.track.interactor
 | 
			
		||||
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import eu.kanade.domain.track.model.toDbTrack
 | 
			
		||||
import eu.kanade.domain.track.model.toDomainTrack
 | 
			
		||||
import eu.kanade.domain.track.service.DelayedTrackingUpdateJob
 | 
			
		||||
import eu.kanade.domain.track.store.DelayedTrackingStore
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.TrackerManager
 | 
			
		||||
@@ -31,14 +32,17 @@ class TrackChapter(
 | 
			
		||||
                    return@mapNotNull null
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                val updatedTrack = track.copy(lastChapterRead = chapterNumber)
 | 
			
		||||
                async {
 | 
			
		||||
                    runCatching {
 | 
			
		||||
                        try {
 | 
			
		||||
                            val updatedTrack = service.refresh(track.toDbTrack())
 | 
			
		||||
                                .toDomainTrack(idRequired = true)!!
 | 
			
		||||
                                .copy(lastChapterRead = chapterNumber)
 | 
			
		||||
                            service.update(updatedTrack.toDbTrack(), true)
 | 
			
		||||
                            insertTrack.await(updatedTrack)
 | 
			
		||||
                            delayedTrackingStore.remove(track.id)
 | 
			
		||||
                        } catch (e: Exception) {
 | 
			
		||||
                            delayedTrackingStore.addItem(updatedTrack)
 | 
			
		||||
                            delayedTrackingStore.add(track.id, chapterNumber)
 | 
			
		||||
                            DelayedTrackingUpdateJob.setupTask(context)
 | 
			
		||||
                            throw e
 | 
			
		||||
                        }
 | 
			
		||||
 
 | 
			
		||||
@@ -8,21 +8,19 @@ import androidx.work.ExistingWorkPolicy
 | 
			
		||||
import androidx.work.NetworkType
 | 
			
		||||
import androidx.work.OneTimeWorkRequestBuilder
 | 
			
		||||
import androidx.work.WorkerParameters
 | 
			
		||||
import eu.kanade.domain.track.model.toDbTrack
 | 
			
		||||
import eu.kanade.domain.track.interactor.TrackChapter
 | 
			
		||||
import eu.kanade.domain.track.store.DelayedTrackingStore
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.TrackerManager
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.workManager
 | 
			
		||||
import logcat.LogPriority
 | 
			
		||||
import tachiyomi.core.util.lang.withIOContext
 | 
			
		||||
import tachiyomi.core.util.system.logcat
 | 
			
		||||
import tachiyomi.domain.track.interactor.GetTracks
 | 
			
		||||
import tachiyomi.domain.track.interactor.InsertTrack
 | 
			
		||||
import uy.kohesive.injekt.Injekt
 | 
			
		||||
import uy.kohesive.injekt.api.get
 | 
			
		||||
import kotlin.time.Duration.Companion.minutes
 | 
			
		||||
import kotlin.time.toJavaDuration
 | 
			
		||||
 | 
			
		||||
class DelayedTrackingUpdateJob(context: Context, workerParams: WorkerParameters) :
 | 
			
		||||
class DelayedTrackingUpdateJob(private val context: Context, workerParams: WorkerParameters) :
 | 
			
		||||
    CoroutineWorker(context, workerParams) {
 | 
			
		||||
 | 
			
		||||
    override suspend fun doWork(): Result {
 | 
			
		||||
@@ -31,9 +29,8 @@ class DelayedTrackingUpdateJob(context: Context, workerParams: WorkerParameters)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        val getTracks = Injekt.get<GetTracks>()
 | 
			
		||||
        val insertTrack = Injekt.get<InsertTrack>()
 | 
			
		||||
        val trackChapter = Injekt.get<TrackChapter>()
 | 
			
		||||
 | 
			
		||||
        val trackerManager = Injekt.get<TrackerManager>()
 | 
			
		||||
        val delayedTrackingStore = Injekt.get<DelayedTrackingStore>()
 | 
			
		||||
 | 
			
		||||
        withIOContext {
 | 
			
		||||
@@ -46,17 +43,8 @@ class DelayedTrackingUpdateJob(context: Context, workerParams: WorkerParameters)
 | 
			
		||||
                    track?.copy(lastChapterRead = it.lastChapterRead.toDouble())
 | 
			
		||||
                }
 | 
			
		||||
                .forEach { track ->
 | 
			
		||||
                    try {
 | 
			
		||||
                        val service = trackerManager.get(track.syncId)
 | 
			
		||||
                        if (service != null && service.isLoggedIn) {
 | 
			
		||||
                            logcat(LogPriority.DEBUG) { "Updating delayed track item: ${track.id}, last chapter read: ${track.lastChapterRead}" }
 | 
			
		||||
                            service.update(track.toDbTrack(), true)
 | 
			
		||||
                            insertTrack.await(track)
 | 
			
		||||
                        }
 | 
			
		||||
                        delayedTrackingStore.remove(track.id)
 | 
			
		||||
                    } catch (e: Exception) {
 | 
			
		||||
                        logcat(LogPriority.ERROR, e)
 | 
			
		||||
                    }
 | 
			
		||||
                    logcat(LogPriority.DEBUG) { "Updating delayed track item: ${track.mangaId}, last chapter read: ${track.lastChapterRead}" }
 | 
			
		||||
                    trackChapter.await(context, track.mangaId, track.lastChapterRead)
 | 
			
		||||
                }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,6 @@ import android.content.Context
 | 
			
		||||
import androidx.core.content.edit
 | 
			
		||||
import logcat.LogPriority
 | 
			
		||||
import tachiyomi.core.util.system.logcat
 | 
			
		||||
import tachiyomi.domain.track.model.Track
 | 
			
		||||
 | 
			
		||||
class DelayedTrackingStore(context: Context) {
 | 
			
		||||
 | 
			
		||||
@@ -13,13 +12,12 @@ class DelayedTrackingStore(context: Context) {
 | 
			
		||||
     */
 | 
			
		||||
    private val preferences = context.getSharedPreferences("tracking_queue", Context.MODE_PRIVATE)
 | 
			
		||||
 | 
			
		||||
    fun addItem(track: Track) {
 | 
			
		||||
        val trackId = track.id.toString()
 | 
			
		||||
        val lastChapterRead = preferences.getFloat(trackId, 0f)
 | 
			
		||||
        if (track.lastChapterRead > lastChapterRead) {
 | 
			
		||||
            logcat(LogPriority.DEBUG) { "Queuing track item: $trackId, last chapter read: ${track.lastChapterRead}" }
 | 
			
		||||
    fun add(trackId: Long, lastChapterRead: Double) {
 | 
			
		||||
        val previousLastChapterRead = preferences.getFloat(trackId.toString(), 0f)
 | 
			
		||||
        if (lastChapterRead > previousLastChapterRead) {
 | 
			
		||||
            logcat(LogPriority.DEBUG) { "Queuing track item: $trackId, last chapter read: $lastChapterRead" }
 | 
			
		||||
            preferences.edit {
 | 
			
		||||
                putFloat(trackId, track.lastChapterRead.toFloat())
 | 
			
		||||
                putFloat(trackId.toString(), lastChapterRead.toFloat())
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,6 @@ import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.cache.ChapterCache
 | 
			
		||||
import eu.kanade.tachiyomi.data.download.DownloadCache
 | 
			
		||||
import eu.kanade.tachiyomi.data.library.LibraryUpdateJob
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.TrackerManager
 | 
			
		||||
import eu.kanade.tachiyomi.network.NetworkHelper
 | 
			
		||||
import eu.kanade.tachiyomi.network.NetworkPreferences
 | 
			
		||||
import eu.kanade.tachiyomi.network.PREF_DOH_360
 | 
			
		||||
@@ -328,7 +327,6 @@ object SettingsAdvancedScreen : SearchableSettings {
 | 
			
		||||
    private fun getLibraryGroup(): Preference.PreferenceGroup {
 | 
			
		||||
        val scope = rememberCoroutineScope()
 | 
			
		||||
        val context = LocalContext.current
 | 
			
		||||
        val trackerManager = remember { Injekt.get<TrackerManager>() }
 | 
			
		||||
 | 
			
		||||
        return Preference.PreferenceGroup(
 | 
			
		||||
            title = stringResource(R.string.label_library),
 | 
			
		||||
@@ -337,12 +335,6 @@ object SettingsAdvancedScreen : SearchableSettings {
 | 
			
		||||
                    title = stringResource(R.string.pref_refresh_library_covers),
 | 
			
		||||
                    onClick = { LibraryUpdateJob.startNow(context, target = LibraryUpdateJob.Target.COVERS) },
 | 
			
		||||
                ),
 | 
			
		||||
                Preference.PreferenceItem.TextPreference(
 | 
			
		||||
                    title = stringResource(R.string.pref_refresh_library_tracking),
 | 
			
		||||
                    subtitle = stringResource(R.string.pref_refresh_library_tracking_summary),
 | 
			
		||||
                    enabled = trackerManager.hasLoggedIn(),
 | 
			
		||||
                    onClick = { LibraryUpdateJob.startNow(context, target = LibraryUpdateJob.Target.TRACKING) },
 | 
			
		||||
                ),
 | 
			
		||||
                Preference.PreferenceItem.TextPreference(
 | 
			
		||||
                    title = stringResource(R.string.pref_reset_viewer_flags),
 | 
			
		||||
                    subtitle = stringResource(R.string.pref_reset_viewer_flags_summary),
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,6 @@ import eu.kanade.presentation.more.settings.Preference
 | 
			
		||||
import eu.kanade.presentation.more.settings.widget.TriStateListDialog
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.library.LibraryUpdateJob
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.TrackerManager
 | 
			
		||||
import eu.kanade.tachiyomi.ui.category.CategoryScreen
 | 
			
		||||
import kotlinx.coroutines.launch
 | 
			
		||||
import kotlinx.coroutines.runBlocking
 | 
			
		||||
@@ -197,12 +196,6 @@ object SettingsLibraryScreen : SearchableSettings {
 | 
			
		||||
                    title = stringResource(R.string.pref_library_update_refresh_metadata),
 | 
			
		||||
                    subtitle = stringResource(R.string.pref_library_update_refresh_metadata_summary),
 | 
			
		||||
                ),
 | 
			
		||||
                Preference.PreferenceItem.SwitchPreference(
 | 
			
		||||
                    pref = libraryPreferences.autoUpdateTrackers(),
 | 
			
		||||
                    enabled = Injekt.get<TrackerManager>().hasLoggedIn(),
 | 
			
		||||
                    title = stringResource(R.string.pref_library_update_refresh_trackers),
 | 
			
		||||
                    subtitle = stringResource(R.string.pref_library_update_refresh_trackers_summary),
 | 
			
		||||
                ),
 | 
			
		||||
                Preference.PreferenceItem.MultiSelectListPreference(
 | 
			
		||||
                    pref = libraryPreferences.autoUpdateMangaRestrictions(),
 | 
			
		||||
                    title = stringResource(R.string.pref_library_update_manga_restriction),
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,6 @@ import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource
 | 
			
		||||
import eu.kanade.domain.manga.interactor.UpdateManga
 | 
			
		||||
import eu.kanade.domain.manga.model.copyFrom
 | 
			
		||||
import eu.kanade.domain.manga.model.toSManga
 | 
			
		||||
import eu.kanade.domain.track.interactor.RefreshTracks
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.cache.CoverCache
 | 
			
		||||
import eu.kanade.tachiyomi.data.download.DownloadManager
 | 
			
		||||
@@ -89,7 +88,6 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet
 | 
			
		||||
    private val updateManga: UpdateManga = Injekt.get()
 | 
			
		||||
    private val getCategories: GetCategories = Injekt.get()
 | 
			
		||||
    private val syncChaptersWithSource: SyncChaptersWithSource = Injekt.get()
 | 
			
		||||
    private val refreshTracks: RefreshTracks = Injekt.get()
 | 
			
		||||
    private val fetchInterval: FetchInterval = Injekt.get()
 | 
			
		||||
 | 
			
		||||
    private val notifier = LibraryUpdateNotifier(context)
 | 
			
		||||
@@ -131,7 +129,6 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet
 | 
			
		||||
                when (target) {
 | 
			
		||||
                    Target.CHAPTERS -> updateChapterList()
 | 
			
		||||
                    Target.COVERS -> updateCovers()
 | 
			
		||||
                    Target.TRACKING -> updateTrackings()
 | 
			
		||||
                }
 | 
			
		||||
                Result.success()
 | 
			
		||||
            } catch (e: Exception) {
 | 
			
		||||
@@ -304,10 +301,6 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet
 | 
			
		||||
                                        }
 | 
			
		||||
                                        failedUpdates.add(manga to errorMessage)
 | 
			
		||||
                                    }
 | 
			
		||||
 | 
			
		||||
                                    if (libraryPreferences.autoUpdateTrackers().get()) {
 | 
			
		||||
                                        refreshTracks(manga.id)
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
@@ -409,33 +402,6 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet
 | 
			
		||||
        notifier.cancelProgressNotification()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Method that updates the metadata of the connected tracking services. It's called in a
 | 
			
		||||
     * background thread, so it's safe to do heavy operations or network calls here.
 | 
			
		||||
     */
 | 
			
		||||
    private suspend fun updateTrackings() {
 | 
			
		||||
        coroutineScope {
 | 
			
		||||
            var progressCount = 0
 | 
			
		||||
 | 
			
		||||
            mangaToUpdate.forEach { libraryManga ->
 | 
			
		||||
                ensureActive()
 | 
			
		||||
 | 
			
		||||
                val manga = libraryManga.manga
 | 
			
		||||
                notifier.showProgressNotification(listOf(manga), progressCount++, mangaToUpdate.size)
 | 
			
		||||
                refreshTracks(manga.id)
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            notifier.cancelProgressNotification()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private suspend fun refreshTracks(mangaId: Long) {
 | 
			
		||||
        refreshTracks.await(mangaId).forEach { (_, e) ->
 | 
			
		||||
            // Ignore errors and continue
 | 
			
		||||
            logcat(LogPriority.ERROR, e)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private suspend fun withUpdateNotification(
 | 
			
		||||
        updatingManga: CopyOnWriteArrayList<Manga>,
 | 
			
		||||
        completed: AtomicInteger,
 | 
			
		||||
@@ -500,7 +466,6 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet
 | 
			
		||||
    enum class Target {
 | 
			
		||||
        CHAPTERS, // Manga chapters
 | 
			
		||||
        COVERS, // Manga covers
 | 
			
		||||
        TRACKING, // Tracking metadata
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    companion object {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user