예제 #1
0
        /// <summary>
        /// Send a list of movies to trakt.tv that have been marked watched or unwatched
        /// </summary>
        /// <param name="movies">The list of movies to send</param>
        /// <param name="traktUser">The trakt user profile that is being updated</param>
        /// <param name="seen">True if movies are being marked seen, false otherwise</param>
        /// <param name="cancellationToken">The Cancellation Token</param>
        /// <returns></returns>
        public async Task <List <TraktSyncResponse> > SendMoviePlaystateUpdates(List <Movie> movies, TraktUser traktUser,
                                                                                bool seen, CancellationToken cancellationToken)
        {
            if (movies == null)
            {
                throw new ArgumentNullException("movies");
            }
            if (traktUser == null)
            {
                throw new ArgumentNullException("traktUser");
            }
            if (!traktUser.PostWatchedHistory)
            {
                return(new List <TraktSyncResponse>());
            }

            var moviesPayload = movies.Select(m =>
            {
                var lastPlayedDate = seen
                    ? _userDataManager.GetUserData(new Guid(traktUser.LinkedMbUserId), m).LastPlayedDate
                    : null;
                return(new TraktMovieWatched
                {
                    Title = m.Name,
                    Ids = new TraktMovieId
                    {
                        Imdb = m.GetProviderId(MetadataProviders.Imdb),
                        Tmdb =
                            string.IsNullOrEmpty(m.GetProviderId(MetadataProviders.Tmdb))
                                ? (int?)null
                                : int.Parse(m.GetProviderId(MetadataProviders.Tmdb))
                    },
                    Year = m.ProductionYear,
                    WatchedAt = lastPlayedDate.HasValue ? lastPlayedDate.Value.ToISO8601() : null
                });
            }).ToList();
            var chunks         = moviesPayload.ToChunks(100).ToList();
            var traktResponses = new List <TraktSyncResponse>();

            foreach (var chunk in chunks)
            {
                var data = new TraktSyncWatched
                {
                    Movies = chunk.ToList()
                };
                var url = seen ? TraktUris.SyncWatchedHistoryAdd : TraktUris.SyncWatchedHistoryRemove;

                using (var response = await PostToTrakt(url, data, cancellationToken, traktUser))
                {
                    if (response != null)
                    {
                        traktResponses.Add(_jsonSerializer.DeserializeFromStream <TraktSyncResponse>(response));
                    }
                }
            }
            return(traktResponses);
        }
예제 #2
0
        /// <summary>
        /// Send a list of movies to trakt.tv that have been marked watched or unwatched.
        /// </summary>
        /// <param name="movies">The list of movies to send</param>
        /// <param name="traktUser">The trakt user profile that is being updated</param>
        /// <param name="seen">True if movies are being marked seen, false otherwise</param>
        /// <param name="cancellationToken">The Cancellation Token</param>
        /// <returns></returns>
        // TODO: netstandard2.1: use IAsyncEnumerable
        public async Task <List <TraktSyncResponse> > SendMoviePlaystateUpdates(List <Movie> movies, TraktUser traktUser, bool seen, CancellationToken cancellationToken)
        {
            if (movies == null)
            {
                throw new ArgumentNullException(nameof(movies));
            }

            if (traktUser == null)
            {
                throw new ArgumentNullException(nameof(traktUser));
            }

            var moviesPayload = movies.Select(m =>
            {
                var lastPlayedDate = seen
                    ? _userDataManager.GetUserData(new Guid(traktUser.LinkedMbUserId), m).LastPlayedDate
                    : null;
                return(new TraktMovieWatched
                {
                    title = m.Name,
                    ids = new TraktMovieId
                    {
                        imdb = m.GetProviderId(MetadataProvider.Imdb),
                        tmdb =
                            string.IsNullOrEmpty(m.GetProviderId(MetadataProvider.Tmdb))
                                ? (int?)null
                                : ParseId(m.GetProviderId(MetadataProvider.Tmdb))
                    },
                    year = m.ProductionYear,
                    watched_at = lastPlayedDate?.ToISO8601()
                });
            }).ToList();
            var chunks         = moviesPayload.ToChunks(100).ToList();
            var traktResponses = new List <TraktSyncResponse>();

            foreach (var chunk in chunks)
            {
                var data = new TraktSyncWatched
                {
                    movies = chunk.ToList()
                };
                var url = seen ? TraktUris.SyncWatchedHistoryAdd : TraktUris.SyncWatchedHistoryRemove;

                using (var response = await PostToTrakt(url, data, cancellationToken, traktUser).ConfigureAwait(false))
                {
                    if (response != null)
                    {
                        traktResponses.Add(await JsonSerializer.DeserializeAsync <TraktSyncResponse>(response, _jsonOptions).ConfigureAwait(false));
                    }
                }
            }

            return(traktResponses);
        }
