From cbbe65aab3f7edf7f6d7e0fe3f4eebca40d00889 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Thu, 30 Apr 2026 23:42:22 +0530 Subject: [PATCH] fix: add shouldSyncToTraktHistory method to prevent sending whole season marked to trakt while marking ep --- .../watching/sync/TraktWatchedSyncAdapter.kt | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/sync/TraktWatchedSyncAdapter.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/sync/TraktWatchedSyncAdapter.kt index 714dbcf7..9267011e 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/sync/TraktWatchedSyncAdapter.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/watching/sync/TraktWatchedSyncAdapter.kt @@ -107,6 +107,8 @@ object TraktWatchedSyncAdapter : WatchedSyncAdapter { val shows = mutableListOf() items.forEach { item -> + if (!item.shouldSyncToTraktHistory()) return@forEach + val ids = parseIds(item.id) ?: return@forEach val normalizedType = item.type.trim().lowercase() @@ -161,16 +163,11 @@ object TraktWatchedSyncAdapter : WatchedSyncAdapter { ), ) } - } else { - // Series-level mark (no season/episode) → mark entire show - shows += TraktHistoryShowRequestDto( - title = item.name.takeIf { it.isNotBlank() }, - year = parseYear(item.releaseInfo), - ids = ids, - ) } } + if (movies.isEmpty() && shows.isEmpty()) return + val body = json.encodeToString( TraktHistoryAddRequestDto( movies = movies.takeIf { it.isNotEmpty() }, @@ -202,6 +199,8 @@ object TraktWatchedSyncAdapter : WatchedSyncAdapter { val shows = mutableListOf() items.forEach { item -> + if (!item.shouldSyncToTraktHistory()) return@forEach + val ids = parseIds(item.id) ?: return@forEach val normalizedType = item.type.trim().lowercase() @@ -225,15 +224,11 @@ object TraktWatchedSyncAdapter : WatchedSyncAdapter { ), ), ) - } else { - shows += TraktHistoryShowRequestDto( - title = item.name.takeIf { it.isNotBlank() }, - year = parseYear(item.releaseInfo), - ids = ids, - ) } } + if (movies.isEmpty() && shows.isEmpty()) return + val body = json.encodeToString( TraktHistoryRemoveRequestDto( movies = movies.takeIf { it.isNotEmpty() }, @@ -348,6 +343,13 @@ object TraktWatchedSyncAdapter : WatchedSyncAdapter { private fun Int.pad4(): String = "$this".padStart(4, '0') } +internal fun WatchedItem.shouldSyncToTraktHistory(): Boolean { + val normalizedType = type.trim().lowercase() + return normalizedType == "movie" || + normalizedType == "film" || + (season != null && episode != null) +} + // ── DTOs for pull (GET /sync/watched) ─────────────────────────────────── @Serializable