/// <summary> /// Add or remove a Show(Series) to/from the users trakt.tv library /// </summary> /// <param name="show">The show to remove</param> /// <param name="traktUser">The user who's library is being updated</param> /// <param name="cancellationToken">The cancellation token.</param> /// <param name="eventType"></param> /// <returns>Task{TraktResponseDataContract}.</returns> public async Task<TraktSyncResponse> SendLibraryUpdateAsync(Series show, TraktUser traktUser, CancellationToken cancellationToken, EventType eventType) { if (show == null) throw new ArgumentNullException("show"); if (traktUser == null) throw new ArgumentNullException("traktUser"); if (eventType == EventType.Update) return null; var showPayload = new List<TraktShowCollected> { new TraktShowCollected { Title = show.Name, Year = show.ProductionYear, Ids = new TraktShowId { Tvdb = show.GetProviderId(MetadataProviders.Tvdb).ConvertToInt(), Imdb = show.GetProviderId(MetadataProviders.Imdb), TvRage = show.GetProviderId(MetadataProviders.TvRage).ConvertToInt() }, } }; var data = new TraktSyncCollected { Shows = showPayload.ToList() }; var url = eventType == EventType.Add ? TraktUris.SyncCollectionAdd : TraktUris.SyncCollectionRemove; using (var response = await PostToTrakt(url, data, cancellationToken, traktUser)) { return _jsonSerializer.DeserializeFromStream<TraktSyncResponse>(response); } }
/// <summary> /// Add or remove a list of movies to/from the users trakt.tv library /// </summary> /// <param name="movies">The movies to add</param> /// <param name="traktUser">The user who's library is being updated</param> /// <param name="eventType"></param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task{TraktResponseDataContract}.</returns> public async Task <IEnumerable <TraktSyncResponse> > SendLibraryUpdateAsync( IList <Movie> movies, TraktUser traktUser, EventType eventType, CancellationToken cancellationToken) { if (movies == null) { throw new ArgumentNullException(nameof(movies)); } if (traktUser == null) { throw new ArgumentNullException(nameof(traktUser)); } if (eventType == EventType.Update) { return(null); } var moviesPayload = movies.Select(m => { var audioStream = m.GetMediaStreams().FirstOrDefault(x => x.Type == MediaStreamType.Audio); var traktMovieCollected = new TraktMovieCollected { CollectedAt = m.DateCreated.ToISO8601(), Title = m.Name, Year = m.ProductionYear, Ids = GetTraktIMDBTMDBIds <Movie, TraktMovieId>(m) }; if (traktUser.ExportMediaInfo) { traktMovieCollected.AudioChannels = audioStream.GetAudioChannels(); traktMovieCollected.Audio = audioStream.GetCodecRepresetation(); traktMovieCollected.Resolution = m.GetDefaultVideoStream().GetResolution(); } return(traktMovieCollected); }).ToList(); var url = eventType == EventType.Add ? TraktUris.SyncCollectionAdd : TraktUris.SyncCollectionRemove; var responses = new List <TraktSyncResponse>(); var chunks = moviesPayload.ToChunks(100); foreach (var chunk in chunks) { var data = new TraktSyncCollected { Movies = chunk.ToList() }; using (var response = await PostToTrakt(url, data, traktUser, cancellationToken).ConfigureAwait(false)) { responses.Add(await JsonSerializer.DeserializeAsync <TraktSyncResponse>(response, _jsonOptions, cancellationToken).ConfigureAwait(false)); } } return(responses); }
/// <summary> /// Add or remove a list of movies to/from the users trakt.tv library /// </summary> /// <param name="movies">The movies to add</param> /// <param name="traktUser">The user who's library is being updated</param> /// <param name="cancellationToken">The cancellation token.</param> /// <param name="eventType"></param> /// <returns>Task{TraktResponseDataContract}.</returns> public async Task <IEnumerable <TraktSyncResponse> > SendLibraryUpdateAsync(List <Movie> movies, TraktUser traktUser, CancellationToken cancellationToken, EventType eventType) { if (movies == null) { throw new ArgumentNullException("movies"); } if (traktUser == null) { throw new ArgumentNullException("traktUser"); } if (eventType == EventType.Update) { return(null); } var moviesPayload = movies.Select(m => { var audioStream = m.GetMediaStreams().FirstOrDefault(x => x.Type == MediaStreamType.Audio); var traktMovieCollected = new TraktMovieCollected { collected_at = m.DateCreated.ToISO8601(), title = m.Name, year = m.ProductionYear, ids = new TraktMovieId { imdb = m.GetProviderId(MetadataProviders.Imdb), tmdb = m.GetProviderId(MetadataProviders.Tmdb).ConvertToInt() } }; if (traktUser.ExportMediaInfo) { //traktMovieCollected.Is3D = m.Is3D; traktMovieCollected.audio_channels = audioStream.GetAudioChannels(); traktMovieCollected.audio = audioStream.GetCodecRepresetation(); traktMovieCollected.resolution = m.GetDefaultVideoStream().GetResolution(); } return(traktMovieCollected); }).ToList(); var url = eventType == EventType.Add ? TraktUris.SyncCollectionAdd : TraktUris.SyncCollectionRemove; var responses = new List <TraktSyncResponse>(); var chunks = moviesPayload.ToChunks(100); foreach (var chunk in chunks) { var data = new TraktSyncCollected { movies = chunk.ToList() }; using (var response = await PostToTrakt(url, data, cancellationToken, traktUser)) { responses.Add(_jsonSerializer.DeserializeFromStream <TraktSyncResponse>(response)); } } return(responses); }
/// <summary> /// Add or remove a Show(Series) to/from the users trakt.tv library /// </summary> /// <param name="show">The show to remove</param> /// <param name="traktUser">The user who's library is being updated</param> /// <param name="cancellationToken">The cancellation token.</param> /// <param name="eventType"></param> /// <returns>Task{TraktResponseDataContract}.</returns> public async Task <TraktSyncResponse> SendLibraryUpdateAsync( Series show, TraktUser traktUser, CancellationToken cancellationToken, EventType eventType) { if (show == null) { throw new ArgumentNullException(nameof(show)); } if (traktUser == null) { throw new ArgumentNullException(nameof(traktUser)); } if (eventType == EventType.Update) { return(null); } var showPayload = new List <TraktShowCollected> { new TraktShowCollected { title = show.Name, year = show.ProductionYear, ids = new TraktShowId { tvdb = show.GetProviderId(MetadataProvider.Tvdb).ConvertToInt(), imdb = show.GetProviderId(MetadataProvider.Imdb), tvrage = show.GetProviderId(MetadataProvider.TvRage).ConvertToInt() }, } }; var data = new TraktSyncCollected { shows = showPayload.ToList() }; var url = eventType == EventType.Add ? TraktUris.SyncCollectionAdd : TraktUris.SyncCollectionRemove; using (var response = await PostToTrakt(url, data, cancellationToken, traktUser).ConfigureAwait(false)) { return(await JsonSerializer.DeserializeAsync <TraktSyncResponse>(response, _jsonOptions).ConfigureAwait(false)); } }
/// <summary> /// Add or remove a Show(Series) to/from the users trakt.tv library /// </summary> /// <param name="show">The show to remove</param> /// <param name="traktUser">The user who's library is being updated</param> /// <param name="eventType"></param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task{TraktResponseDataContract}.</returns> public async Task <TraktSyncResponse> SendLibraryUpdateAsync( Series show, TraktUser traktUser, EventType eventType, CancellationToken cancellationToken) { if (show == null) { throw new ArgumentNullException(nameof(show)); } if (traktUser == null) { throw new ArgumentNullException(nameof(traktUser)); } if (eventType == EventType.Update) { return(null); } var showPayload = new List <TraktShowCollected> { new TraktShowCollected { Title = show.Name, Year = show.ProductionYear, Ids = GetTraktTvIds <Series, TraktShowId>(show) } }; var data = new TraktSyncCollected { Shows = showPayload.ToList() }; var url = eventType == EventType.Add ? TraktUris.SyncCollectionAdd : TraktUris.SyncCollectionRemove; using (var response = await PostToTrakt(url, data, traktUser, cancellationToken).ConfigureAwait(false)) { return(await JsonSerializer.DeserializeAsync <TraktSyncResponse>(response, _jsonOptions, cancellationToken).ConfigureAwait(false)); } }
/// <summary> /// Add or remove a Show(Series) to/from the users trakt.tv library /// </summary> /// <param name="show">The show to remove</param> /// <param name="traktUser">The user who's library is being updated</param> /// <param name="cancellationToken">The cancellation token.</param> /// <param name="eventType"></param> /// <returns>Task{TraktResponseDataContract}.</returns> public async Task<TraktSyncResponse> SendLibraryUpdateAsync(Series show, TraktUser traktUser, CancellationToken cancellationToken, EventType eventType) { if (show == null) throw new ArgumentNullException("show"); if (traktUser == null) throw new ArgumentNullException("traktUser"); if (eventType == EventType.Update) return null; var showPayload = new List<TraktShowCollected> { new TraktShowCollected { Title = show.Name, Year = show.ProductionYear, Ids = new TraktShowId { Tvdb = show.GetProviderId(MetadataProviders.Tvdb).ConvertToInt(), Imdb = show.GetProviderId(MetadataProviders.Imdb), TvRage = show.GetProviderId(MetadataProviders.TvRage).ConvertToInt() }, } }; var data = new TraktSyncCollected { Shows = showPayload.ToList() }; var url = eventType == EventType.Add ? TraktUris.SyncCollectionAdd : TraktUris.SyncCollectionRemove; var response = await PostToTrakt(url, data, cancellationToken, traktUser); return _jsonSerializer.DeserializeFromStream<TraktSyncResponse>(response); }
private async Task<TraktSyncResponse> SendLibraryUpdateInternalAsync(IReadOnlyList<Episode> episodes, TraktUser traktUser, CancellationToken cancellationToken, EventType eventType) { var episodesPayload = new List<TraktEpisodeCollected>(); var showPayload = new List<TraktShowCollected>(); foreach (var episode in episodes) { var audioStream = episode.GetMediaStreams().FirstOrDefault(x => x.Type == MediaStreamType.Audio); if ((episode.IndexNumberEnd == null || episode.IndexNumberEnd == episode.IndexNumber) && !string.IsNullOrEmpty(episode.GetProviderId(MetadataProviders.Tvdb))) { episodesPayload.Add(new TraktEpisodeCollected { CollectedAt = episode.DateCreated.ToISO8601(), Ids = new TraktEpisodeId { Tvdb = episode.GetProviderId(MetadataProviders.Tvdb).ConvertToInt() }, Is3D = episode.Is3D, AudioChannels = audioStream.GetAudioChannels(), Audio = audioStream.GetCodecRepresetation(), Resolution = episode.GetDefaultVideoStream().GetResolution() }); } // It's a multi-episode file. Add all episodes else if (episode.IndexNumber.HasValue) { var syncShow = showPayload.FirstOrDefault( sre => sre.Ids != null && sre.Ids.Tvdb == episode.Series.GetProviderId(MetadataProviders.Tvdb).ConvertToInt()); if (syncShow == null) { syncShow = new TraktShowCollected { 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<TraktShowCollected.TraktSeasonCollected>() }; showPayload.Add(syncShow); } var syncSeason = syncShow.Seasons.FirstOrDefault(ss => ss.Number == episode.GetSeasonNumber()); if (syncSeason == null) { syncSeason = new TraktShowCollected.TraktSeasonCollected { Number = episode.GetSeasonNumber(), Episodes = new List<TraktEpisodeCollected>() }; syncShow.Seasons.Add(syncSeason); } syncSeason.Episodes.AddRange(Enumerable.Range(episode.IndexNumber.Value, ((episode.IndexNumberEnd ?? episode.IndexNumber).Value - episode.IndexNumber.Value) + 1) .Select(number => new TraktEpisodeCollected { Number = number, CollectedAt = episode.DateCreated.ToISO8601(), Ids = new TraktEpisodeId { Tvdb = episode.GetProviderId(MetadataProviders.Tvdb).ConvertToInt() }, Is3D = episode.Is3D, AudioChannels = audioStream.GetAudioChannels(), Audio = audioStream.GetCodecRepresetation(), Resolution = episode.GetDefaultVideoStream().GetResolution() }) .ToList()); } } var data = new TraktSyncCollected { Episodes = episodesPayload.ToList(), Shows = showPayload.ToList() }; var url = eventType == EventType.Add ? TraktUris.SyncCollectionAdd : TraktUris.SyncCollectionRemove; var response = await PostToTrakt(url, data, cancellationToken, traktUser); return _jsonSerializer.DeserializeFromStream<TraktSyncResponse>(response); }
/// <summary> /// Add or remove a list of movies to/from the users trakt.tv library /// </summary> /// <param name="movies">The movies to add</param> /// <param name="traktUser">The user who's library is being updated</param> /// <param name="cancellationToken">The cancellation token.</param> /// <param name="eventType"></param> /// <returns>Task{TraktResponseDataContract}.</returns> public async Task<IEnumerable<TraktSyncResponse>> SendLibraryUpdateAsync(List<Movie> movies, TraktUser traktUser, CancellationToken cancellationToken, EventType eventType) { if (movies == null) throw new ArgumentNullException("movies"); if (traktUser == null) throw new ArgumentNullException("traktUser"); if (eventType == EventType.Update) return null; var moviesPayload = movies.Select(m => { var audioStream = m.GetMediaStreams().FirstOrDefault(x => x.Type == MediaStreamType.Audio); return new TraktMovieCollected { CollectedAt = m.DateCreated.ToISO8601(), Is3D = m.Is3D, AudioChannels = audioStream.GetAudioChannels(), Audio = audioStream.GetCodecRepresetation(), Resolution = m.GetDefaultVideoStream().GetResolution(), Title = m.Name, Year = m.ProductionYear, Ids = new TraktMovieId { Imdb = m.GetProviderId(MetadataProviders.Imdb), Tmdb = m.GetProviderId(MetadataProviders.Tmdb).ConvertToInt() } }; }).ToList(); var url = eventType == EventType.Add ? TraktUris.SyncCollectionAdd : TraktUris.SyncCollectionRemove; var responses = new List<TraktSyncResponse>(); var chunks = moviesPayload.ToChunks(100); foreach (var chunk in chunks) { var data = new TraktSyncCollected { Movies = chunk.ToList() }; var response = await PostToTrakt(url, data, cancellationToken, traktUser); responses.Add(_jsonSerializer.DeserializeFromStream<TraktSyncResponse>(response)); } return responses; }
private async Task <TraktSyncResponse> SendLibraryUpdateInternalAsync( IEnumerable <Episode> episodes, TraktUser traktUser, EventType eventType, CancellationToken cancellationToken, bool useProviderIDs = true) { var episodesPayload = new List <TraktEpisodeCollected>(); var showPayload = new List <TraktShowCollected>(); foreach (Episode episode in episodes) { var audioStream = episode.GetMediaStreams().FirstOrDefault(x => x.Type == MediaStreamType.Audio); if (useProviderIDs && HasAnyProviderTvIds(episode) && (!episode.IndexNumber.HasValue || !episode.IndexNumberEnd.HasValue || episode.IndexNumberEnd <= episode.IndexNumber)) { var traktEpisodeCollected = new TraktEpisodeCollected { CollectedAt = episode.DateCreated.ToISO8601(), Ids = GetTraktTvIds <Episode, TraktEpisodeId>(episode) }; if (traktUser.ExportMediaInfo) { // traktEpisodeCollected.Is3D = episode.Is3D; traktEpisodeCollected.AudioChannels = audioStream.GetAudioChannels(); traktEpisodeCollected.Audio = audioStream.GetCodecRepresetation(); traktEpisodeCollected.Resolution = episode.GetDefaultVideoStream().GetResolution(); } episodesPayload.Add(traktEpisodeCollected); } else if (episode.IndexNumber.HasValue) { var indexNumber = episode.IndexNumber.Value; var finalNumber = (episode.IndexNumberEnd ?? episode.IndexNumber).Value; var syncShow = FindShow(showPayload, episode.Series); if (syncShow == null) { syncShow = new TraktShowCollected { Ids = GetTraktTvIds <Series, TraktShowId>(episode.Series), Seasons = new List <TraktSeasonCollected>() }; showPayload.Add(syncShow); } var syncSeason = syncShow.Seasons.FirstOrDefault(ss => ss.Number == episode.GetSeasonNumber()); if (syncSeason == null) { syncSeason = new TraktSeasonCollected { Number = episode.GetSeasonNumber(), Episodes = new List <TraktEpisodeCollected>() }; syncShow.Seasons.Add(syncSeason); } for (var number = indexNumber; number <= finalNumber; number++) { var ids = new TraktEpisodeId(); if (number == indexNumber) { // Omit this from the rest because then we end up attaching the provider IDs of the first episode to the subsequent ones ids = GetTraktTvIds <Episode, TraktEpisodeId>(episode); } var traktEpisodeCollected = new TraktEpisodeCollected { Number = number, CollectedAt = episode.DateCreated.ToISO8601(), Ids = ids }; if (traktUser.ExportMediaInfo) { // traktEpisodeCollected.Is3D = episode.Is3D; traktEpisodeCollected.AudioChannels = audioStream.GetAudioChannels(); traktEpisodeCollected.Audio = audioStream.GetCodecRepresetation(); traktEpisodeCollected.Resolution = episode.GetDefaultVideoStream().GetResolution(); } syncSeason.Episodes.Add(traktEpisodeCollected); } } } var data = new TraktSyncCollected { Episodes = episodesPayload.ToList(), Shows = showPayload.ToList() }; var url = eventType == EventType.Add ? TraktUris.SyncCollectionAdd : TraktUris.SyncCollectionRemove; 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 Library update, without episode IDs"); await SendLibraryUpdateInternalAsync(FindNotFoundEpisodes(episodes, tsr), traktUser, eventType, cancellationToken, false).ConfigureAwait(false); } return(tsr); } }
private async Task <TraktSyncResponse> SendLibraryUpdateInternalAsync( IEnumerable <Episode> episodes, TraktUser traktUser, CancellationToken cancellationToken, EventType eventType) { var episodesPayload = new List <TraktEpisodeCollected>(); var showPayload = new List <TraktShowCollected>(); foreach (Episode episode in episodes) { var audioStream = episode.GetMediaStreams().FirstOrDefault(x => x.Type == MediaStreamType.Audio); var tvDbId = episode.GetProviderId(MetadataProvider.Tvdb); if (!string.IsNullOrEmpty(tvDbId) && (!episode.IndexNumber.HasValue || !episode.IndexNumberEnd.HasValue || episode.IndexNumberEnd <= episode.IndexNumber)) { var traktEpisodeCollected = new TraktEpisodeCollected { collected_at = episode.DateCreated.ToISO8601(), ids = new TraktEpisodeId { tvdb = tvDbId.ConvertToInt() } }; if (traktUser.ExportMediaInfo) { //traktEpisodeCollected.Is3D = episode.Is3D; traktEpisodeCollected.audio_channels = audioStream.GetAudioChannels(); traktEpisodeCollected.audio = audioStream.GetCodecRepresetation(); traktEpisodeCollected.resolution = episode.GetDefaultVideoStream().GetResolution(); } episodesPayload.Add(traktEpisodeCollected); } else if (episode.IndexNumber.HasValue) { var indexNumber = episode.IndexNumber.Value; var finalNumber = (episode.IndexNumberEnd ?? episode.IndexNumber).Value; var syncShow = showPayload.FirstOrDefault( sre => sre.ids != null && sre.ids.tvdb == episode.Series.GetProviderId(MetadataProvider.Tvdb).ConvertToInt()); if (syncShow == null) { syncShow = new TraktShowCollected { 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 <TraktShowCollected.TraktSeasonCollected>() }; showPayload.Add(syncShow); } var syncSeason = syncShow.seasons.FirstOrDefault(ss => ss.number == episode.GetSeasonNumber()); if (syncSeason == null) { syncSeason = new TraktShowCollected.TraktSeasonCollected { number = episode.GetSeasonNumber(), episodes = new List <TraktEpisodeCollected>() }; syncShow.seasons.Add(syncSeason); } for (var number = indexNumber; number <= finalNumber; number++) { var ids = new TraktEpisodeId(); if (number == indexNumber) { // Omit this from the rest because then we end up attaching the tvdb of the first episode to the subsequent ones ids.tvdb = tvDbId.ConvertToInt(); } var traktEpisodeCollected = new TraktEpisodeCollected { number = number, collected_at = episode.DateCreated.ToISO8601(), ids = ids }; if (traktUser.ExportMediaInfo) { //traktEpisodeCollected.Is3D = episode.Is3D; traktEpisodeCollected.audio_channels = audioStream.GetAudioChannels(); traktEpisodeCollected.audio = audioStream.GetCodecRepresetation(); traktEpisodeCollected.resolution = episode.GetDefaultVideoStream().GetResolution(); } syncSeason.episodes.Add(traktEpisodeCollected); } } } var data = new TraktSyncCollected { episodes = episodesPayload.ToList(), shows = showPayload.ToList() }; var url = eventType == EventType.Add ? TraktUris.SyncCollectionAdd : TraktUris.SyncCollectionRemove; using (var response = await PostToTrakt(url, data, cancellationToken, traktUser).ConfigureAwait(false)) { return(await JsonSerializer.DeserializeAsync <TraktSyncResponse>(response, _jsonOptions).ConfigureAwait(false)); } }
private async Task<TraktSyncResponse> SendLibraryUpdateInternalAsync(IEnumerable<Episode> episodes, TraktUser traktUser, CancellationToken cancellationToken, EventType eventType) { var episodesPayload = new List<TraktEpisodeCollected>(); var showPayload = new List<TraktShowCollected>(); foreach (Episode episode in episodes) { var audioStream = episode.GetMediaStreams().FirstOrDefault(x => x.Type == MediaStreamType.Audio); var tvDbId = episode.GetProviderId(MetadataProviders.Tvdb); if (!string.IsNullOrEmpty(tvDbId) && (!episode.IndexNumber.HasValue || !episode.IndexNumberEnd.HasValue || episode.IndexNumberEnd <= episode.IndexNumber)) { var traktEpisodeCollected = new TraktEpisodeCollected { CollectedAt = episode.DateCreated.ToISO8601(), Ids = new TraktEpisodeId { Tvdb = tvDbId.ConvertToInt() } }; if (traktUser.ExportMediaInfo) { traktEpisodeCollected.Is3D = episode.Is3D; traktEpisodeCollected.AudioChannels = audioStream.GetAudioChannels(); traktEpisodeCollected.Audio = audioStream.GetCodecRepresetation(); traktEpisodeCollected.Resolution = episode.GetDefaultVideoStream().GetResolution(); } episodesPayload.Add(traktEpisodeCollected); } else if (episode.IndexNumber.HasValue) { var indexNumber = episode.IndexNumber.Value; var finalNumber = (episode.IndexNumberEnd ?? episode.IndexNumber).Value; var syncShow = showPayload.FirstOrDefault( sre => sre.Ids != null && sre.Ids.Tvdb == episode.Series.GetProviderId(MetadataProviders.Tvdb).ConvertToInt()); if (syncShow == null) { syncShow = new TraktShowCollected { 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<TraktShowCollected.TraktSeasonCollected>() }; showPayload.Add(syncShow); } var syncSeason = syncShow.Seasons.FirstOrDefault(ss => ss.Number == episode.GetSeasonNumber()); if (syncSeason == null) { syncSeason = new TraktShowCollected.TraktSeasonCollected { Number = episode.GetSeasonNumber(), Episodes = new List<TraktEpisodeCollected>() }; syncShow.Seasons.Add(syncSeason); } for (var number = indexNumber; number <= finalNumber; number++) { var traktEpisodeCollected = new TraktEpisodeCollected { Number = number, CollectedAt = episode.DateCreated.ToISO8601(), Ids = new TraktEpisodeId { Tvdb = tvDbId.ConvertToInt() } }; if (traktUser.ExportMediaInfo) { traktEpisodeCollected.Is3D = episode.Is3D; traktEpisodeCollected.AudioChannels = audioStream.GetAudioChannels(); traktEpisodeCollected.Audio = audioStream.GetCodecRepresetation(); traktEpisodeCollected.Resolution = episode.GetDefaultVideoStream().GetResolution(); } syncSeason.Episodes.Add(traktEpisodeCollected); } } } var data = new TraktSyncCollected { Episodes = episodesPayload.ToList(), Shows = showPayload.ToList() }; var url = eventType == EventType.Add ? TraktUris.SyncCollectionAdd : TraktUris.SyncCollectionRemove; var response = await PostToTrakt(url, data, cancellationToken, traktUser); return _jsonSerializer.DeserializeFromStream<TraktSyncResponse>(response); }
private async Task <TraktSyncResponse> SendLibraryUpdateInternalAsync(IEnumerable <Episode> episodes, TraktUser traktUser, CancellationToken cancellationToken, EventType eventType) { var episodesPayload = new List <TraktEpisodeCollected>(); var showPayload = new List <TraktShowCollected>(); foreach (Episode episode in episodes) { var audioStream = episode.GetMediaStreams().FirstOrDefault(x => x.Type == MediaStreamType.Audio); var tvDbId = episode.GetProviderId(MetadataProviders.Tvdb); if (!string.IsNullOrEmpty(tvDbId) && (!episode.IndexNumber.HasValue || !episode.IndexNumberEnd.HasValue || episode.IndexNumberEnd <= episode.IndexNumber)) { var traktEpisodeCollected = new TraktEpisodeCollected { CollectedAt = episode.DateCreated.ToISO8601(), Ids = new TraktEpisodeId { Tvdb = tvDbId.ConvertToInt() } }; if (traktUser.ExportMediaInfo) { traktEpisodeCollected.Is3D = episode.Is3D; traktEpisodeCollected.AudioChannels = audioStream.GetAudioChannels(); traktEpisodeCollected.Audio = audioStream.GetCodecRepresetation(); traktEpisodeCollected.Resolution = episode.GetDefaultVideoStream().GetResolution(); } episodesPayload.Add(traktEpisodeCollected); } else if (episode.IndexNumber.HasValue) { var indexNumber = episode.IndexNumber.Value; var finalNumber = (episode.IndexNumberEnd ?? episode.IndexNumber).Value; var syncShow = showPayload.FirstOrDefault( sre => sre.Ids != null && sre.Ids.Tvdb == episode.Series.GetProviderId(MetadataProviders.Tvdb).ConvertToInt()); if (syncShow == null) { syncShow = new TraktShowCollected { 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 <TraktShowCollected.TraktSeasonCollected>() }; showPayload.Add(syncShow); } var syncSeason = syncShow.Seasons.FirstOrDefault(ss => ss.Number == episode.GetSeasonNumber()); if (syncSeason == null) { syncSeason = new TraktShowCollected.TraktSeasonCollected { Number = episode.GetSeasonNumber(), Episodes = new List <TraktEpisodeCollected>() }; syncShow.Seasons.Add(syncSeason); } for (var number = indexNumber; number <= finalNumber; number++) { var traktEpisodeCollected = new TraktEpisodeCollected { Number = number, CollectedAt = episode.DateCreated.ToISO8601(), Ids = new TraktEpisodeId { Tvdb = tvDbId.ConvertToInt() } }; if (traktUser.ExportMediaInfo) { traktEpisodeCollected.Is3D = episode.Is3D; traktEpisodeCollected.AudioChannels = audioStream.GetAudioChannels(); traktEpisodeCollected.Audio = audioStream.GetCodecRepresetation(); traktEpisodeCollected.Resolution = episode.GetDefaultVideoStream().GetResolution(); } syncSeason.Episodes.Add(traktEpisodeCollected); } } } var data = new TraktSyncCollected { Episodes = episodesPayload.ToList(), Shows = showPayload.ToList() }; var url = eventType == EventType.Add ? TraktUris.SyncCollectionAdd : TraktUris.SyncCollectionRemove; using (var response = await PostToTrakt(url, data, cancellationToken, traktUser)) { return(_jsonSerializer.DeserializeFromStream <TraktSyncResponse>(response)); } }
private async Task <TraktSyncResponse> SendLibraryUpdateInternalAsync(IReadOnlyList <Episode> episodes, TraktUser traktUser, CancellationToken cancellationToken, EventType eventType) { var episodesPayload = new List <TraktEpisodeCollected>(); var showPayload = new List <TraktShowCollected>(); foreach (var episode in episodes) { var audioStream = episode.GetMediaStreams().FirstOrDefault(x => x.Type == MediaStreamType.Audio); if ((episode.IndexNumberEnd == null || episode.IndexNumberEnd == episode.IndexNumber) && !string.IsNullOrEmpty(episode.GetProviderId(MetadataProviders.Tvdb))) { episodesPayload.Add(new TraktEpisodeCollected { CollectedAt = episode.DateCreated.ToISO8601(), Ids = new TraktEpisodeId { Tvdb = episode.GetProviderId(MetadataProviders.Tvdb).ConvertToInt() }, Is3D = episode.Is3D, AudioChannels = audioStream.GetAudioChannels(), Audio = audioStream.GetCodecRepresetation(), Resolution = episode.GetDefaultVideoStream().GetResolution() }); } // It's a multi-episode file. Add all episodes else if (episode.IndexNumber.HasValue) { var syncShow = showPayload.FirstOrDefault( sre => sre.Ids != null && sre.Ids.Tvdb == episode.Series.GetProviderId(MetadataProviders.Tvdb).ConvertToInt()); if (syncShow == null) { syncShow = new TraktShowCollected { 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 <TraktShowCollected.TraktSeasonCollected>() }; showPayload.Add(syncShow); } var syncSeason = syncShow.Seasons.FirstOrDefault(ss => ss.Number == episode.GetSeasonNumber()); if (syncSeason == null) { syncSeason = new TraktShowCollected.TraktSeasonCollected { Number = episode.GetSeasonNumber(), Episodes = new List <TraktEpisodeCollected>() }; syncShow.Seasons.Add(syncSeason); } syncSeason.Episodes.AddRange(Enumerable.Range(episode.IndexNumber.Value, ((episode.IndexNumberEnd ?? episode.IndexNumber).Value - episode.IndexNumber.Value) + 1) .Select(number => new TraktEpisodeCollected { Number = number, CollectedAt = episode.DateCreated.ToISO8601(), Ids = new TraktEpisodeId { Tvdb = episode.GetProviderId(MetadataProviders.Tvdb).ConvertToInt() }, Is3D = episode.Is3D, AudioChannels = audioStream.GetAudioChannels(), Audio = audioStream.GetCodecRepresetation(), Resolution = episode.GetDefaultVideoStream().GetResolution() }) .ToList()); } } var data = new TraktSyncCollected { Episodes = episodesPayload.ToList(), Shows = showPayload.ToList() }; var url = eventType == EventType.Add ? TraktUris.SyncCollectionAdd : TraktUris.SyncCollectionRemove; var response = await PostToTrakt(url, data, cancellationToken, traktUser); return(_jsonSerializer.DeserializeFromStream <TraktSyncResponse>(response)); }