예제 #3
0
    /// <summary>
    /// Send a list of movies to trakt.tv that have been marked watched or unwatched.
    /// </summary>
    /// <param name="movies">The list of movies to send</param>
    /// <param name="traktUser">The trakt user profile that is being updated</param>
    /// <param name="seen">True if movies are being marked seen, false otherwise</param>
    /// <param name="cancellationToken">The Cancellation Token</param>
    /// <returns></returns>
    // TODO: netstandard2.1: use IAsyncEnumerable
    public async Task <List <TraktSyncResponse> > SendMoviePlaystateUpdates(List <Movie> movies, TraktUser traktUser, bool seen, CancellationToken cancellationToken)
    {
        if (movies == null)
        {
            throw new ArgumentNullException(nameof(movies));
        }

        if (traktUser == null)
        {
            throw new ArgumentNullException(nameof(traktUser));
        }

        var moviesPayload = movies.Select(m =>
        {
            var lastPlayedDate = seen
                ? _userDataManager.GetUserData(new Guid(traktUser.LinkedMbUserId), m).LastPlayedDate
                : null;
            return(new TraktMovieWatched
            {
                Title = m.Name,
                Ids = GetTraktIMDBTMDBIds <Movie, TraktMovieId>(m),
                Year = m.ProductionYear,
                WatchedAt = lastPlayedDate?.ToISO8601()
            });
        }).ToList();
        var chunks         = moviesPayload.ToChunks(100).ToList();
        var traktResponses = new List <TraktSyncResponse>();

        foreach (var chunk in chunks)
        {
            var data = new TraktSyncWatched
            {
                Movies = chunk.ToList()
            };
            var url = seen ? TraktUris.SyncWatchedHistoryAdd : TraktUris.SyncWatchedHistoryRemove;

            using (var response = await PostToTrakt(url, data, traktUser, cancellationToken).ConfigureAwait(false))
            {
                if (response != null)
                {
                    traktResponses.Add(await JsonSerializer.DeserializeAsync <TraktSyncResponse>(response, _jsonOptions, cancellationToken).ConfigureAwait(false));
                }
            }
        }

        return(traktResponses);
    }
예제 #4
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);
        }
예제 #5
0
        /// <summary>
        /// Send a list of movies to trakt.tv that have been marked watched or unwatched
        /// </summary>
        /// <param name="movies">The list of movies to send</param>
        /// <param name="traktUser">The trakt user profile that is being updated</param>
        /// <param name="seen">True if movies are being marked seen, false otherwise</param>
        /// <param name="cancellationToken">The Cancellation Token</param>
        /// <returns></returns>
        public async Task<List<TraktSyncResponse>> SendMoviePlaystateUpdates(List<Movie> movies, TraktUser traktUser,
            bool seen, CancellationToken cancellationToken)
        {
            if (movies == null)
                throw new ArgumentNullException("movies");
            if (traktUser == null)
                throw new ArgumentNullException("traktUser");

            var moviesPayload = movies.Select(m =>
            {
                var lastPlayedDate = seen
                    ? _userDataManager.GetUserData(new Guid(traktUser.LinkedMbUserId), m.GetUserDataKey()).LastPlayedDate
                    : null;
                return new TraktMovieWatched
                {
                    Title = m.Name,
                    Ids = new TraktMovieId
                    {
                        Imdb = m.GetProviderId(MetadataProviders.Imdb),
                        Tmdb =
                            string.IsNullOrEmpty(m.GetProviderId(MetadataProviders.Tmdb))
                                ? (int?) null
                                : int.Parse(m.GetProviderId(MetadataProviders.Tmdb))
                    },
                    Year = m.ProductionYear,
                    WatchedAt = lastPlayedDate.HasValue ? lastPlayedDate.Value.ToISO8601() : null
                };
            }).ToList();
            var chunks = moviesPayload.ToChunks(100).ToList();
            var traktResponses = new List<TraktSyncResponse>();

            foreach (var chunk in chunks)
            {
                var data = new TraktSyncWatched
                {
                    Movies = chunk.ToList()
                };
                var url = seen ? TraktUris.SyncWatchedHistoryAdd : TraktUris.SyncWatchedHistoryRemove;

                var response = await PostToTrakt(url, data, cancellationToken, traktUser);
                if (response != null)
                    traktResponses.Add(_jsonSerializer.DeserializeFromStream<TraktSyncResponse>(response));
            }
            return traktResponses;
        }
예제 #6
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);
        }
    }
예제 #7
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));
            }
        }
예제 #8
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));
        }