private async Task <TraktSyncResponse> SendEpisodePlaystateUpdatesInternalAsync(IEnumerable <Episode> episodeChunk, TraktUser traktUser, bool seen, CancellationToken cancellationToken) { var data = new TraktSyncWatched { episodes = new List <TraktEpisodeWatched>(), shows = new List <TraktShowWatched>() }; foreach (var episode in episodeChunk) { var tvDbId = episode.GetProviderId(MetadataProvider.Tvdb); var lastPlayedDate = seen ? _userDataManager.GetUserData(new Guid(traktUser.LinkedMbUserId), episode) .LastPlayedDate : null; if (!string.IsNullOrEmpty(tvDbId) && (!episode.IndexNumber.HasValue || !episode.IndexNumberEnd.HasValue || episode.IndexNumberEnd <= episode.IndexNumber)) { data.episodes.Add(new TraktEpisodeWatched { ids = new TraktEpisodeId { tvdb = int.Parse(tvDbId) }, watched_at = lastPlayedDate.HasValue ? lastPlayedDate.Value.ToISO8601() : null }); } else if (episode.IndexNumber != null) { var indexNumber = episode.IndexNumber.Value; var finalNumber = (episode.IndexNumberEnd ?? episode.IndexNumber).Value; var syncShow = data.shows.FirstOrDefault(sre => sre.ids != null && sre.ids.tvdb == episode.Series.GetProviderId(MetadataProvider.Tvdb).ConvertToInt()); if (syncShow == null) { syncShow = new TraktShowWatched { ids = new TraktShowId { tvdb = episode.Series.GetProviderId(MetadataProvider.Tvdb).ConvertToInt(), imdb = episode.Series.GetProviderId(MetadataProvider.Imdb), tvrage = episode.Series.GetProviderId(MetadataProvider.TvRage).ConvertToInt() }, seasons = new List <TraktSeasonWatched>() }; data.shows.Add(syncShow); } var syncSeason = syncShow.seasons.FirstOrDefault(ss => ss.number == episode.GetSeasonNumber()); if (syncSeason == null) { syncSeason = new TraktSeasonWatched { number = episode.GetSeasonNumber(), episodes = new List <TraktEpisodeWatched>() }; syncShow.seasons.Add(syncSeason); } for (var number = indexNumber; number <= finalNumber; number++) { syncSeason.episodes.Add(new TraktEpisodeWatched { number = number, watched_at = lastPlayedDate.HasValue ? lastPlayedDate.Value.ToISO8601() : null }); } } } var url = seen ? TraktUris.SyncWatchedHistoryAdd : TraktUris.SyncWatchedHistoryRemove; using (var response = await PostToTrakt(url, data, cancellationToken, traktUser).ConfigureAwait(false)) { return(await JsonSerializer.DeserializeAsync <TraktSyncResponse>(response, _jsonOptions).ConfigureAwait(false)); } }
private async Task <TraktSyncResponse> SendEpisodePlaystateUpdatesInternalAsync(IEnumerable <Episode> episodeChunk, TraktUser traktUser, bool seen, CancellationToken cancellationToken, bool useProviderIDs = true) { var data = new TraktSyncWatched { Episodes = new List <TraktEpisodeWatched>(), Shows = new List <TraktShowWatched>() }; foreach (var episode in episodeChunk) { var lastPlayedDate = seen ? _userDataManager.GetUserData(new Guid(traktUser.LinkedMbUserId), episode) .LastPlayedDate : null; if (useProviderIDs && HasAnyProviderTvIds(episode) && (!episode.IndexNumber.HasValue || !episode.IndexNumberEnd.HasValue || episode.IndexNumberEnd <= episode.IndexNumber)) { data.Episodes.Add(new TraktEpisodeWatched { Ids = GetTraktTvIds <Episode, TraktEpisodeId>(episode), WatchedAt = lastPlayedDate.HasValue ? lastPlayedDate.Value.ToISO8601() : null }); } else if (episode.IndexNumber != null) { var indexNumber = episode.IndexNumber.Value; var finalNumber = (episode.IndexNumberEnd ?? episode.IndexNumber).Value; var syncShow = FindShow(data.Shows, episode.Series); if (syncShow == null) { syncShow = new TraktShowWatched { Ids = GetTraktTvIds <Series, TraktShowId>(episode.Series), Seasons = new List <TraktSeasonWatched>() }; data.Shows.Add(syncShow); } var syncSeason = syncShow.Seasons.FirstOrDefault(ss => ss.Number == episode.GetSeasonNumber()); if (syncSeason == null) { syncSeason = new TraktSeasonWatched { Number = episode.GetSeasonNumber(), Episodes = new List <TraktEpisodeWatched>() }; syncShow.Seasons.Add(syncSeason); } for (var number = indexNumber; number <= finalNumber; number++) { syncSeason.Episodes.Add(new TraktEpisodeWatched { Number = number, WatchedAt = lastPlayedDate.HasValue ? lastPlayedDate.Value.ToISO8601() : null }); } } } var url = seen ? TraktUris.SyncWatchedHistoryAdd : TraktUris.SyncWatchedHistoryRemove; using (var response = await PostToTrakt(url, data, traktUser, cancellationToken).ConfigureAwait(false)) { var tsr = await JsonSerializer.DeserializeAsync <TraktSyncResponse>(response, _jsonOptions, cancellationToken).ConfigureAwait(false); if (useProviderIDs && tsr.NotFound.Episodes.Count > 0) { // send subset of episodes back to trakt to try without ids _logger.LogDebug("Resend episodes playstate update, without episode IDs"); await SendEpisodePlaystateUpdatesInternalAsync(FindNotFoundEpisodes(episodeChunk, tsr), traktUser, seen, cancellationToken, false).ConfigureAwait(false); } return(tsr); } }
private async Task <TraktSyncResponse> SendEpisodePlaystateUpdatesInternalAsync(IEnumerable <Episode> episodeChunk, TraktUser traktUser, bool seen, CancellationToken cancellationToken) { var data = new TraktSyncWatched { Episodes = new List <TraktEpisodeWatched>(), Shows = new List <TraktShowWatched>() }; foreach (var episode in episodeChunk) { var tvDbId = episode.GetProviderId(MetadataProviders.Tvdb); var lastPlayedDate = seen ? _userDataManager.GetUserData(new Guid(traktUser.LinkedMbUserId), episode.GetUserDataKey()) .LastPlayedDate : null; if (!string.IsNullOrEmpty(tvDbId) && (!episode.IndexNumberEnd.HasValue || episode.IndexNumberEnd == episode.IndexNumber)) { data.Episodes.Add(new TraktEpisodeWatched { Ids = new TraktEpisodeId { Tvdb = int.Parse(tvDbId) }, WatchedAt = lastPlayedDate.HasValue ? lastPlayedDate.Value.ToISO8601() : null }); } else if (episode.IndexNumber.HasValue) { var syncShow = data.Shows.FirstOrDefault(sre => sre.Ids != null && sre.Ids.Tvdb == episode.Series.GetProviderId(MetadataProviders.Tvdb).ConvertToInt()); if (syncShow == null) { syncShow = new TraktShowWatched { Ids = new TraktShowId { Tvdb = episode.Series.GetProviderId(MetadataProviders.Tvdb).ConvertToInt(), Imdb = episode.Series.GetProviderId(MetadataProviders.Imdb), TvRage = episode.Series.GetProviderId(MetadataProviders.TvRage).ConvertToInt() }, Seasons = new List <TraktSeasonWatched>() }; data.Shows.Add(syncShow); } var syncSeason = syncShow.Seasons.FirstOrDefault(ss => ss.Number == episode.GetSeasonNumber()); if (syncSeason == null) { syncSeason = new TraktSeasonWatched { Number = episode.GetSeasonNumber(), Episodes = new List <TraktEpisodeWatched>() }; syncShow.Seasons.Add(syncSeason); } syncSeason.Episodes.AddRange(Enumerable.Range(episode.IndexNumber.Value, ((episode.IndexNumberEnd ?? episode.IndexNumber).Value - episode.IndexNumber.Value) + 1) .Select(number => new TraktEpisodeWatched { Number = number, WatchedAt = lastPlayedDate.HasValue ? lastPlayedDate.Value.ToISO8601() : null }) .ToList()); } } var url = seen ? TraktUris.SyncWatchedHistoryAdd : TraktUris.SyncWatchedHistoryRemove; var response = await PostToTrakt(url, data, cancellationToken, traktUser); return(_jsonSerializer.DeserializeFromStream <TraktSyncResponse>(response)); }