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); }
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); }
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); }