コード例 #1
0
        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));
            }
        }
コード例 #2
0
    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);
        }
    }
コード例 #3
0
        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));
        }