/// <inheritdoc /> public BackupResult BackupMovies(string path) { BackupResult result = new BackupResult { CollectedCount = 0, WatchedCount = 0 }; Guid[] types = { MediaAspect.ASPECT_ID, MovieAspect.ASPECT_ID, VideoAspect.ASPECT_ID, ImporterAspect.ASPECT_ID, ExternalIdentifierAspect.ASPECT_ID, ProviderResourceAspect.ASPECT_ID, VideoStreamAspect.ASPECT_ID }; IContentDirectory contentDirectory = GetContentDirectory(); Guid?userProfile = GetUserProfileId(); IList <MediaItem> collectedMovieMediaItems = contentDirectory.SearchAsync(new MediaItemQuery(types, null, null), true, userProfile, false).Result; result.CollectedCount = collectedMovieMediaItems.Count; List <MediaItem> watchedMovieMediaItems = collectedMovieMediaItems.Where(MediaItemAspectsUtl.IsWatched).ToList(); IList <MediaLibraryMovie> watchedMovies = new List <MediaLibraryMovie>(); foreach (MediaItem watchedMovieItem in watchedMovieMediaItems) { watchedMovies.Add(new MediaLibraryMovie { Title = MediaItemAspectsUtl.GetMovieTitle(watchedMovieItem), Imdb = MediaItemAspectsUtl.GetMovieImdbId(watchedMovieItem), Year = MediaItemAspectsUtl.GetMovieYear(watchedMovieItem) }); } SaveLibraryMovies(path, watchedMovies); result.WatchedCount = watchedMovies.Count; return(result); }
/// <summary> /// Checks if a local movie is the same as an online movie /// </summary> private bool MovieMatch(MediaItem localMovie, Movie traktMovie) { bool result = false; // IMDb comparison if (!string.IsNullOrEmpty(traktMovie.Imdb) && !string.IsNullOrEmpty(MediaItemAspectsUtl.GetMovieImdbId(localMovie))) { result = String.Compare(MediaItemAspectsUtl.GetMovieImdbId(localMovie), traktMovie.Imdb, StringComparison.OrdinalIgnoreCase) == 0; } // TMDb comparison else if ((MediaItemAspectsUtl.GetMovieTmdbId(localMovie) != 0) && traktMovie.Tmdb.HasValue) { result = MediaItemAspectsUtl.GetMovieTmdbId(localMovie) == traktMovie.Tmdb.Value; } // Title & Year comparison else if (String.Compare(MediaItemAspectsUtl.GetMovieTitle(localMovie), traktMovie.Title, StringComparison.OrdinalIgnoreCase) == 0 && (MediaItemAspectsUtl.GetMovieYear(localMovie) == traktMovie.Year)) { result = true; } return(result); }
private string CreateLookupKey(MediaItem episode) { var tvdid = MediaItemAspectsUtl.GetTvdbId(episode); var seasonIndex = MediaItemAspectsUtl.GetSeasonIndex(episode); var episodeIndex = MediaItemAspectsUtl.GetEpisodeIndex(episode); return(string.Format("{0}_{1}_{2}", tvdid, seasonIndex, episodeIndex)); }
private string CreateLookupKey(MediaItem episode) { string tvdbId = MediaItemAspectsUtl.GetTvdbId(episode); int seasonIndex = MediaItemAspectsUtl.GetSeasonIndex(episode); int episodeIndex = MediaItemAspectsUtl.GetEpisodeNumbers(episode).FirstOrDefault(); return(string.Format("{0}_{1}_{2}", tvdbId, seasonIndex, episodeIndex)); }
private ITraktEpisode ExtractTraktEpisode(MediaItem episodeMediaItem) { ITraktEpisode episode = new TraktEpisode { Number = MediaItemAspectsUtl.GetEpisodeIndex(episodeMediaItem), SeasonNumber = MediaItemAspectsUtl.GetSeasonIndex(episodeMediaItem) }; return(episode); }
private MediaLibraryEpisode GetLibraryEpisode(MediaItem episodeMediaItem, int epNumber) { return(new MediaLibraryEpisode { Season = MediaItemAspectsUtl.GetSeasonIndex(episodeMediaItem), ShowImdb = MediaItemAspectsUtl.GetSeriesImdbId(episodeMediaItem), ShowTitle = MediaItemAspectsUtl.GetSeriesTitle(episodeMediaItem), ShowTvdb = MediaItemAspectsUtl.GetTvdbId(episodeMediaItem), Number = epNumber }); }
private void IncreaseResultCount(RestoreResult result, MediaItem episode) { List <int> episodeNumbers = MediaItemAspectsUtl.GetEpisodeNumbers(episode); bool isMultiEpisode = episodeNumbers.Count > 1; if (isMultiEpisode) { result.MarkedWatchedCount = result.MarkedWatchedCount + episodeNumbers.Count; } else { result.MarkedWatchedCount++; } }
private ITraktShow ExtractTraktShow(MediaItem episodeMediaItem) { ITraktShow show = new TraktShow { Ids = new TraktShowIds { Imdb = MediaItemAspectsUtl.GetSeriesImdbId(episodeMediaItem), Tvdb = MediaItemAspectsUtl.GetTvdbId(episodeMediaItem) }, Title = MediaItemAspectsUtl.GetSeriesTitle(episodeMediaItem), }; return(show); }
private ITraktSyncCollectionPost GetCollectedShowsForSync(IList <MediaItem> localCollectedEpisodes, IEnumerable <EpisodeCollected> traktEpisodesCollected) { _mediaPortalServices.GetLogger().Info("Trakt: finding local episodes to add to trakt collection"); TraktSyncCollectionPostBuilder builder = new TraktSyncCollectionPostBuilder(); ILookup <string, EpisodeCollected> onlineEpisodes = traktEpisodesCollected.ToLookup(tce => CreateLookupKey(tce), tce => tce); foreach (var episode in localCollectedEpisodes) { string tvdbKey = CreateLookupKey(episode); EpisodeCollected traktEpisode = onlineEpisodes[tvdbKey].FirstOrDefault(); if (traktEpisode == null) { TraktShow show = new TraktShow { Title = MediaItemAspectsUtl.GetSeriesTitle(episode), Ids = new TraktShowIds { Tvdb = MediaItemAspectsUtl.GetTvdbId(episode), Imdb = MediaItemAspectsUtl.GetSeriesImdbId(episode) } }; TraktMetadata metadata = new TraktMetadata { Audio = MediaItemAspectsUtl.GetVideoAudioCodec(episode), AudioChannels = MediaItemAspectsUtl.GetVideoAudioChannel(episode), MediaResolution = MediaItemAspectsUtl.GetVideoResolution(episode), MediaType = MediaItemAspectsUtl.GetVideoMediaType(episode), ThreeDimensional = false }; DateTime collectedAt = MediaItemAspectsUtl.GetDateAddedToDb(episode); builder.AddShow(show, new PostSeasons { { MediaItemAspectsUtl.GetSeasonIndex(episode), new PostEpisodes { { MediaItemAspectsUtl.GetEpisodeIndex(episode), metadata, collectedAt } } } }); } } return(builder.Build()); }
private ITraktMovie ConvertMediaItemToTraktMovie(MediaItem movieMediaItem) { ITraktMovie movie = new TraktMovie { Ids = new TraktMovieIds { Imdb = MediaItemAspectsUtl.GetMovieImdbId(movieMediaItem), Tmdb = MediaItemAspectsUtl.GetMovieTmdbId(movieMediaItem) }, Title = MediaItemAspectsUtl.GetMovieTitle(movieMediaItem), Year = MediaItemAspectsUtl.GetMovieYear(movieMediaItem) }; return(movie); }
/// <inheritdoc /> public BackupResult BackupSeries(string path) { BackupResult result = new BackupResult { WatchedCount = 0, CollectedCount = 0 }; Guid[] types = { MediaAspect.ASPECT_ID, EpisodeAspect.ASPECT_ID, VideoAspect.ASPECT_ID, ImporterAspect.ASPECT_ID, ProviderResourceAspect.ASPECT_ID, ExternalIdentifierAspect.ASPECT_ID }; IContentDirectory contentDirectory = GetContentDirectory(); Guid?userProfile = GetUserProfileId(); IList <MediaItem> collectedEpisodeMediaItems = contentDirectory.Search(new MediaItemQuery(types, null, null), true, userProfile, false); foreach (MediaItem collectedEpisodeMediaItem in collectedEpisodeMediaItems) { List <int> episodeNumbers = MediaItemAspectsUtl.GetEpisodeNumbers(collectedEpisodeMediaItem); result.CollectedCount = result.CollectedCount + episodeNumbers.Count; } List <MediaItem> watchedEpisodeMediaItems = collectedEpisodeMediaItems.Where(MediaItemAspectsUtl.IsWatched).ToList(); _mediaPortalServices.GetLogger().Info("watched {0}", watchedEpisodeMediaItems.Count); IList <MediaLibraryEpisode> watchedEpisodes = new List <MediaLibraryEpisode>(); foreach (MediaItem watchedEpisodeItem in watchedEpisodeMediaItems) { List <int> episodeNumbers = MediaItemAspectsUtl.GetEpisodeNumbers(watchedEpisodeItem); _mediaPortalServices.GetLogger().Info("FlagMover: ep numb: {0}", episodeNumbers.Count); if (episodeNumbers.Any()) { AddEpisodes(watchedEpisodes, watchedEpisodeItem, episodeNumbers); } else { _mediaPortalServices.GetLogger().Warn("FlagMover: Skipping series episode without episode number."); } } SaveLibraryEpisodes(path, watchedEpisodes); result.WatchedCount = watchedEpisodes.Count; return(result); }
private void AddEpisodes(IList <MediaLibraryEpisode> watchedEpisodes, MediaItem episodeMediaItem, List <int> episodeNumbers) { bool isMultiEpisode = episodeNumbers.Count > 1; if (isMultiEpisode) { foreach (int epNumber in episodeNumbers) { watchedEpisodes.Add(GetLibraryEpisode(episodeMediaItem, epNumber)); _mediaPortalServices.GetLogger().Info("added: {0}, numnber {1}", MediaItemAspectsUtl.GetSeriesTitle(episodeMediaItem), epNumber); } } else { watchedEpisodes.Add(GetLibraryEpisode(episodeMediaItem, episodeNumbers.FirstOrDefault())); } }
public void BackupMovies() { Guid[] types = { MediaAspect.ASPECT_ID, MovieAspect.ASPECT_ID, VideoAspect.ASPECT_ID, ImporterAspect.ASPECT_ID, ExternalIdentifierAspect.ASPECT_ID, ProviderResourceAspect.ASPECT_ID, VideoStreamAspect.ASPECT_ID, VideoAudioStreamAspect.ASPECT_ID }; IContentDirectory 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; } IList <MediaItem> collectedMovies = contentDirectory.SearchAsync(new MediaItemQuery(types, null, null), true, userProfile, false).Result; IList <MediaLibraryMovie> libraryMovies = new List <MediaLibraryMovie>(); foreach (MediaItem collectedMovie in collectedMovies) { libraryMovies.Add(new MediaLibraryMovie { Title = MediaItemAspectsUtl.GetMovieTitle(collectedMovie), AddedToDb = MediaItemAspectsUtl.GetDateAddedToDb(collectedMovie).ToString("O"), LastPlayed = MediaItemAspectsUtl.GetLastPlayedDate(collectedMovie).ToString("O"), PlayCount = MediaItemAspectsUtl.GetPlayCount(collectedMovie), Imdb = MediaItemAspectsUtl.GetMovieImdbId(collectedMovie), Year = MediaItemAspectsUtl.GetMovieYear(collectedMovie) }); } SaveLibraryMovies(libraryMovies); }
private bool MovieMatch(MediaItem localMovie, MediaLibraryMovie watchedRestoreMovie) { bool result = false; if (!string.IsNullOrEmpty(watchedRestoreMovie.Imdb) && !string.IsNullOrEmpty(MediaItemAspectsUtl.GetMovieImdbId(localMovie))) { result = String.Compare(MediaItemAspectsUtl.GetMovieImdbId(localMovie), watchedRestoreMovie.Imdb, StringComparison.OrdinalIgnoreCase) == 0; } else if ((MediaItemAspectsUtl.GetMovieTmdbId(localMovie) != 0) && watchedRestoreMovie.Tmdb.HasValue) { result = MediaItemAspectsUtl.GetMovieTmdbId(localMovie) == watchedRestoreMovie.Tmdb.Value; } else if (String.Compare(MediaItemAspectsUtl.GetMovieTitle(localMovie), watchedRestoreMovie.Title, StringComparison.OrdinalIgnoreCase) == 0 && (MediaItemAspectsUtl.GetMovieYear(localMovie) == watchedRestoreMovie.Year)) { result = true; } return(result); }
private ITraktSyncHistoryPost GetWatchedShowsForSync(IList <MediaItem> localWatchedEpisodes, IEnumerable <EpisodeWatched> traktEpisodesWatched) { _mediaPortalServices.GetLogger().Info("Trakt: finding local shows to add to trakt watched history"); TraktSyncHistoryPostBuilder builder = new TraktSyncHistoryPostBuilder(); ILookup <string, EpisodeWatched> onlineEpisodes = traktEpisodesWatched.ToLookup(twe => CreateLookupKey(twe), twe => twe); foreach (var episode in localWatchedEpisodes) { string tvdbKey = CreateLookupKey(episode); EpisodeWatched traktEpisode = onlineEpisodes[tvdbKey].FirstOrDefault(); if (traktEpisode == null) { TraktShow show = new TraktShow { Title = MediaItemAspectsUtl.GetSeriesTitle(episode), Ids = new TraktShowIds { Tvdb = MediaItemAspectsUtl.GetTvdbId(episode), Imdb = MediaItemAspectsUtl.GetSeriesImdbId(episode) } }; DateTime watchedAt = MediaItemAspectsUtl.GetLastPlayedDate(episode); builder.AddShow(show, new PostHistorySeasons { { MediaItemAspectsUtl.GetSeasonIndex(episode), new PostHistoryEpisodes { { MediaItemAspectsUtl.GetEpisodeIndex(episode), watchedAt } } } }); } } return(builder.Build()); }
public TraktSyncMoviesResult SyncMovies() { _mediaPortalServices.GetLogger().Info("Trakt: start sync movies"); ValidateAuthorization(); TraktSyncMoviesResult syncMoviesResult = new TraktSyncMoviesResult(); TraktMovies traktMovies = _traktCache.RefreshMoviesCache(); IList <Movie> traktUnWatchedMovies = traktMovies.UnWatched; IList <MovieWatched> traktWatchedMovies = traktMovies.Watched; IList <MovieCollected> traktCollectedMovies = traktMovies.Collected; Guid[] types = { MediaAspect.ASPECT_ID, MovieAspect.ASPECT_ID, VideoAspect.ASPECT_ID, ImporterAspect.ASPECT_ID, ExternalIdentifierAspect.ASPECT_ID, ProviderResourceAspect.ASPECT_ID, VideoStreamAspect.ASPECT_ID, VideoAudioStreamAspect.ASPECT_ID }; IContentDirectory 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 local database info IList <MediaItem> collectedMovies = contentDirectory.SearchAsync(new MediaItemQuery(types, null, null), true, userProfile, false).Result; if (collectedMovies.Any()) { syncMoviesResult.CollectedInLibrary = collectedMovies.Count; _mediaPortalServices.GetLogger().Info("Trakt: found {0} collected movies available to sync in media library", collectedMovies.Count); } List <MediaItem> watchedMovies = collectedMovies.Where(MediaItemAspectsUtl.IsWatched).ToList(); if (watchedMovies.Any()) { syncMoviesResult.WatchedInLibrary = watchedMovies.Count; _mediaPortalServices.GetLogger().Info("Trakt: found {0} watched movies available to sync in media library", watchedMovies.Count); } #endregion #region Mark movies as unwatched in local database _mediaPortalServices.GetLogger().Info("Trakt: start marking movies as unwatched in media library"); if (traktUnWatchedMovies.Any()) { foreach (var movie in traktUnWatchedMovies) { var localMovie = watchedMovies.FirstOrDefault(m => MovieMatch(m, movie)); if (localMovie == null) { continue; } _mediaPortalServices.GetLogger().Info( "Marking movie as unwatched in library, movie is not watched on trakt. Title = '{0}', Year = '{1}', IMDb ID = '{2}', TMDb ID = '{3}'", movie.Title, movie.Year.HasValue ? movie.Year.ToString() : "<empty>", movie.Imdb ?? "<empty>", movie.Tmdb.HasValue ? movie.Tmdb.ToString() : "<empty>"); if (_mediaPortalServices.MarkAsUnWatched(localMovie).Result) { syncMoviesResult.MarkedAsUnWatchedInLibrary++; } } // update watched set watchedMovies = collectedMovies.Where(MediaItemAspectsUtl.IsWatched).ToList(); } #endregion #region Mark movies as watched in local database _mediaPortalServices.GetLogger().Info("Trakt: start marking movies as watched in media library"); if (traktWatchedMovies.Any()) { foreach (var twm in traktWatchedMovies) { var localMovie = collectedMovies.FirstOrDefault(m => MovieMatch(m, twm)); if (localMovie == null) { continue; } _mediaPortalServices.GetLogger().Info( "Marking movie as watched in library, movie is watched on trakt. Plays = '{0}', Title = '{1}', Year = '{2}', IMDb ID = '{3}', TMDb ID = '{4}'", twm.Plays, twm.Title, twm.Year.HasValue ? twm.Year.ToString() : "<empty>", twm.Imdb ?? "<empty>", twm.Tmdb.HasValue ? twm.Tmdb.ToString() : "<empty>"); if (_mediaPortalServices.MarkAsWatched(localMovie).Result) { syncMoviesResult.MarkedAsWatchedInLibrary++; } } } #endregion #region Add movies to watched history at trakt.tv _mediaPortalServices.GetLogger().Info("Trakt: finding movies to add to watched history"); List <TraktSyncHistoryPostMovie> syncWatchedMovies = (from movie in watchedMovies where !traktWatchedMovies.ToList().Exists(c => MovieMatch(movie, c)) select new TraktSyncHistoryPostMovie { Ids = new TraktMovieIds { Imdb = MediaItemAspectsUtl.GetMovieImdbId(movie), Tmdb = MediaItemAspectsUtl.GetMovieTmdbId(movie) }, Title = MediaItemAspectsUtl.GetMovieTitle(movie), Year = MediaItemAspectsUtl.GetMovieYear(movie), WatchedAt = MediaItemAspectsUtl.GetLastPlayedDate(movie), }).ToList(); if (syncWatchedMovies.Any()) { _mediaPortalServices.GetLogger().Info("Trakt: trying to add {0} watched movies to trakt watched history", syncWatchedMovies.Count); ITraktSyncHistoryPostResponse watchedResponse = _traktClient.AddWatchedHistoryItems(new TraktSyncHistoryPost { Movies = syncWatchedMovies }); syncMoviesResult.AddedToTraktWatchedHistory = watchedResponse.Added?.Movies; _traktCache.ClearLastActivity(FileName.WatchedMovies.Value); if (watchedResponse.Added?.Movies != null) { _mediaPortalServices.GetLogger().Info("Trakt: successfully added {0} watched movies to trakt watched history", watchedResponse.Added.Movies.Value); } } #endregion #region Add movies to collection at trakt.tv _mediaPortalServices.GetLogger().Info("Trakt: finding movies to add to collection"); List <TraktSyncCollectionPostMovie> syncCollectedMovies = (from movie in collectedMovies where !traktCollectedMovies.ToList().Exists(c => MovieMatch(movie, c)) select new TraktSyncCollectionPostMovie { MediaType = MediaItemAspectsUtl.GetVideoMediaType(movie), MediaResolution = MediaItemAspectsUtl.GetVideoResolution(movie), Audio = MediaItemAspectsUtl.GetVideoAudioCodec(movie), AudioChannels = MediaItemAspectsUtl.GetVideoAudioChannel(movie), ThreeDimensional = false, Ids = new TraktMovieIds { Imdb = MediaItemAspectsUtl.GetMovieImdbId(movie), Tmdb = MediaItemAspectsUtl.GetMovieTmdbId(movie) }, Title = MediaItemAspectsUtl.GetMovieTitle(movie), Year = MediaItemAspectsUtl.GetMovieYear(movie), CollectedAt = MediaItemAspectsUtl.GetDateAddedToDb(movie) }).ToList(); if (syncCollectedMovies.Any()) { _mediaPortalServices.GetLogger().Info("Trakt: trying to add {0} collected movies to trakt collection", syncCollectedMovies.Count); foreach (var traktSyncCollectionPostMovie in syncCollectedMovies) { string audio = traktSyncCollectionPostMovie.Audio?.DisplayName; string channel = traktSyncCollectionPostMovie.AudioChannels?.DisplayName; string res = traktSyncCollectionPostMovie.MediaResolution?.DisplayName; string mediatype = traktSyncCollectionPostMovie.MediaType?.DisplayName; string name = traktSyncCollectionPostMovie.Title; _mediaPortalServices.GetLogger().Info("Trakt: {0}, {1}, {2}, {3}, {4}", audio, channel, res, mediatype, name); } ITraktSyncCollectionPostResponse collectionResponse = _traktClient.AddCollectionItems(new TraktSyncCollectionPost { Movies = syncCollectedMovies }); syncMoviesResult.AddedToTraktCollection = collectionResponse.Added?.Movies; _traktCache.ClearLastActivity(FileName.CollectedMovies.Value); if (collectionResponse.Added?.Movies != null) { _mediaPortalServices.GetLogger().Info("Trakt: successfully added {0} collected movies to trakt collection", collectionResponse.Added.Movies.Value); } } #endregion return(syncMoviesResult); }