Add periodic sync

This commit is contained in:
Bartu Özen
2025-12-12 16:01:40 +03:00
parent fde921d256
commit 1d41d2c634
3 changed files with 44 additions and 1 deletions

View File

@@ -1072,6 +1072,13 @@ class ServerConfig(
privacySafe = true, privacySafe = true,
) )
val syncInterval: MutableStateFlow<Int> by IntSetting(
protoNumber = 94,
defaultValue = 0,
group = SettingGroup.SYNCYOMI,
privacySafe = true,
)
/** ****************************************************************** **/ /** ****************************************************************** **/
/** **/ /** **/
/** Renamed settings **/ /** Renamed settings **/

View File

@@ -3,6 +3,10 @@ package suwayomi.tachidesk.global.impl.sync
import android.app.Application import android.app.Application
import android.content.Context import android.content.Context
import io.github.oshai.kotlinlogging.KotlinLogging import io.github.oshai.kotlinlogging.KotlinLogging
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.launch
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlinx.serialization.protobuf.ProtoBuf import kotlinx.serialization.protobuf.ProtoBuf
import org.jetbrains.exposed.sql.selectAll import org.jetbrains.exposed.sql.selectAll
@@ -26,10 +30,12 @@ import suwayomi.tachidesk.manga.model.table.MangaStatus
import suwayomi.tachidesk.manga.model.table.MangaTable import suwayomi.tachidesk.manga.model.table.MangaTable
import suwayomi.tachidesk.manga.model.table.toDataClass import suwayomi.tachidesk.manga.model.table.toDataClass
import suwayomi.tachidesk.server.serverConfig import suwayomi.tachidesk.server.serverConfig
import suwayomi.tachidesk.util.HAScheduler
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import java.util.Date import java.util.Date
import kotlin.system.measureTimeMillis import kotlin.system.measureTimeMillis
import kotlin.time.Duration.Companion.minutes
@Serializable @Serializable
data class SyncData( data class SyncData(
@@ -40,6 +46,33 @@ object SyncManager {
private val syncPreferences = Injekt.get<Application>().getSharedPreferences("sync", Context.MODE_PRIVATE) private val syncPreferences = Injekt.get<Application>().getSharedPreferences("sync", Context.MODE_PRIVATE)
private val logger = KotlinLogging.logger {} private val logger = KotlinLogging.logger {}
@OptIn(DelicateCoroutinesApi::class)
fun scheduleSyncTask() {
serverConfig.subscribeTo(
combine(
serverConfig.syncYomiEnabled,
serverConfig.syncInterval,
) { enabled, interval -> Pair(enabled, interval) },
{ (enabled, interval) ->
if (enabled && interval > 0) {
val intervalMs = interval.minutes.inWholeMilliseconds
HAScheduler.schedule(
{
GlobalScope.launch {
syncData()
}
},
interval = intervalMs,
delay = intervalMs,
name = "sync",
)
}
},
ignoreInitialValue = false,
)
}
suspend fun syncData() { suspend fun syncData() {
transaction { transaction {
MangaTable.update({ MangaTable.isSyncing eq true }) { MangaTable.update({ MangaTable.isSyncing eq true }) {
@@ -56,7 +89,7 @@ object SyncManager {
includeManga = serverConfig.syncDataManga.value, includeManga = serverConfig.syncDataManga.value,
includeCategories = serverConfig.syncDataCategories.value, includeCategories = serverConfig.syncDataCategories.value,
includeChapters = serverConfig.syncDataChapters.value, includeChapters = serverConfig.syncDataChapters.value,
includeTracking = serverConfig.syncDataTracking.value, includeTracking = serverConfig.syncDataTracking.value,
includeHistory = serverConfig.syncDataHistory.value, includeHistory = serverConfig.syncDataHistory.value,
includeClientData = false, includeClientData = false,
includeServerSettings = false, includeServerSettings = false,

View File

@@ -38,6 +38,7 @@ import org.koin.core.context.startKoin
import org.koin.core.module.Module import org.koin.core.module.Module
import org.koin.dsl.module import org.koin.dsl.module
import suwayomi.tachidesk.global.impl.KcefWebView.Companion.toCefCookie import suwayomi.tachidesk.global.impl.KcefWebView.Companion.toCefCookie
import suwayomi.tachidesk.global.impl.sync.SyncManager
import suwayomi.tachidesk.graphql.types.DatabaseType import suwayomi.tachidesk.graphql.types.DatabaseType
import suwayomi.tachidesk.i18n.LocalizationHelper import suwayomi.tachidesk.i18n.LocalizationHelper
import suwayomi.tachidesk.manga.impl.backup.proto.ProtoBackupExport import suwayomi.tachidesk.manga.impl.backup.proto.ProtoBackupExport
@@ -511,6 +512,8 @@ fun applicationSetup() {
// start DownloadManager and restore + resume downloads // start DownloadManager and restore + resume downloads
DownloadManager.restoreAndResumeDownloads() DownloadManager.restoreAndResumeDownloads()
SyncManager.scheduleSyncTask()
GlobalScope.launch { GlobalScope.launch {
val logger = KotlinLogging.logger("KCEF") val logger = KotlinLogging.logger("KCEF")
KCEF.init( KCEF.init(