Adaptive tracker interval
This commit is contained in:
@@ -47,7 +47,7 @@ class WorkScheduleManager @Inject constructor(
|
|||||||
fun init() {
|
fun init() {
|
||||||
settings.subscribe(this)
|
settings.subscribe(this)
|
||||||
processLifecycleScope.launch(Dispatchers.Default) {
|
processLifecycleScope.launch(Dispatchers.Default) {
|
||||||
updateWorkerImpl(trackerScheduler, settings.isTrackerEnabled, false)
|
updateWorkerImpl(trackerScheduler, settings.isTrackerEnabled, true) // always force due to adaptive interval
|
||||||
updateWorkerImpl(suggestionScheduler, settings.isSuggestionsEnabled, false)
|
updateWorkerImpl(suggestionScheduler, settings.isSuggestionsEnabled, false)
|
||||||
updateWorkerImpl(periodicalBackupScheduler, settings.isPeriodicalBackupEnabled, false)
|
updateWorkerImpl(periodicalBackupScheduler, settings.isPeriodicalBackupEnabled, false)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,9 @@ abstract class TracksDao {
|
|||||||
@Query("SELECT chapters_new FROM tracks WHERE manga_id = :mangaId")
|
@Query("SELECT chapters_new FROM tracks WHERE manga_id = :mangaId")
|
||||||
abstract suspend fun findNewChapters(mangaId: Long): Int?
|
abstract suspend fun findNewChapters(mangaId: Long): Int?
|
||||||
|
|
||||||
|
@Query("SELECT COUNT(*) FROM tracks")
|
||||||
|
abstract suspend fun getTracksCount(): Int
|
||||||
|
|
||||||
@Query("SELECT manga_id, chapters_new FROM tracks")
|
@Query("SELECT manga_id, chapters_new FROM tracks")
|
||||||
abstract fun observeNewChaptersMap(): Flow<Map<@MapColumn(columnName = "manga_id") Long, @MapColumn(columnName = "chapters_new") Int>>
|
abstract fun observeNewChaptersMap(): Flow<Map<@MapColumn(columnName = "manga_id") Long, @MapColumn(columnName = "chapters_new") Int>>
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ import kotlinx.coroutines.sync.withPermit
|
|||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import org.koitharu.kotatsu.R
|
import org.koitharu.kotatsu.R
|
||||||
import org.koitharu.kotatsu.browser.cloudflare.CaptchaNotifier
|
import org.koitharu.kotatsu.browser.cloudflare.CaptchaNotifier
|
||||||
|
import org.koitharu.kotatsu.core.db.MangaDatabase
|
||||||
import org.koitharu.kotatsu.core.exceptions.CloudFlareProtectedException
|
import org.koitharu.kotatsu.core.exceptions.CloudFlareProtectedException
|
||||||
import org.koitharu.kotatsu.core.logs.FileLogger
|
import org.koitharu.kotatsu.core.logs.FileLogger
|
||||||
import org.koitharu.kotatsu.core.logs.TrackerLogger
|
import org.koitharu.kotatsu.core.logs.TrackerLogger
|
||||||
@@ -57,12 +58,14 @@ import org.koitharu.kotatsu.details.ui.DetailsActivity
|
|||||||
import org.koitharu.kotatsu.parsers.model.Manga
|
import org.koitharu.kotatsu.parsers.model.Manga
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaChapter
|
import org.koitharu.kotatsu.parsers.model.MangaChapter
|
||||||
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
|
import org.koitharu.kotatsu.parsers.util.runCatchingCancellable
|
||||||
|
import org.koitharu.kotatsu.parsers.util.toIntUp
|
||||||
import org.koitharu.kotatsu.settings.SettingsActivity
|
import org.koitharu.kotatsu.settings.SettingsActivity
|
||||||
import org.koitharu.kotatsu.settings.work.PeriodicWorkScheduler
|
import org.koitharu.kotatsu.settings.work.PeriodicWorkScheduler
|
||||||
import org.koitharu.kotatsu.tracker.domain.Tracker
|
import org.koitharu.kotatsu.tracker.domain.Tracker
|
||||||
import org.koitharu.kotatsu.tracker.domain.model.MangaUpdates
|
import org.koitharu.kotatsu.tracker.domain.model.MangaUpdates
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
import javax.inject.Provider
|
||||||
import com.google.android.material.R as materialR
|
import com.google.android.material.R as materialR
|
||||||
|
|
||||||
@HiltWorker
|
@HiltWorker
|
||||||
@@ -303,11 +306,15 @@ class TrackWorker @AssistedInject constructor(
|
|||||||
class Scheduler @Inject constructor(
|
class Scheduler @Inject constructor(
|
||||||
private val workManager: WorkManager,
|
private val workManager: WorkManager,
|
||||||
private val settings: AppSettings,
|
private val settings: AppSettings,
|
||||||
|
private val dbProvider: Provider<MangaDatabase>,
|
||||||
) : PeriodicWorkScheduler {
|
) : PeriodicWorkScheduler {
|
||||||
|
|
||||||
override suspend fun schedule() {
|
override suspend fun schedule() {
|
||||||
val constraints = createConstraints()
|
val constraints = createConstraints()
|
||||||
val request = PeriodicWorkRequestBuilder<TrackWorker>(4, TimeUnit.HOURS)
|
val runCount = dbProvider.get().getTracksDao().getTracksCount()
|
||||||
|
val runsPerFullCheck = (runCount / BATCH_SIZE.toFloat()).toIntUp()
|
||||||
|
val interval = (6 / runsPerFullCheck).coerceAtLeast(2)
|
||||||
|
val request = PeriodicWorkRequestBuilder<TrackWorker>(interval.toLong(), TimeUnit.HOURS)
|
||||||
.setConstraints(constraints)
|
.setConstraints(constraints)
|
||||||
.addTag(TAG)
|
.addTag(TAG)
|
||||||
.setBackoffCriteria(BackoffPolicy.LINEAR, 30, TimeUnit.MINUTES)
|
.setBackoffCriteria(BackoffPolicy.LINEAR, 30, TimeUnit.MINUTES)
|
||||||
|
|||||||
Reference in New Issue
Block a user