コード例 #1
0
        public void MarkEpisodeAsWatchedIfMediaLibraryAvailable(List <MediaItem> databaseEpisodes, List <EpisodeWatched> traktEpisodes, int expectedEpisodesCount)
        {
            // Arrange
            IMediaPortalServices mediaPortalServices = GetMockMediaPortalServices(databaseEpisodes);
            ITraktClient         traktClient         = Substitute.For <ITraktClient>();

            traktClient.AddCollectionItems(Arg.Any <ITraktSyncCollectionPost>()).Returns(new TraktSyncCollectionPostResponse());
            traktClient.AddWatchedHistoryItems(Arg.Any <ITraktSyncHistoryPost>()).Returns(new TraktSyncHistoryPostResponse());
            TraktAuthorization authorization = Substitute.For <TraktAuthorization>();

            authorization.AccessToken = "ValidToken";
            traktClient.TraktAuthorization.Returns(authorization);
            ITraktCache traktCache = Substitute.For <ITraktCache>();

            traktCache.RefreshSeriesCache().Returns(new TraktEpisodes {
                Watched = traktEpisodes, UnWatched = new List <Episode>(), Collected = new List <EpisodeCollected>()
            });
            IFileOperations         fileOperations         = Substitute.For <IFileOperations>();
            ILibrarySynchronization librarySynchronization = new LibrarySynchronization(mediaPortalServices, traktClient, traktCache, fileOperations);

            // Act
            TraktSyncEpisodesResult result = librarySynchronization.SyncSeries();

            // Assert
            Assert.Equal(expectedEpisodesCount, result.MarkedAsWatchedInLibrary);
        }
コード例 #2
0
        private void SyncLibraryWithTrakt()
        {
            TraktSyncMoviesResult syncMoviesResult = _librarySynchronization.SyncMovies();

            _mediaPortalServices.GetLogger().Info("Trakt: Finished automatic movies sync.");

            _mediaPortalServices.GetLogger().Info("There are '{0}' watched movies and '{1}' collected movies in library.",
                                                  syncMoviesResult.WatchedInLibrary, syncMoviesResult.CollectedInLibrary);

            _mediaPortalServices.GetLogger().Info("There were '{0}' movies added to watched history and '{1}' movies added to collection at trakt.",
                                                  syncMoviesResult.AddedToTraktWatchedHistory.HasValue ? syncMoviesResult.AddedToTraktWatchedHistory.ToString() : "<empty>",
                                                  syncMoviesResult.AddedToTraktCollection.HasValue ? syncMoviesResult.AddedToTraktCollection.ToString() : "<empty>");

            _mediaPortalServices.GetLogger().Info("There were '{0}' movies marked as watched and '{1}' movies marked as unwatched in library.",
                                                  syncMoviesResult.MarkedAsWatchedInLibrary, syncMoviesResult.MarkedAsUnWatchedInLibrary);

            TraktSyncEpisodesResult syncEpisodesResult = _librarySynchronization.SyncSeries();

            _mediaPortalServices.GetLogger().Info("Trakt: Finished automatic series sync.");

            _mediaPortalServices.GetLogger().Info("There are '{0}' watched episodes and '{1}' collected episodes in library.",
                                                  syncEpisodesResult.WatchedInLibrary, syncEpisodesResult.CollectedInLibrary);

            _mediaPortalServices.GetLogger().Info("There were '{0}' episodes added to watched history and '{1}' episodes added to collection at trakt.",
                                                  syncEpisodesResult.AddedToTraktWatchedHistory.HasValue ? syncEpisodesResult.AddedToTraktWatchedHistory.ToString() : "<empty>",
                                                  syncEpisodesResult.AddedToTraktCollection.HasValue ? syncEpisodesResult.AddedToTraktCollection.ToString() : "<empty>");

            _mediaPortalServices.GetLogger().Info("There were '{0}' episodes marked as watched and '{1}' episodes marked as unwatched in library.",
                                                  syncEpisodesResult.MarkedAsWatchedInLibrary, syncEpisodesResult.MarkedAsUnWatchedInLibrary);
        }
