Fix episode removal in simkl (#555)

This commit is contained in:
self-similarity 2023-08-15 18:37:33 +00:00 committed by GitHub
parent 4d98690adb
commit 4e01d327c6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -60,8 +60,8 @@ class SimklApi(index: Int) : AccountManager(index), SyncAPI {
private var lastScoreTime = -1L private var lastScoreTime = -1L
companion object { companion object {
private const val clientId = BuildConfig.SIMKL_CLIENT_ID private const val clientId: String = BuildConfig.SIMKL_CLIENT_ID
private const val clientSecret = BuildConfig.SIMKL_CLIENT_SECRET private const val clientSecret: String = BuildConfig.SIMKL_CLIENT_SECRET
private var lastLoginState = "" private var lastLoginState = ""
const val SIMKL_TOKEN_KEY: String = "simkl_token" const val SIMKL_TOKEN_KEY: String = "simkl_token"
@ -498,6 +498,9 @@ class SimklApi(index: Int) : AccountManager(index), SyncAPI {
val episodes: Array<EpisodeMetadata>?, val episodes: Array<EpisodeMetadata>?,
override var isFavorite: Boolean? = null, override var isFavorite: Boolean? = null,
override var maxEpisodes: Int? = null, override var maxEpisodes: Int? = null,
/** Save seen episodes separately to know the change from old to new.
* Required to remove seen episodes if count decreases */
val oldEpisodes: Int,
) : SyncAPI.AbstractSyncStatus() ) : SyncAPI.AbstractSyncStatus()
override suspend fun getStatus(id: String): SyncAPI.AbstractSyncStatus? { override suspend fun getStatus(id: String): SyncAPI.AbstractSyncStatus? {
@ -521,7 +524,8 @@ class SimklApi(index: Int) : AccountManager(index), SyncAPI {
score = foundItem.user_rating, score = foundItem.user_rating,
watchedEpisodes = foundItem.watched_episodes_count, watchedEpisodes = foundItem.watched_episodes_count,
maxEpisodes = foundItem.total_episodes_count, maxEpisodes = foundItem.total_episodes_count,
episodes = episodes episodes = episodes,
oldEpisodes = foundItem.watched_episodes_count ?: 0,
) )
} else { } else {
return if (searchResult != null) { return if (searchResult != null) {
@ -530,7 +534,8 @@ class SimklApi(index: Int) : AccountManager(index), SyncAPI {
score = 0, score = 0,
watchedEpisodes = 0, watchedEpisodes = 0,
maxEpisodes = if (searchResult.type == "movie") 0 else null, maxEpisodes = if (searchResult.type == "movie") 0 else null,
episodes = episodes episodes = episodes,
oldEpisodes = 0,
) )
} else { } else {
null null
@ -604,32 +609,46 @@ class SimklApi(index: Int) : AccountManager(index), SyncAPI {
SimklListStatusType.ReWatching.value SimklListStatusType.ReWatching.value
).contains(status.status) ).contains(status.status)
) { ) {
val cutEpisodes = simklStatus.episodes.take(watchedEpisodes) suspend fun postEpisodes(
url: String,
val (seasons, episodes) = if (cutEpisodes.any { it.season != null }) { rawEpisodes: List<EpisodeMetadata>
EpisodeMetadata.convertToSeasons(cutEpisodes) to null ): Boolean {
} else { val (seasons, episodes) = if (rawEpisodes.any { it.season != null }) {
null to EpisodeMetadata.convertToEpisodes(cutEpisodes) EpisodeMetadata.convertToSeasons(rawEpisodes) to null
} else {
null to EpisodeMetadata.convertToEpisodes(rawEpisodes)
}
debugPrint { "Synced history using $url: seasons=${seasons?.toList()}, episodes=${episodes?.toList()}" }
return app.post(
url,
json = StatusRequest(
shows = listOf(
HistoryMediaObject(
null,
null,
MediaObject.Ids.fromMap(parsedId),
seasons,
episodes
)
),
movies = emptyList()
),
interceptor = interceptor
).isSuccessful
} }
debugPrint { "Synced history for ${status.watchedEpisodes} given size of ${simklStatus.episodes.size}: seasons=${seasons?.toList()}, episodes=${episodes?.toList()}" } // If episodes decrease: remove all episodes beyond watched episodes.
val episodeResponse = app.post( val removeResponse = if (simklStatus.oldEpisodes > watchedEpisodes) {
"$mainUrl/sync/history", val removeEpisodes = simklStatus.episodes
json = StatusRequest( .drop(watchedEpisodes)
shows = listOf( postEpisodes("$mainUrl/sync/history/remove", removeEpisodes)
HistoryMediaObject( } else {
null, true
null, }
MediaObject.Ids.fromMap(parsedId), val cutEpisodes = simklStatus.episodes.take(watchedEpisodes)
seasons, val addResponse = postEpisodes("$mainUrl/sync/history/", cutEpisodes)
episodes
) removeResponse && addResponse
),
movies = emptyList()
),
interceptor = interceptor
)
episodeResponse.isSuccessful
} else true } else true
val newStatus = val newStatus =