/// <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); }
/// <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); }
/// <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); }
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); }
/// <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; }
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(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) { 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)); }