コード例 #3
0
        public TraktSyncEpisodesResult SyncSeries()
        {
            _mediaPortalServices.GetLogger().Info("Trakt: start sync series");

            ValidateAuthorization();

            TraktSyncEpisodesResult  syncEpisodesResult     = new TraktSyncEpisodesResult();
            TraktEpisodes            traktEpisodes          = _traktCache.RefreshSeriesCache();
            IList <Episode>          traktUnWatchedEpisodes = traktEpisodes.UnWatched;
            IList <EpisodeWatched>   traktWatchedEpisodes   = traktEpisodes.Watched;
            IList <EpisodeCollected> traktCollectedEpisodes = traktEpisodes.Collected;

            Guid[] types =
            {
                MediaAspect.ASPECT_ID,            EpisodeAspect.ASPECT_ID, VideoAspect.ASPECT_ID, ImporterAspect.ASPECT_ID,
                ProviderResourceAspect.ASPECT_ID, ExternalIdentifierAspect.ASPECT_ID
            };
            var contentDirectory = _mediaPortalServices.GetServerConnectionManager().ContentDirectory;

            if (contentDirectory == null)
            {
                throw new MediaLibraryNotConnectedException("ML not connected");
            }

            Guid?           userProfile = null;
            IUserManagement userProfileDataManagement = _mediaPortalServices.GetUserManagement();

            if (userProfileDataManagement != null && userProfileDataManagement.IsValidUser)
            {
                userProfile = userProfileDataManagement.CurrentUser.ProfileId;
            }

            #region Get data from local database

            IList <MediaItem> localEpisodes = contentDirectory.SearchAsync(new MediaItemQuery(types, null, null), true, userProfile, false).Result;

            if (localEpisodes.Any())
            {
                syncEpisodesResult.CollectedInLibrary = localEpisodes.Count;
                _mediaPortalServices.GetLogger().Info("Trakt: found {0} total episodes in library", localEpisodes.Count);
            }

            List <MediaItem> localWatchedEpisodes = localEpisodes.Where(MediaItemAspectsUtl.IsWatched).ToList();

            if (localWatchedEpisodes.Any())
            {
                syncEpisodesResult.WatchedInLibrary = localWatchedEpisodes.Count;
                _mediaPortalServices.GetLogger().Info("Trakt: found {0} episodes watched in library", localWatchedEpisodes.Count);
            }

            #endregion

            #region Mark episodes as unwatched in local database

            _mediaPortalServices.GetLogger().Info("Trakt: start marking series episodes as unwatched in media library");
            if (traktUnWatchedEpisodes.Any())
            {
                // create a unique key to lookup and search for faster
                ILookup <string, MediaItem> localLookupEpisodes = localWatchedEpisodes.ToLookup(twe => CreateLookupKey(twe), twe => twe);

                foreach (var episode in traktUnWatchedEpisodes)
                {
                    string tvdbKey = CreateLookupKey(episode);

                    var watchedEpisode = localLookupEpisodes[tvdbKey].FirstOrDefault();
                    if (watchedEpisode != null)
                    {
                        _mediaPortalServices.GetLogger().Info(
                            "Marking episode as unwatched in library, episode is not watched on trakt. Title = '{0}', Year = '{1}', Season = '{2}', Episode = '{3}', Show TVDb ID = '{4}', Show IMDb ID = '{5}'",
                            episode.ShowTitle, episode.ShowYear.HasValue ? episode.ShowYear.ToString() : "<empty>", episode.Season,
                            episode.Number, episode.ShowTvdbId.HasValue ? episode.ShowTvdbId.ToString() : "<empty>",
                            episode.ShowImdbId ?? "<empty>");

                        if (_mediaPortalServices.MarkAsUnWatched(watchedEpisode).Result)
                        {
                            syncEpisodesResult.MarkedAsUnWatchedInLibrary++;
                        }

                        // update watched episodes
                        localWatchedEpisodes.Remove(watchedEpisode);
                    }
                }
            }

            #endregion

            #region Mark episodes as watched in local database

            _mediaPortalServices.GetLogger().Info("Trakt: start marking series episodes as watched in media library");
            if (traktWatchedEpisodes.Any())
            {
                // create a unique key to lookup and search for faster
                ILookup <string, EpisodeWatched> onlineEpisodes = traktWatchedEpisodes.ToLookup(twe => CreateLookupKey(twe), twe => twe);
                List <MediaItem> localUnWatchedEpisodes         = localEpisodes.Except(localWatchedEpisodes).ToList();
                foreach (var episode in localUnWatchedEpisodes)
                {
                    string tvdbKey = CreateLookupKey(episode);

                    var traktEpisode = onlineEpisodes[tvdbKey].FirstOrDefault();
                    if (traktEpisode != null)
                    {
                        _mediaPortalServices.GetLogger().Info(
                            "Marking episode as watched in library, episode is watched on trakt. Plays = '{0}', Title = '{1}', Year = '{2}', Season = '{3}', Episode = '{4}', Show TVDb ID = '{5}', Show IMDb ID = '{6}', Last Watched = '{7}'",
                            traktEpisode.Plays, traktEpisode.ShowTitle,
                            traktEpisode.ShowYear.HasValue ? traktEpisode.ShowYear.ToString() : "<empty>", traktEpisode.Season,
                            traktEpisode.Number, traktEpisode.ShowTvdbId.HasValue ? traktEpisode.ShowTvdbId.ToString() : "<empty>",
                            traktEpisode.ShowImdbId ?? "<empty>", traktEpisode.WatchedAt);

                        if (_mediaPortalServices.MarkAsWatched(episode).Result)
                        {
                            syncEpisodesResult.MarkedAsWatchedInLibrary++;
                        }
                    }
                }
            }

            #endregion

            #region Add episodes to watched history at trakt.tv

            ITraktSyncHistoryPost syncHistoryPost = GetWatchedShowsForSync(localWatchedEpisodes, traktWatchedEpisodes);
            if (syncHistoryPost.Shows != null && syncHistoryPost.Shows.Any())
            {
                _mediaPortalServices.GetLogger().Info("Trakt: trying to add {0} watched episodes to trakt watched history", syncHistoryPost.Shows.Count());
                ITraktSyncHistoryPostResponse response = _traktClient.AddWatchedHistoryItems(syncHistoryPost);
                syncEpisodesResult.AddedToTraktWatchedHistory = response.Added?.Episodes;
                _traktCache.ClearLastActivity(FileName.WatchedEpisodes.Value);

                if (response.Added?.Episodes != null)
                {
                    _mediaPortalServices.GetLogger().Info("Trakt: successfully added {0} watched episodes to trakt watched history", response.Added.Episodes.Value);
                }
            }

            #endregion

            #region Add episodes to collection at trakt.tv

            ITraktSyncCollectionPost syncCollectionPost = GetCollectedShowsForSync(localEpisodes, traktCollectedEpisodes);
            if (syncCollectionPost.Shows != null && syncCollectionPost.Shows.Any())
            {
                _mediaPortalServices.GetLogger().Info("Trakt: trying to add {0} collected episodes to trakt collection", syncCollectionPost.Shows.Count());
                ITraktSyncCollectionPostResponse response = _traktClient.AddCollectionItems(syncCollectionPost);
                syncEpisodesResult.AddedToTraktCollection = response.Added?.Episodes;
                _traktCache.ClearLastActivity(FileName.CollectedEpisodes.Value);

                if (response.Added?.Episodes != null)
                {
                    _mediaPortalServices.GetLogger().Info("Trakt: successfully added {0} collected episodes to trakt collection", response.Added.Episodes.Value);
                }
            }

            #endregion

            return(syncEpisodesResult);
        }