Exemple #1
0
        /// <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);
    }
Exemple #3
0
        /// <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);
        }
Exemple #4
0
        /// <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);
        }
    }
Exemple #10
0
        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));
            }
        }
Exemple #11
0
        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);
        }
Exemple #12
0
        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));
        }