/// <summary> /// Creates Sync Data based on a List of IMDBMovie objects /// </summary> /// <param name="Movies">The movies to base the object on</param> /// <returns>The Trakt Sync data to send</returns> public static TraktMovieSync CreateSyncData(List <MFMovie> Movies) { string username = TraktSettings.Username; string password = TraktSettings.Password; if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password)) { return(null); } List <TraktMovieSync.Movie> moviesList = (from m in Movies select new TraktMovieSync.Movie { IMDBID = m.IMDBNumber, TMDBID = m.TMDBNumber, Title = m.Title, Year = m.Year.ToString() }).ToList(); TraktMovieSync syncData = new TraktMovieSync { UserName = username, Password = password, MovieList = moviesList }; return(syncData); }
private TraktMovieSync CreateMovieSyncData(TraktMovie movie) { if (movie == null) { return(null); } TraktMovieSync.Movie syncMovie = new TraktMovieSync.Movie { IMDBID = movie.IMDBID, Title = movie.Title, Year = movie.Year }; TraktMovieSync syncData = new TraktMovieSync { UserName = TraktSettings.Username, Password = TraktSettings.Password, MovieList = new List <TraktMovieSync.Movie> { syncMovie } }; return(syncData); }
/// <summary> /// Creates Sync Data based on a single IMDBMovie object /// </summary> /// <param name="Movie">The movie to base the object on</param> /// <returns>The Trakt Sync data to send</returns> public static TraktMovieSync CreateSyncData(MFMovie Movie) { string username = TraktSettings.Username; string password = TraktSettings.Password; if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password)) { return(null); } List <TraktMovieSync.Movie> moviesList = new List <TraktMovieSync.Movie>(); moviesList.Add(new TraktMovieSync.Movie { IMDBID = Movie.IMDBNumber, TMDBID = Movie.TMDBNumber, Title = Movie.Title, Year = Movie.Year.ToString() }); TraktMovieSync syncData = new TraktMovieSync { UserName = username, Password = password, MovieList = moviesList }; return(syncData); }
private void AddMoviesToCollection(IEnumerable <CheckMoviesListItem> collectedMovies) { UIUtils.UpdateStatus("Updating Trakt collection with {0} movies from iCheckMovies.", collectedMovies.Count()); if (collectedMovies.Count() > 0) { int pageSize = AppSettings.BatchSize; int pages = (int)System.Math.Ceiling((double)collectedMovies.Count() / pageSize); for (int i = 0; i < pages; i++) { if (ImportCancelled) { return; } UIUtils.UpdateStatus("Importing page {0}/{1} iCheckMovies collection...", i + 1, pages); var collectedToSync = new TraktMovieSync() { Movies = collectedMovies.Skip(i * pageSize).Take(pageSize).Select(icm => icm.ToTraktMovie()).ToList() }; var addToCollectionResponse = TraktAPI.TraktAPI.AddMoviesToCollection(collectedToSync); HandleResponse(addToCollectionResponse); } } }
private TraktMovieSync CreateSyncData(TraktWatchListMovie movie) { if (movie == null) { return(null); } List <TraktMovieSync.Movie> movies = new List <TraktMovieSync.Movie>(); TraktMovieSync.Movie syncMovie = new TraktMovieSync.Movie { IMDBID = movie.IMDBID, Title = movie.Title, Year = movie.Year }; movies.Add(syncMovie); TraktMovieSync syncData = new TraktMovieSync { UserName = TraktSettings.Username, Password = TraktSettings.Password, MovieList = movies }; return(syncData); }
/// <summary> /// Removes movies from users watched history /// </summary> /// <param name="syncData">list of shows</param> public static TraktSyncResponse RemoveMoviesFromWatchedHistory(TraktMovieSync syncData) { if (syncData == null) { return(null); } var response = TraktWeb.PostToTrakt(TraktURIs.SyncWatchedRemove, syncData.ToJSON()); return(response.FromJSON <TraktSyncResponse>()); }
/// <summary> /// Removes movies from users collection /// </summary> /// <param name="syncData">list of shows</param> public static TraktSyncResponse RemoveMoviesFromCollection(TraktMovieSync syncData) { if (syncData == null) { return(null); } var response = TraktWeb.PostToTrakt(TraktURIs.SyncCollectionRemove, syncData.ToJSON()); return(response.FromJSON <TraktSyncResponse>()); }
/// <summary> /// Sends movie sync data to Trakt /// </summary> /// <param name="syncData">The sync data to send</param> /// <param name="mode">The sync mode to use</param> /// <returns>The response from trakt</returns> public static TraktMovieSyncResponse SyncMovieLibrary(TraktMovieSync syncData, TraktSyncModes mode) { // check that we have everything we need if (syncData == null || syncData.MovieList.Count == 0) { return(null); } // serialize data to JSON and send to server string response = TraktWeb.Transmit(string.Format(TraktURIs.SyncMovieLibrary, mode.ToString()), syncData.ToJSON()); // return success or failure return(response.FromJSON <TraktMovieSyncResponse>()); }
/// <summary> /// Sends movie sync data to Trakt Watchlist /// </summary> /// <param name="syncData">The sync data to send</param> /// <returns>The response from trakt</returns> public static TraktSyncResponse AddMoviesToWatchlist(TraktMovieSync syncData) { // check that we have everything we need if (syncData == null || syncData.Movies == null || syncData.Movies.Count == 0) { return(null); } // serialize data to JSON and send to server string response = TraktWeb.PostToTrakt(TraktURIs.SyncWatchlist, syncData.ToJSON()); // return success or failure return(response.FromJSON <TraktSyncResponse>()); }
private TraktMovieSync GetSyncMoviesData(List <FlixsterMovieRating> aMovieItems) { var traktMovies = new List <TraktMovie>(); traktMovies.AddRange(from movieItem in aMovieItems select new TraktMovie { Title = movieItem.Movie.Title, Year = movieItem.Movie.Year.ToYear(), }); var movieSyncData = new TraktMovieSync { Movies = traktMovies }; return(movieSyncData); }
public static void RemoveMoviesFromRatings() { if (Cancel) { return; } UIUtils.UpdateStatus("Getting rated movies from trakt.tv"); var ratedMovies = TraktAPI.TraktAPI.GetRatedMovies(); if (ratedMovies != null) { UIUtils.UpdateStatus("Found {0} movies rated on trakt.tv", ratedMovies.Count()); int pageSize = AppSettings.BatchSize; int pages = (int)Math.Ceiling((double)ratedMovies.Count() / pageSize); for (int i = 0; i < pages; i++) { if (Cancel) { return; } var syncData = new TraktMovieSync { Movies = ratedMovies.Select(r => r.Movie).Skip(i * pageSize).Take(pageSize).ToList() }; UIUtils.UpdateStatus("[{0}/{1}] Removing movies from trakt.tv ratings", i + 1, pages); var syncResponse = TraktAPI.TraktAPI.RemoveMoviesFromRatings(syncData); if (syncResponse == null) { UIUtils.UpdateStatus(string.Format("[{0}/{1}] Failed to remove movies from trakt.tv ratings", i + 1, pages), true); Thread.Sleep(2000); continue; } } } else { UIUtils.UpdateStatus("Failed to get current list of rated movies from trakt.tv", true); Thread.Sleep(2000); } }
public bool SyncMovies() { try { TestStatus = "[Trakt.SyncMovies]"; Guid[] types = { MediaAspect.ASPECT_ID, MovieAspect.ASPECT_ID }; var contentDirectory = ServiceRegistration.Get <IServerConnectionManager>().ContentDirectory; if (contentDirectory == null) { TestStatus = "[Trakt.MediaLibraryNotConnected]"; return(false); } var movies = contentDirectory.Search(new MediaItemQuery(types, null, null), true); TraktMovieSync syncData = new TraktMovieSync { UserName = Username, Password = Password, MovieList = new List <TraktMovieSync.Movie>() }; // First send all movies to Trakt that we have so they appear in library foreach (var movie in movies) { syncData.MovieList.Add(ToMovie(movie)); } TraktSyncModes traktSyncMode = TraktSyncModes.library; var response = TraktAPI.SyncMovieLibrary(syncData, traktSyncMode); ServiceRegistration.Get <ILogger>().Info("Trakt.tv: Movies '{0}': {1} inserted, {2} existing, {3} skipped movies.", traktSyncMode, response.Inserted, SafeCount(response.AlreadyExistMovies), SafeCount(response.SkippedMovies)); syncData.MovieList.Clear(); // Then send only the watched movies as "seen" foreach (var movie in movies.Where(IsWatched)) { syncData.MovieList.Add(ToMovie(movie)); } traktSyncMode = TraktSyncModes.seen; response = TraktAPI.SyncMovieLibrary(syncData, traktSyncMode); ServiceRegistration.Get <ILogger>().Info("Trakt.tv: Movies '{0}': {1} inserted, {2} existing, {3} skipped movies.", traktSyncMode, response.Inserted, SafeCount(response.AlreadyExistMovies), SafeCount(response.SkippedMovies)); return(true); } catch (Exception ex) { ServiceRegistration.Get <ILogger>().Error("Trakt.tv: Exception while synchronizing media library.", ex); } return(false); }
public static void RemoveMoviesFromWatchedHistory() { if (Cancel) { return; } UIUtils.UpdateStatus("Getting watched movies from trakt.tv"); var watchedMovies = TraktAPI.TraktAPI.GetWatchedMovies(); if (watchedMovies != null) { UIUtils.UpdateStatus("Found {0} movies watched ({1} plays) on trakt.tv", watchedMovies.Count(), watchedMovies.Sum(s => s.Plays)); int pageSize = AppSettings.BatchSize; int pages = (int)Math.Ceiling((double)watchedMovies.Count() / pageSize); for (int i = 0; i < pages; i++) { if (Cancel) { return; } var syncData = new TraktMovieSync { Movies = watchedMovies.Select(w => w.Movie).Skip(i * pageSize).Take(pageSize).ToList() }; UIUtils.UpdateStatus("[{0}/{1}] Removing movies from trakt.tv watched history", i + 1, pages); var syncResponse = TraktAPI.TraktAPI.RemoveMoviesFromWatchedHistory(syncData); if (syncResponse == null) { UIUtils.UpdateStatus(string.Format("[{0}/{1}] Failed to remove movies from trakt.tv watched history", i + 1, pages), true); Thread.Sleep(2000); continue; } } } else { UIUtils.UpdateStatus("Failed to get current list of watched movies from trakt.tv", true); Thread.Sleep(2000); } }
private TraktMovieSync GetWatchedMoviesData(List <TMDbMovie> movies) { var traktMovies = new List <TraktMovieSync.Movie>(); traktMovies.AddRange(from movie in movies select new TraktMovieSync.Movie { TMDBID = movie.Id.ToString() }); var movieWatchedData = new TraktMovieSync { UserName = AppSettings.TraktUsername, Password = AppSettings.TraktPassword, MovieList = traktMovies }; return(movieWatchedData); }
private TraktMovieSync GetSyncMoviesData(List <TMDbMovie> movies) { var traktMovies = new List <TraktMovie>(); traktMovies.AddRange(from movie in movies select new TraktMovie { Ids = new TraktMovieId { TmdbId = movie.Id } }); var movieSyncData = new TraktMovieSync { Movies = traktMovies }; return(movieSyncData); }
public static void RemoveMovieFromLibrary(string imdbid, string title, string year, string tmdbid = null) { TraktMovieSync syncObject = BasicHandler.CreateMovieSyncData(title, year, imdbid); if (syncObject == null) { return; } Thread syncThread = new Thread(delegate(object obj) { TraktAPI.TraktAPI.SyncMovieLibrary(obj as TraktMovieSync, TraktSyncModes.unlibrary); }) { IsBackground = true, Name = "RemoveLibrary" }; syncThread.Start(syncObject); }
public static void MarkMovieAsUnWatched(string imdbid, string title, string year, string tmdbid = null) { TraktMovieSync syncObject = BasicHandler.CreateMovieSyncData(title, year, imdbid, tmdbid); if (syncObject == null) { return; } Thread syncThread = new Thread(delegate(object obj) { TraktAPI.TraktAPI.SyncMovieLibrary(obj as TraktMovieSync, TraktSyncModes.unseen); }) { IsBackground = true, Name = "MarkUnWatched" }; syncThread.Start(syncObject); }
private TraktMovieSync GetMoviesData(List <ListalExport.RSSChannel.Item> movies) { var traktMovies = new List <TraktMovie>(); traktMovies.AddRange(from movie in movies select new TraktMovie { Title = movie.Title, Ids = new TraktMovieId { ImdbId = "tt" + movie.IMDbId }, }); var movieData = new TraktMovieSync { Movies = traktMovies }; return(movieData); }
private TraktMovieSync GetWatchedMoviesData(List <Dictionary <string, string> > movies) { var traktMovies = new List <TraktMovieSync.Movie>(); traktMovies.AddRange(from movie in movies select new TraktMovieSync.Movie { IMDBID = movie[IMDbFieldMapping.cIMDbID], Title = movie[IMDbFieldMapping.cTitle], Year = int.Parse(movie[IMDbFieldMapping.cYear]).ToString() }); var movieWatchedData = new TraktMovieSync { UserName = AppSettings.TraktUsername, Password = AppSettings.TraktPassword, MovieList = traktMovies }; return(movieWatchedData); }
public static TraktMovieSync GetSyncMoviesData(List <Dictionary <string, string> > movies) { var traktMovies = new List <TraktMovie>(); traktMovies.AddRange(from movie in movies select new TraktMovie { Ids = new TraktMovieId { ImdbId = movie[IMDbFieldMapping.cIMDbID] }, Title = movie[IMDbFieldMapping.cTitle], Year = movie[IMDbFieldMapping.cYear].ToYear() }); var movieData = new TraktMovieSync { Movies = traktMovies }; return(movieData); }
/// <summary> /// Creates Sync Data based on a single movie /// </summary> /// <param name="title">Movie Title</param> /// <param name="year">Movie Year</param> /// <param name="imdb">IMDb Id of movie</param> /// <returns>The Trakt Sync data to send</returns> public static TraktMovieSync CreateMovieSyncData(string title, string year, string imdb, string tmdb) { List <TraktMovieSync.Movie> movies = new List <TraktMovieSync.Movie>(); TraktMovieSync.Movie syncMovie = new TraktMovieSync.Movie { Title = title, Year = year, IMDBID = imdb, TMDBID = tmdb }; movies.Add(syncMovie); TraktMovieSync syncData = new TraktMovieSync { UserName = TraktSettings.Username, Password = TraktSettings.Password, MovieList = movies }; return(syncData); }
public static void RemoveMovieFromWatchList(string title, string year, string imdbid, bool updateMovingPicturesFilters) { if (!GUICommon.CheckLogin(false)) { return; } TraktMovieSync syncObject = BasicHandler.CreateMovieSyncData(title, year, imdbid); if (syncObject == null) { return; } Thread syncThread = new Thread(delegate(object obj) { TraktSyncResponse response = TraktAPI.TraktAPI.SyncMovieLibrary(obj as TraktMovieSync, TraktSyncModes.unwatchlist); if (response == null || response.Status != "success") { return; } if (updateMovingPicturesFilters && IsMovingPicturesAvailableAndEnabled) { // Update Categories & Filters MovingPictures.ClearWatchListCache(); MovingPictures.UpdateCategoriesAndFilters(); } GUI.GUIWatchListMovies.ClearCache(TraktSettings.Username); }) { IsBackground = true, Name = "RemoveWatchList" }; syncThread.Start(syncObject); }
private TraktMovieSync GetMoviesData(List<ListalExport.RSSChannel.Item> movies) { var traktMovies = new List<TraktMovie>(); traktMovies.AddRange(from movie in movies select new TraktMovie { Title = movie.Title, Ids = new TraktMovieId { ImdbId = "tt" + movie.IMDbId }, }); var movieData = new TraktMovieSync { Movies = traktMovies }; return movieData; }
public void ImportRatings() { mImportCancelled = false; var lRatedCsvItems = new List <IMDbRateItem>(); var lWatchlistCsvItems = new List <IMDbListItem>(); var lCustomLists = new Dictionary <string, List <IMDbListItem> >(); #region Parse Ratings CSV UIUtils.UpdateStatus("Reading IMDb ratings export..."); if (mImportCsvRatings) { mCsvConfiguration.RegisterClassMap <IMDbRatingCsvMap>(); lRatedCsvItems = ParseCsvFile <IMDbRateItem>(mRatingsFileCsv); if (lRatedCsvItems == null) { UIUtils.UpdateStatus("Failed to parse IMDb ratings file!", true); Thread.Sleep(2000); return; } mCsvConfiguration.UnregisterClassMap <IMDbRatingCsvMap>(); } if (mImportCancelled) { return; } #endregion #region Parse Watchlist CSV UIUtils.UpdateStatus("Reading IMDb watchlist export..."); if (mImportCsvWatchlist) { mCsvConfiguration.RegisterClassMap <IMDbListCsvMap>(); lWatchlistCsvItems = ParseCsvFile <IMDbListItem>(mWatchlistFileCsv); if (lWatchlistCsvItems == null) { UIUtils.UpdateStatus("Failed to parse IMDb watchlist file!", true); Thread.Sleep(2000); return; } mCsvConfiguration.UnregisterClassMap <IMDbListCsvMap>(); } if (mImportCancelled) { return; } #endregion #region Parse Custom List CSVs UIUtils.UpdateStatus("Reading IMDb custom lists export..."); if (mImportCsvCustomLists) { mCsvConfiguration.RegisterClassMap <IMDbListCsvMap>(); foreach (var list in mCustomListsCsvs) { UIUtils.UpdateStatus($"Reading IMDb custom list '{list}'"); var lListCsvItems = ParseCsvFile <IMDbListItem>(list); if (lListCsvItems == null) { UIUtils.UpdateStatus("Failed to parse IMDb custom list file!", true); Thread.Sleep(2000); continue; } lCustomLists.Add(list, lListCsvItems); } mCsvConfiguration.UnregisterClassMap <IMDbListCsvMap>(); } if (mImportCancelled) { return; } #endregion #region Import Rated Movies var lRatedCsvMovies = lRatedCsvItems.Where(r => r.Type.ItemType() == IMDbType.Movie && r.MyRating != null) .Select(s => s.ToTraktRatedMovie()).ToList(); FileLog.Info($"Found {lRatedCsvMovies.Count} movie ratings in CSV file"); if (lRatedCsvMovies.Any()) { UIUtils.UpdateStatus("Retrieving existing movie ratings from trakt.tv"); var lCurrentUserMovieRatings = TraktAPI.GetRatedMovies(); if (lCurrentUserMovieRatings != null) { UIUtils.UpdateStatus($"Found {lCurrentUserMovieRatings.Count()} user movie ratings on trakt.tv"); // Filter out movies to rate from existing ratings online lRatedCsvMovies.RemoveAll(m => lCurrentUserMovieRatings.Any(c => c.Movie.Ids.ImdbId == m.Ids.ImdbId)); } UIUtils.UpdateStatus($"Importing {lRatedCsvMovies.Count()} new movie ratings to trakt.tv"); if (lRatedCsvMovies.Count > 0) { int lPageSize = AppSettings.BatchSize; int lPages = (int)Math.Ceiling((double)lRatedCsvMovies.Count / lPageSize); for (int i = 0; i < lPages; i++) { UIUtils.UpdateStatus($"Importing page {i + 1}/{lPages} IMDb rated movies..."); var lRatingsToSync = new TraktMovieRatingSync() { movies = lRatedCsvMovies.Skip(i * lPageSize).Take(lPageSize).ToList() }; TraktSyncResponse lResponse = TraktAPI.AddMoviesToRatings(lRatingsToSync); if (lResponse == null) { UIUtils.UpdateStatus("Error importing IMDb movie ratings to trakt.tv", true); Thread.Sleep(2000); } else if (lResponse.NotFound.Movies.Count > 0) { UIUtils.UpdateStatus($"Unable to sync ratings for {lResponse.NotFound.Movies.Count} movies as they're not found on trakt.tv!"); Thread.Sleep(1000); } if (mImportCancelled) { return; } } } } if (mImportCancelled) { return; } #endregion #region Import Rated TV Shows var lRatedCsvShows = lRatedCsvItems.Where(r => r.Type.ItemType() == IMDbType.Show && r.MyRating != null) .Select(s => s.ToTraktRatedShow()).ToList(); FileLog.Info($"Found {lRatedCsvShows.Count} tv show ratings in CSV file"); if (lRatedCsvShows.Any()) { UIUtils.UpdateStatus("Retrieving existing tv show ratings from trakt.tv"); var lCurrentUserShowRatings = TraktAPI.GetRatedShows(); if (lCurrentUserShowRatings != null) { UIUtils.UpdateStatus($"Found {lCurrentUserShowRatings.Count()} user tv show ratings on trakt.tv"); // Filter out shows to rate from existing ratings online lRatedCsvShows.RemoveAll(s => lCurrentUserShowRatings.Any(c => (c.Show.Ids.ImdbId == s.Ids.ImdbId) || (c.Show.Title.ToLowerInvariant() == s.Title.ToLowerInvariant() && c.Show.Year == s.Year))); } UIUtils.UpdateStatus($"Importing {lRatedCsvShows.Count()} tv show ratings to trakt.tv"); if (lRatedCsvShows.Count > 0) { int lPageSize = AppSettings.BatchSize; int lPages = (int)Math.Ceiling((double)lRatedCsvShows.Count / lPageSize); for (int i = 0; i < lPages; i++) { UIUtils.UpdateStatus($"Importing page {i + 1}/{lPages} IMDb rated shows..."); var lRatingsToSync = new TraktShowRatingSync() { shows = lRatedCsvShows.Skip(i * lPageSize).Take(lPageSize).ToList() }; TraktSyncResponse lResponse = TraktAPI.AddShowsToRatings(lRatingsToSync); if (lResponse == null) { UIUtils.UpdateStatus("Error importing IMDb tv show ratings to trakt.tv", true); Thread.Sleep(2000); } else if (lResponse.NotFound.Shows.Count > 0) { UIUtils.UpdateStatus($"Unable to sync ratings for {lResponse.NotFound.Shows.Count} shows as they're not found on trakt.tv!"); Thread.Sleep(1000); } if (mImportCancelled) { return; } } } } if (mImportCancelled) { return; } #endregion #region Import Rated Episodes var lImdbRatedEpisodes = new List <IMDbEpisode>(); var lImdbRatedCsvEpisodes = lRatedCsvItems.Where(r => r.Type.ItemType() == IMDbType.Episode).ToList(); FileLog.Info($"Found {lImdbRatedCsvEpisodes.Count} tv episode ratings in CSV file"); if (lImdbRatedCsvEpisodes.Any()) { // we can't rely on the episode imdb id as trakt most likely wont have that info at the episode level lImdbRatedEpisodes.AddRange(lImdbRatedCsvEpisodes.Select(Helper.GetIMDbEpisodeFromTrakt).Where(imdbEpisode => imdbEpisode != null)); if (mImportCancelled) { return; } UIUtils.UpdateStatus("Retrieving existing tv episode ratings from trakt.tv"); var lCurrentUserEpisodeRatings = TraktAPI.GetRatedEpisodes(); if (lCurrentUserEpisodeRatings != null) { UIUtils.UpdateStatus($"Found {lCurrentUserEpisodeRatings.Count()} user tv episode ratings on trakt.tv"); // Filter out episodes to rate from existing ratings online lImdbRatedEpisodes.RemoveAll(e => lCurrentUserEpisodeRatings.Any(c => c.Episode.Ids.Trakt == e.TraktId)); } UIUtils.UpdateStatus($"Importing {lImdbRatedEpisodes.Count()} episode ratings to trakt.tv"); if (lImdbRatedEpisodes.Count > 0) { int lPageSize = AppSettings.BatchSize; int lPages = (int)Math.Ceiling((double)lImdbRatedEpisodes.Count / lPageSize); for (int i = 0; i < lPages; i++) { var lEpisodesRated = Helper.GetTraktEpisodeRateData(lImdbRatedEpisodes.Skip(i * lPageSize).Take(lPageSize)); UIUtils.UpdateStatus($"Importing page {i + 1}/{lPages} IMDb rated episodes..."); var lResponse = TraktAPI.AddsEpisodesToRatings(lEpisodesRated); if (lResponse == null) { UIUtils.UpdateStatus("Error importing IMDb episodes ratings to trakt.tv", true); Thread.Sleep(2000); } else if (lResponse.NotFound.Episodes.Count > 0) { UIUtils.UpdateStatus($"Unable to sync ratings for {lResponse.NotFound.Episodes.Count} IMDb episodes as they're not found on trakt.tv!"); Thread.Sleep(1000); } if (mImportCancelled) { return; } } } } if (mImportCancelled) { return; } #endregion #region Mark Rated Items as Watched IEnumerable <TraktMoviePlays> lWatchedTraktMovies = null; if (AppSettings.MarkAsWatched) { #region Movies var lWatchedCsvMovies = lRatedCsvItems.Where(r => r.Type.ItemType() == IMDbType.Movie) .Select(s => s.ToTraktWatchedMovie()).ToList(); FileLog.Info("Found {0} movies in CSV file", lWatchedCsvMovies.Count); // compare all movies rated against what's not watched on trakt if (lWatchedCsvMovies.Count > 0) { // get watched movies from trakt.tv UIUtils.UpdateStatus("Requesting watched movies from trakt..."); lWatchedTraktMovies = TraktAPI.GetWatchedMovies(); if (lWatchedTraktMovies == null) { UIUtils.UpdateStatus("Failed to get watched movies from trakt.tv, skipping watched movie import", true); Thread.Sleep(2000); } else { if (mImportCancelled) { return; } UIUtils.UpdateStatus($"Found {lWatchedTraktMovies.Count()} watched movies on trakt"); UIUtils.UpdateStatus("Filtering out watched movies that are already watched on trakt.tv"); lWatchedCsvMovies.RemoveAll(w => lWatchedTraktMovies.FirstOrDefault(t => t.Movie.Ids.ImdbId == w.Ids.ImdbId || (t.Movie.Title.ToLowerInvariant() == w.Title.ToLowerInvariant() && t.Movie.Year == w.Year)) != null); // mark all rated movies as watched UIUtils.UpdateStatus($"Importing {lWatchedCsvMovies.Count} IMDb movies as watched..."); int lPageSize = AppSettings.BatchSize; int lPages = (int)Math.Ceiling((double)lRatedCsvMovies.Count / lPageSize); for (int i = 0; i < lPages; i++) { UIUtils.UpdateStatus($"Importing page {i + 1}/{lPages} IMDb movies as watched..."); var lMoviesToSync = new TraktMovieWatchedSync() { Movies = lWatchedCsvMovies.Skip(i * lPageSize).Take(lPageSize).ToList() }; var lResponse = TraktAPI.AddMoviesToWatchedHistory(lMoviesToSync); if (lResponse == null) { UIUtils.UpdateStatus("Failed to send watched status for IMDb movies to trakt.tv", true); Thread.Sleep(2000); } else if (lResponse.NotFound.Movies.Count > 0) { UIUtils.UpdateStatus($"Unable to sync watched states for {lResponse.NotFound.Movies.Count} movies as they're not found on trakt.tv!"); Thread.Sleep(1000); } if (mImportCancelled) { return; } } } } #endregion #region Episodes if (lImdbRatedEpisodes != null && lImdbRatedEpisodes.Any()) { int lPageSize = AppSettings.BatchSize; int lPages = (int)Math.Ceiling((double)lImdbRatedEpisodes.Count / lPageSize); for (int i = 0; i < lPages; i++) { var lEpisodesWatched = Helper.GetTraktEpisodeWatchedData(lImdbRatedEpisodes.Skip(i * lPageSize).Take(lPageSize)); UIUtils.UpdateStatus($"Importing page {i + 1}/{lPages} IMDb watched episodes..."); var lResponse = TraktAPI.AddEpisodesToWatchedHistory(lEpisodesWatched); if (lResponse == null) { UIUtils.UpdateStatus("Error importing IMDb episodes as watched to trakt.tv", true); Thread.Sleep(2000); } else if (lResponse.NotFound.Episodes.Count > 0) { UIUtils.UpdateStatus($"Unable to sync {lResponse.NotFound.Episodes.Count} IMDb episodes as watched, as they're not found on trakt.tv!"); Thread.Sleep(1000); } if (mImportCancelled) { return; } } } #endregion } #endregion #region Import Watchlist Movies var lWatchlistedCsvMovies = lWatchlistCsvItems.Where(r => r.Type.ItemType() == IMDbType.Movie) .Select(s => s.ToTraktMovie()).ToList(); FileLog.Info($"Found {lWatchlistedCsvMovies.Count} movies watchlisted in CSV file"); if (lWatchlistedCsvMovies.Any()) { UIUtils.UpdateStatus("Requesting existing watchlisted movies from trakt..."); var lWatchlistTraktMovies = TraktAPI.GetWatchlistMovies(); if (lWatchlistTraktMovies != null) { UIUtils.UpdateStatus($"Found {lWatchlistTraktMovies.Count()} watchlist movies on trakt"); UIUtils.UpdateStatus("Filtering out watchlist movies that are already in watchlist on trakt.tv"); lWatchlistedCsvMovies.RemoveAll(w => lWatchlistTraktMovies.FirstOrDefault(t => t.Movie.Ids.ImdbId == w.Ids.ImdbId || (t.Movie.Title.ToLowerInvariant() == w.Title.ToLowerInvariant() && t.Movie.Year == w.Year)) != null); } if (AppSettings.IgnoreWatchedForWatchlist && lWatchlistedCsvMovies.Count > 0) { // get watched movies from trakt so we don't import movies into watchlist that are already watched // we may already have this if we imported rated items as watched if (lWatchedTraktMovies != null) { UIUtils.UpdateStatus("Requesting watched movies from trakt..."); lWatchedTraktMovies = TraktAPI.GetWatchedMovies(); if (lWatchedTraktMovies == null) { UIUtils.UpdateStatus("Failed to get watched movies from trakt.tv", true); Thread.Sleep(2000); } } if (lWatchedTraktMovies != null) { UIUtils.UpdateStatus($"Found {lWatchedTraktMovies.Count()} watched movies on trakt"); UIUtils.UpdateStatus("Filtering out watchlist movies that are watched on trakt.tv"); // remove movies from sync list which are watched already lWatchlistedCsvMovies.RemoveAll(w => lWatchedTraktMovies.FirstOrDefault(t => t.Movie.Ids.ImdbId == w.Ids.ImdbId || (t.Movie.Title.ToLowerInvariant() == w.Title.ToLowerInvariant() && t.Movie.Year == w.Year)) != null); } } // add movies to watchlist UIUtils.UpdateStatus($"Importing {lWatchlistedCsvMovies.Count()} IMDb watchlist movies to trakt.tv..."); int lPageSize = AppSettings.BatchSize; int lPages = (int)Math.Ceiling((double)lWatchlistedCsvMovies.Count / lPageSize); for (int i = 0; i < lPages; i++) { UIUtils.UpdateStatus($"Importing page {i + 1}/{lPages} IMDb watchlist movies..."); var lWatchlistedToSync = new TraktMovieSync() { Movies = lWatchlistedCsvMovies.Skip(i * lPageSize).Take(lPageSize).ToList() }; var lResponse = TraktAPI.AddMoviesToWatchlist(lWatchlistedToSync); if (lResponse == null) { UIUtils.UpdateStatus("Failed to send watchlist for IMDb movies", true); Thread.Sleep(2000); } else if (lResponse.NotFound.Movies.Count > 0) { UIUtils.UpdateStatus($"Unable to sync watchlist for {lResponse.NotFound.Movies.Count} movies as they're not found on trakt.tv!"); Thread.Sleep(1000); } if (mImportCancelled) { return; } } } if (mImportCancelled) { return; } #endregion #region Import Watchlist TV Shows IEnumerable <TraktShowPlays> lWatchedTraktShows = null; var lWatchlistedCsvShows = lWatchlistCsvItems.Where(r => r.Type.ItemType() == IMDbType.Show) .Select(s => s.ToTraktShow()).ToList(); FileLog.Info($"Found {lWatchlistedCsvShows.Count} tv shows watchlisted in CSV file"); if (lWatchlistedCsvShows.Any()) { UIUtils.UpdateStatus("Requesting existing watchlisted shows from trakt..."); var lWatchlistTraktShows = TraktAPI.GetWatchlistShows(); if (lWatchlistTraktShows != null) { UIUtils.UpdateStatus($"Found {lWatchlistTraktShows.Count()} watchlist shows on trakt"); UIUtils.UpdateStatus("Filtering out watchlist shows that are already in watchlist on trakt.tv"); lWatchlistedCsvShows.RemoveAll(w => lWatchlistTraktShows.FirstOrDefault(t => t.Show.Ids.ImdbId == w.Ids.ImdbId || (t.Show.Title.ToLowerInvariant() == w.Title.ToLowerInvariant() && t.Show.Year == w.Year)) != null); } if (AppSettings.IgnoreWatchedForWatchlist && lWatchlistedCsvShows.Count > 0) { UIUtils.UpdateStatus("Requesting watched shows from trakt..."); // get watched movies from trakt so we don't import shows into watchlist that are already watched lWatchedTraktShows = TraktAPI.GetWatchedShows(); if (lWatchedTraktShows != null) { UIUtils.UpdateStatus($"Found {lWatchedTraktShows.Count()} watched shows on trakt"); UIUtils.UpdateStatus("Filtering out watchlist shows containing watched episodes on trakt.tv."); // remove shows from sync list which are watched already lWatchlistedCsvShows.RemoveAll(w => lWatchedTraktShows.FirstOrDefault(t => (t.Show.Ids.ImdbId == w.Ids.ImdbId) || (t.Show.Title.ToLowerInvariant() == w.Title.ToLowerInvariant() && t.Show.Year == w.Year)) != null); } } // add shows to watchlist UIUtils.UpdateStatus($"Importing {lWatchlistedCsvShows.Count()} IMDb watchlist shows to trakt.tv..."); int lPageSize = AppSettings.BatchSize; int lPages = (int)Math.Ceiling((double)lWatchlistedCsvShows.Count / lPageSize); for (int i = 0; i < lPages; i++) { UIUtils.UpdateStatus($"Importing page {i + 1}/{lPages} IMDb watchlist shows..."); var lWatchlistShowsToSync = new TraktShowSync { Shows = lWatchlistedCsvShows.Skip(i * lPageSize).Take(lPageSize).ToList() }; var lResponse = TraktAPI.AddShowsToWatchlist(lWatchlistShowsToSync); if (lResponse == null) { UIUtils.UpdateStatus("Failed to send watchlist for IMDb tv shows", true); Thread.Sleep(2000); } else if (lResponse.NotFound.Shows.Count > 0) { UIUtils.UpdateStatus($"Unable to sync watchlist for {lResponse.NotFound.Shows.Count} shows as they're not found on trakt.tv!"); Thread.Sleep(1000); } if (mImportCancelled) { return; } } } if (mImportCancelled) { return; } #endregion #region Import Watchlist Episodes var lImdbWatchlistedEpisodes = new List <IMDbEpisode>(); var lImdbWatchlistedCsvEpisodes = lWatchlistCsvItems.Where(r => r.Type.ItemType() == IMDbType.Episode).ToList(); FileLog.Info($"Found {lImdbWatchlistedCsvEpisodes.Count} tv episodes watchlisted in CSV file"); if (lImdbWatchlistedCsvEpisodes.Any()) { UIUtils.UpdateStatus($"Found {lImdbWatchlistedCsvEpisodes.Count()} IMDb watchlisted episodes"); lImdbWatchlistedEpisodes.AddRange(lImdbWatchlistedCsvEpisodes.Select(Helper.GetIMDbEpisodeFromTrakt).Where(imdbEpisode => imdbEpisode != null)); if (mImportCancelled) { return; } // filter out existing watchlist episodes UIUtils.UpdateStatus("Requesting existing watchlist episodes from trakt..."); var lWatchlistedTraktEpisodes = TraktAPI.GetWatchlistEpisodes(); if (lWatchlistedTraktEpisodes != null) { UIUtils.UpdateStatus($"Found {lWatchlistedTraktEpisodes.Count()} watchlist episodes on trakt"); UIUtils.UpdateStatus("Filtering out watchlist episodes that are already in watchlist on trakt.tv"); lImdbWatchlistedEpisodes.RemoveAll(e => lWatchlistedTraktEpisodes.FirstOrDefault(w => w.Episode.Ids.Trakt == e.TraktId) != null); } if (AppSettings.IgnoreWatchedForWatchlist && lImdbWatchlistedEpisodes.Count > 0) { // we already might have it from the shows sync if (lWatchedTraktShows == null) { UIUtils.UpdateStatus("Requesting watched episodes from trakt..."); // get watched episodes from trakt so we don't import episodes into watchlist that are already watched lWatchedTraktShows = TraktAPI.GetWatchedShows(); } if (lWatchedTraktShows != null) { UIUtils.UpdateStatus("Filtering out watchlist episodes containing watched episodes on trakt.tv"); // this wont work atm due to show IMDb ID not being set in the IMDbEpisode object lImdbWatchlistedEpisodes.RemoveAll(e => lWatchedTraktShows.Where(s => s.Show.Ids.ImdbId == e.ShowImdbId) .Any(s => s.Seasons.Exists(se => se.Number == e.SeasonNumber && se.Episodes.Exists(ep => ep.Number == e.EpisodeNumber)))); } } UIUtils.UpdateStatus($"Importing {lImdbWatchlistedEpisodes.Count()} episodes in watchlist to trakt.tv"); if (lImdbWatchlistedEpisodes.Count > 0) { int lPageSize = AppSettings.BatchSize; int lPages = (int)Math.Ceiling((double)lImdbWatchlistedEpisodes.Count / lPageSize); for (int i = 0; i < lPages; i++) { UIUtils.UpdateStatus($"Importing page {i + 1}/{lPages} IMDb watchlisted episodes..."); var lResponse = TraktAPI.AddEpisodesToWatchlist(Helper.GetTraktEpisodeData(lImdbWatchlistedEpisodes.Skip(i * lPageSize).Take(lPageSize))); if (lResponse == null) { UIUtils.UpdateStatus("Error importing IMDb episode watchlist to trakt.tv", true); Thread.Sleep(2000); } else if (lResponse.NotFound.Episodes.Count > 0) { UIUtils.UpdateStatus("Unable to sync watchlist for {0} IMDb episodes as they're not found on trakt.tv!", lResponse.NotFound.Episodes.Count); Thread.Sleep(1000); } if (mImportCancelled) { return; } } } } #endregion #region Import Custom Lists if (lCustomLists.Count > 0) { UIUtils.UpdateStatus("Requesting custom lists from trakt..."); var lTraktCustomLists = TraktAPI.GetCustomLists(); if (lTraktCustomLists == null) { UIUtils.UpdateStatus("Error requesting custom lists from trakt.tv", true); Thread.Sleep(2000); return; } UIUtils.UpdateStatus($"Found {lTraktCustomLists.Count()} custom lists on trakt.tv"); foreach (var list in lCustomLists) { bool lListCreated = false; string lListName = Path.GetFileNameWithoutExtension(list.Key); // create the list if we don't have it TraktListDetail lTraktCustomList = lTraktCustomLists.FirstOrDefault(l => l.Name == lListName); if (lTraktCustomList == null) { UIUtils.UpdateStatus($"Creating new custom list '{lListName}' on trakt.tv"); var lTraktList = new TraktList { Name = lListName, DisplayNumbers = true, }; lTraktCustomList = TraktAPI.CreateCustomList(lTraktList); if (lTraktCustomList == null) { UIUtils.UpdateStatus("Error creating custom list on trakt.tv, skipping list creation", true); Thread.Sleep(2000); continue; } lListCreated = true; } // get the CSV list items parsed var lIMDbCsvListItems = list.Value; var lImdbCsvListMovies = lIMDbCsvListItems.Where(l => l.Type.ItemType() == IMDbType.Movie).Select(m => m.ToTraktMovie()).ToList(); var lImdbCsvListShows = lIMDbCsvListItems.Where(l => l.Type.ItemType() == IMDbType.Show).Select(m => m.ToTraktShow()).ToList(); FileLog.Info($"Found {lIMDbCsvListItems.Count} movies and {lImdbCsvListShows.Count} shows in IMDb {lListName} list", lListName); // if the list already exists, get current items for list if (!lListCreated) { lTraktCustomList = lTraktCustomLists.FirstOrDefault(l => l.Name == lListName); UIUtils.UpdateStatus($"Requesting existing custom list '{lListName}' items from trakt..."); var lTraktListItems = TraktAPI.GetCustomListItems(lTraktCustomList.Ids.Trakt.ToString()); if (lTraktListItems == null) { UIUtils.UpdateStatus("Error requesting custom list items from trakt.tv, skipping list creation", true); Thread.Sleep(2000); continue; } // filter out existing items from CSV so we don't send again FileLog.Info($"Filtering out existing items from IMDb list '{lListName}' so we don't send again to trakt.tv"); lImdbCsvListMovies.RemoveAll(i => lTraktListItems.FirstOrDefault(l => l.Movie.Ids.ImdbId == i.Ids.ImdbId) != null); lImdbCsvListShows.RemoveAll(i => lTraktListItems.FirstOrDefault(l => l.Show.Ids.ImdbId == i.Ids.ImdbId) != null); } #region Movies UIUtils.UpdateStatus($"Importing {lImdbCsvListMovies.Count} new movies into {lListName} custom list..."); int lPageSize = AppSettings.BatchSize; int lPages = (int)Math.Ceiling((double)lImdbCsvListMovies.Count / lPageSize); for (int i = 0; i < lPages; i++) { UIUtils.UpdateStatus($"Importing page {i + 1}/{lPages} IMDb custom list movies..."); // create list sync object to hold list items var lTraktMovieSync = new TraktSyncAll { Movies = lImdbCsvListMovies.Skip(i * lPageSize).Take(lPageSize).ToList() }; var lResponse = TraktAPI.AddItemsToList(lTraktCustomList.Ids.Trakt.ToString(), lTraktMovieSync); if (lResponse == null) { UIUtils.UpdateStatus("Failed to send custom list items for IMDb movies", true); Thread.Sleep(2000); } else if (lResponse.NotFound.Movies.Count > 0) { UIUtils.UpdateStatus($"Unable to sync custom list items for {lResponse.NotFound.Movies.Count} movies as they're not found on trakt.tv!"); Thread.Sleep(1000); } if (mImportCancelled) { return; } } #endregion #region Shows UIUtils.UpdateStatus("Importing {0} new shows into {1} custom list...", lImdbCsvListShows.Count(), lListName); lPageSize = AppSettings.BatchSize; lPages = (int)Math.Ceiling((double)lImdbCsvListShows.Count / lPageSize); for (int i = 0; i < lPages; i++) { UIUtils.UpdateStatus("Importing page {0}/{1} IMDb custom list shows...", i + 1, lPages); // create list sync object to hold list items var lTraktShowSync = new TraktSyncAll { Shows = lImdbCsvListShows.Skip(i * lPageSize).Take(lPageSize).ToList() }; var lResponse = TraktAPI.AddItemsToList(lTraktCustomList.Ids.Trakt.ToString(), lTraktShowSync); if (lResponse == null) { UIUtils.UpdateStatus("Failed to send custom list items for IMDb shows", true); Thread.Sleep(2000); } else if (lResponse.NotFound.Shows.Count > 0) { UIUtils.UpdateStatus("Unable to sync custom list items for {0} shows as they're not found on trakt.tv!", lResponse.NotFound.Shows.Count); Thread.Sleep(1000); } if (mImportCancelled) { return; } } #endregion } } #endregion }
public static TraktMovieSync GetSyncMoviesData(List<Dictionary<string, string>> movies) { var traktMovies = new List<TraktMovie>(); traktMovies.AddRange(from movie in movies select new TraktMovie { Ids = new TraktMovieId { ImdbId = movie[IMDbFieldMapping.cIMDbID] }, Title = movie[IMDbFieldMapping.cTitle], Year = movie[IMDbFieldMapping.cYear].ToYear() }); var movieData = new TraktMovieSync { Movies = traktMovies }; return movieData; }
/// <summary> /// Creates Sync Data based on a List of TraktLibraryMovies objects /// </summary> /// <param name="Movies">The movies to base the object on</param> /// <returns>The Trakt Sync data to send</returns> public static TraktMovieSync CreateMovieSyncData(List<TraktLibraryMovies> Movies) { string username = TraktSettings.Username; string password = TraktSettings.Password; if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password)) return null; List<TraktMovieSync.Movie> moviesList = (from m in Movies select new TraktMovieSync.Movie { IMDBID = m.IMDBID, Title = m.Title, Year = m.Year.ToString() }).ToList(); TraktMovieSync syncData = new TraktMovieSync { UserName = username, Password = password, MovieList = moviesList }; return syncData; }
/// <summary> /// Creates Sync Data based on a single movie /// </summary> /// <param name="title">Movie Title</param> /// <param name="year">Movie Year</param> /// <param name="imdb">IMDb Id of movie</param> /// <returns>The Trakt Sync data to send</returns> public static TraktMovieSync CreateMovieSyncData(string title, string year, string imdb, string tmdb) { List<TraktMovieSync.Movie> movies = new List<TraktMovieSync.Movie>(); TraktMovieSync.Movie syncMovie = new TraktMovieSync.Movie { Title = title, Year = year, IMDBID = imdb, TMDBID = tmdb }; movies.Add(syncMovie); TraktMovieSync syncData = new TraktMovieSync { UserName = TraktSettings.Username, Password = TraktSettings.Password, MovieList = movies }; return syncData; }
/// <summary> /// Syncs Movie data in another thread /// </summary> /// <param name="syncData">Data to sync</param> /// <param name="mode">The Syncing mode to use</param> private void SyncMovie(TraktMovieSync syncData, TraktSyncModes mode) { BackgroundWorker moviesync = new BackgroundWorker(); moviesync.DoWork += new DoWorkEventHandler(moviesync_DoWork); moviesync.RunWorkerCompleted += new RunWorkerCompletedEventHandler(moviesync_RunWorkerCompleted); moviesync.RunWorkerAsync(new MovieSyncAndMode { SyncData = syncData, Mode = mode }); }
private TraktMovieSync CreateSyncData(TraktWatchListMovie movie) { if (movie == null) return null; List<TraktMovieSync.Movie> movies = new List<TraktMovieSync.Movie>(); TraktMovieSync.Movie syncMovie = new TraktMovieSync.Movie { IMDBID = movie.Imdb, Title = movie.Title, Year = movie.Year }; movies.Add(syncMovie); TraktMovieSync syncData = new TraktMovieSync { UserName = TraktSettings.Username, Password = TraktSettings.Password, MovieList = movies }; return syncData; }
/// <summary> /// Creates Sync Data based on a single movie /// </summary> /// <param name="title">Movie Title</param> /// <param name="year">Movie Year</param> /// <param name="imdb">IMDb Id of movie</param> /// <returns>The Trakt Sync data to send</returns> public static TraktMovieSync CreateMovieSyncData(string title, string year, string imdb) { if (string.IsNullOrEmpty(imdb) && (string.IsNullOrEmpty(title) || string.IsNullOrEmpty(year))) return null; List<TraktMovieSync.Movie> movies = new List<TraktMovieSync.Movie>(); TraktMovieSync.Movie syncMovie = new TraktMovieSync.Movie { Title = title, Year = year, IMDBID = imdb }; movies.Add(syncMovie); TraktMovieSync syncData = new TraktMovieSync { UserName = TraktSettings.Username, Password = TraktSettings.Password, MovieList = movies }; return syncData; }
private TraktMovieSync GetSyncMoviesData(List<TMDbMovie> movies) { var traktMovies = new List<TraktMovie>(); traktMovies.AddRange(from movie in movies select new TraktMovie { Ids = new TraktMovieId { TmdbId = movie.Id } }); var movieSyncData = new TraktMovieSync { Movies = traktMovies }; return movieSyncData; }
/// <summary> /// Removes all movies from watchlist from trakt /// </summary> /// <param name="syncData">list of movies</param> public static TraktSyncResponse RemoveMoviesFromWatchlist(TraktMovieSync syncData) { if (syncData == null) return null; var response = TraktWeb.PostToTrakt(TraktURIs.SyncWatchlistRemove, syncData.ToJSON()); return response.FromJSON<TraktSyncResponse>(); }
/// <summary> /// Sends movie sync data to Trakt Watchlist /// </summary> /// <param name="syncData">The sync data to send</param> /// <returns>The response from trakt</returns> public static TraktSyncResponse AddMoviesToWatchlist(TraktMovieSync syncData) { // check that we have everything we need if (syncData == null || syncData.Movies == null || syncData.Movies.Count == 0) return null; // serialize data to JSON and send to server string response = TraktWeb.PostToTrakt(TraktURIs.SyncWatchlist, syncData.ToJSON()); // return success or failure return response.FromJSON<TraktSyncResponse>(); }
public bool SyncMovies() { try { TestStatus = "[Trakt.SyncMovies]"; Guid[] types = { MediaAspect.ASPECT_ID, MovieAspect.ASPECT_ID }; var contentDirectory = ServiceRegistration.Get<IServerConnectionManager>().ContentDirectory; if (contentDirectory == null) { TestStatus = "[Trakt.MediaLibraryNotConnected]"; return false; } var movies = contentDirectory.Search(new MediaItemQuery(types, null, null), true); TraktMovieSync syncData = new TraktMovieSync { UserName = Username, Password = Password, MovieList = new List<TraktMovieSync.Movie>() }; // First send all movies to Trakt that we have so they appear in library foreach (var movie in movies) syncData.MovieList.Add(ToMovie(movie)); TraktSyncModes traktSyncMode = TraktSyncModes.library; var response = TraktAPI.SyncMovieLibrary(syncData, traktSyncMode); ServiceRegistration.Get<ILogger>().Info("Trakt.tv: Movies '{0}': {1} inserted, {2} existing, {3} skipped movies.", traktSyncMode, response.Inserted, SafeCount(response.AlreadyExistMovies), SafeCount(response.SkippedMovies)); syncData.MovieList.Clear(); // Then send only the watched movies as "seen" foreach (var movie in movies.Where(IsWatched)) syncData.MovieList.Add(ToMovie(movie)); traktSyncMode = TraktSyncModes.seen; response = TraktAPI.SyncMovieLibrary(syncData, traktSyncMode); ServiceRegistration.Get<ILogger>().Info("Trakt.tv: Movies '{0}': {1} inserted, {2} existing, {3} skipped movies.", traktSyncMode, response.Inserted, SafeCount(response.AlreadyExistMovies), SafeCount(response.SkippedMovies)); return true; } catch (Exception ex) { ServiceRegistration.Get<ILogger>().Error("Trakt.tv: Exception while synchronizing media library.", ex); } return false; }
private TraktMovieSync GetSyncMoviesData(List<FlixsterMovieRating> aMovieItems) { var traktMovies = new List<TraktMovie>(); traktMovies.AddRange(from movieItem in aMovieItems select new TraktMovie { Title = movieItem.Movie.Title, Year = movieItem.Movie.Year.ToYear(), }); var movieSyncData = new TraktMovieSync { Movies = traktMovies }; return movieSyncData; }
/// <summary> /// Creates Sync Data based on a single IMDBMovie object /// </summary> /// <param name="Movie">The movie to base the object on</param> /// <returns>The Trakt Sync data to send</returns> public static TraktMovieSync CreateSyncData(MFMovie Movie) { string username = TraktSettings.Username; string password = TraktSettings.Password; if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password)) return null; List<TraktMovieSync.Movie> moviesList = new List<TraktMovieSync.Movie>(); moviesList.Add(new TraktMovieSync.Movie { IMDBID = Movie.IMDBNumber, Title = Movie.Title, Year = Movie.Year.ToString() }); TraktMovieSync syncData = new TraktMovieSync { UserName = username, Password = password, MovieList = moviesList }; return syncData; }
public static void RemoveMoviesFromWatchlist() { if (Cancel) return; UIUtils.UpdateStatus("Getting watchlisted movies from trakt.tv"); var watchlistedMovies = TraktAPI.TraktAPI.GetWatchlistMovies(); if (watchlistedMovies != null) { UIUtils.UpdateStatus("Found {0} movies watchlisted on trakt.tv", watchlistedMovies.Count()); int pageSize = AppSettings.BatchSize; int pages = (int)Math.Ceiling((double)watchlistedMovies.Count() / pageSize); for (int i = 0; i < pages; i++) { if (Cancel) return; var syncData = new TraktMovieSync { Movies = watchlistedMovies.Select(r => r.Movie).Skip(i * pageSize).Take(pageSize).ToList() }; UIUtils.UpdateStatus("[{0}/{1}] Removing movies from trakt.tv watchlist", i + 1, pages); var syncResponse = TraktAPI.TraktAPI.RemoveMoviesFromWatchlist(syncData); if (syncResponse == null) { UIUtils.UpdateStatus(string.Format("[{0}/{1}] Failed to remove movies from trakt.tv watchlist", i + 1, pages), true); Thread.Sleep(2000); continue; } } } else { UIUtils.UpdateStatus("Failed to get current list of watchlisted movies from trakt.tv", true); Thread.Sleep(2000); } }
public void ImportRatings() { importCancelled = false; List <Dictionary <string, string> > watchlistMovies = new List <Dictionary <string, string> >(); List <Dictionary <string, string> > watchlistShows = new List <Dictionary <string, string> >(); List <Dictionary <string, string> > ratedItems = new List <Dictionary <string, string> >(); List <Dictionary <string, string> > watchlistItems = new List <Dictionary <string, string> >(); List <IMDbListItem> lWatchlistItems = new List <IMDbListItem>(); #region Download Data UIUtils.UpdateStatus("Requesting ratings from IMDb.com..."); int movieIndex = 0; int movieIncrement = 100; string paginationKey = string.Empty; Regex reg; Match find; #region Ratings do { UIUtils.UpdateStatus("Requesting ratings {0} - {1}, Total Results: {2}", movieIndex + 1, (movieIncrement + movieIndex), ratedItems.Count); string url = "http://www.imdb.com/user/" + username + "/ratings?sort=date_added%2Cdesc&mode=detail&lastPosition=" + movieIndex + (string.IsNullOrEmpty(paginationKey) ? string.Empty : "&paginationKey=" + paginationKey); string response = TraktWeb.Transmit(url, null, false); if (response == null) { break; } int begin = 0; // only log response when set to trace as it's very verbose in this case if (AppSettings.LogSeverityLevel >= AppSettings.LoggingSeverity.Trace) { FileLog.Trace("Response: {0}", response); } while ((begin = response.IndexOf("lister-item-content", begin)) > 0) { var rateItem = new Dictionary <string, string>(); string sub = response.Substring(begin, response.IndexOf("class=\"clear\"", begin) - begin); reg = new Regex("<a href=\"/title/(?<cIMDbID>tt\\d+)/[^\"]*\"\n>(?<cTitle>[^<]*)</a>(?:[.\\s\\S]*Episode:</small>\\s*<a href=\"/title/(?<cEpisodeID>tt\\d+)/[^\"]*\"\n*>(?<cEpisodeTitle>[^<]+)</a>){0,1}"); // Get IMDb ID find = reg.Match(sub); rateItem.Add(IMDbFieldMapping.cIMDbID, find.Groups["cIMDbID"].ToString()); // Get Title // If it's a TV Episode then include both show and episode title if (!string.IsNullOrEmpty(find.Groups["cEpisodeTitle"].ToString())) { rateItem.Add(IMDbFieldMapping.cTitle, string.Format("{0}: {1}", find.Groups["cTitle"], find.Groups["cEpisodeTitle"])); } else { rateItem.Add(IMDbFieldMapping.cTitle, find.Groups["cTitle"].ToString()); } // Get User Rating reg = new Regex("<span class=\"ipl-rating-star__rating\">([1-9][0-9]{0,1})</span>"); find = reg.Match(sub); rateItem.Add(IMDbFieldMapping.cRating, find.Groups[1].ToString()); // Get Year reg = new Regex("<span class=\"lister-item-year text-muted unbold\">\\(([1-2][0-9]{3}).*\\)</span>"); find = reg.Match(sub); rateItem.Add(IMDbFieldMapping.cYear, find.Groups[1].ToString()); // Get Type reg = new Regex("<span class=\"lister-item-year text-muted unbold\">\\(([1-2][0-9]{3}–).*\\)</span>"); find = reg.Match(sub); if (find.Groups[1].ToString() == string.Empty) { rateItem.Add(IMDbFieldMapping.cType, "Feature Film"); } else { rateItem.Add(IMDbFieldMapping.cType, "tvseries"); } // Set provider to web or csv rateItem.Add(IMDbFieldMapping.cProvider, "web"); ratedItems.Add(rateItem); begin += 10; } // fetch next page movieIndex += movieIncrement; reg = new Regex("<a class=\"flat-button lister-page-next next-page\" href=.*&paginationKey=(?<cPaginationKey>.*)&"); find = reg.Match(response); paginationKey = find.Groups["cPaginationKey"].ToString(); }while (movieIndex == ratedItems.Count); #endregion #region Watchlist if (AppSettings.IMDbSyncWatchlist) { UIUtils.UpdateStatus("Reading IMDb watchlist from web..."); string url = "http://www.imdb.com/user/" + username + "/watchlist"; string response = TraktWeb.Transmit(url, null, false); if (response != null) { var sub = response.Substring(0, response.IndexOf("</head>", 0)); reg = new Regex("ls\\d+"); // Get IMDb Watchlist ID find = reg.Match(sub); url = "http://www.imdb.com/list/" + find.Value + "/export"; using (StreamReader reader = TraktWeb.GetCsvStream(url)) { if (reader == null) { UIUtils.UpdateStatus("Failed to download watchlist from IMDb.", true); Thread.Sleep(2000); } else { lWatchlistItems = ParseCsvFile <IMDbListItem>(reader); if (lWatchlistItems == null) { UIUtils.UpdateStatus("Failed to parse IMDb watchlist file!", true); Thread.Sleep(2000); } } } } // only log response when set to trace as it's very verbose in this case if (AppSettings.LogSeverityLevel >= AppSettings.LoggingSeverity.Trace) { FileLog.Trace("Response: {0}", response); } } #endregion #endregion if (importCancelled) { return; } #region Sync Ratings #region Movies var movies = ratedItems.Where(r => r[IMDbFieldMapping.cType].ItemType() == IMDbType.Movie && !string.IsNullOrEmpty(r[IMDbFieldMapping.cRating])).ToList(); if (movies.Any()) { UIUtils.UpdateStatus("Retrieving existing movie ratings from trakt.tv"); var currentUserMovieRatings = TraktAPI.GetRatedMovies(); if (currentUserMovieRatings != null) { UIUtils.UpdateStatus(string.Format("Found {0} user movie ratings on trakt.tv", currentUserMovieRatings.Count())); // Filter out movies to rate from existing ratings online movies.RemoveAll(m => currentUserMovieRatings.Any(c => c.Movie.Ids.ImdbId == m[IMDbFieldMapping.cIMDbID])); } UIUtils.UpdateStatus("Importing {0} new IMDb movie ratings to trakt.tv", movies.Count()); if (movies.Count > 0) { int pageSize = AppSettings.BatchSize; int pages = (int)Math.Ceiling((double)movies.Count / pageSize); for (int i = 0; i < pages; i++) { UIUtils.UpdateStatus("Importing page {0}/{1} IMDb rated movies...", i + 1, pages); TraktSyncResponse response = TraktAPI.AddMoviesToRatings(Helper.GetRateMoviesData(movies.Skip(i * pageSize).Take(pageSize))); if (response == null) { UIUtils.UpdateStatus("Error importing IMDb movie ratings to trakt.tv", true); Thread.Sleep(2000); } else if (response.NotFound.Movies.Count > 0) { UIUtils.UpdateStatus("Unable to sync ratings for {0} IMDb movies as they're not found on trakt.tv!", response.NotFound.Movies.Count); Thread.Sleep(1000); } if (importCancelled) { return; } } } } if (importCancelled) { return; } #endregion #region TV Shows var shows = ratedItems.Where(r => r[IMDbFieldMapping.cType].ItemType() == IMDbType.Show && !string.IsNullOrEmpty(r[IMDbFieldMapping.cRating])).ToList(); if (shows.Any()) { UIUtils.UpdateStatus("Retrieving existing tv show ratings from trakt.tv"); var currentUserShowRatings = TraktAPI.GetRatedShows(); if (currentUserShowRatings != null) { UIUtils.UpdateStatus("Found {0} user tv show ratings on trakt.tv", currentUserShowRatings.Count()); // Filter out shows to rate from existing ratings online shows.RemoveAll(s => currentUserShowRatings.Any(c => (c.Show.Ids.ImdbId == s[IMDbFieldMapping.cIMDbID]) || (c.Show.Title == s[IMDbFieldMapping.cTitle] && c.Show.Year.ToString() == s[IMDbFieldMapping.cYear]))); } if (shows.Count > 0) { UIUtils.UpdateStatus("Importing {0} new IMDb tv show ratings to trakt.tv", shows.Count()); int pageSize = AppSettings.BatchSize; int pages = (int)Math.Ceiling((double)shows.Count / pageSize); for (int i = 0; i < pages; i++) { UIUtils.UpdateStatus("Importing page {0}/{1} IMDb rated shows...", i + 1, pages); TraktSyncResponse response = TraktAPI.AddShowsToRatings(Helper.GetRateShowsData(shows.Skip(i * pageSize).Take(pageSize))); if (response == null) { UIUtils.UpdateStatus("Error importing IMDb show ratings to trakt.tv", true); Thread.Sleep(2000); } else if (response.NotFound.Shows.Count > 0) { UIUtils.UpdateStatus("Unable to sync ratings for {0} IMDb shows as they're not found on trakt.tv!", response.NotFound.Shows.Count); Thread.Sleep(1000); } if (importCancelled) { return; } } } } if (importCancelled) { return; } #endregion #region Episodes var imdbEpisodes = new List <IMDbEpisode>(); var episodes = ratedItems.Where(r => r[IMDbFieldMapping.cType].ItemType() == IMDbType.Episode).ToList(); if (episodes.Any()) { // we can't rely on the imdb id as trakt most likely wont have the info for episodes // search and cache all series info needed for syncing // use the tvdb API to first search for each unique series name // then GetSeries by TVDb ID to get a list of all episodes // each episode will have TVDb ID which we can use for syncing. imdbEpisodes.AddRange(episodes.Select(Helper.GetIMDbEpisodeFromTrakt).Where(imdbEpisode => imdbEpisode != null)); UIUtils.UpdateStatus("Retrieving existing tv episode ratings from trakt.tv"); var currentUserEpisodeRatings = TraktAPI.GetRatedEpisodes(); if (currentUserEpisodeRatings != null) { UIUtils.UpdateStatus("Found {0} user tv episode ratings on trakt.tv", currentUserEpisodeRatings.Count()); // Filter out episodes to rate from existing ratings online imdbEpisodes.RemoveAll(e => currentUserEpisodeRatings.Any(c => c.Episode.Ids.Trakt == e.TraktId)); } UIUtils.UpdateStatus("Importing {0} episode ratings to trakt.tv", imdbEpisodes.Count()); if (imdbEpisodes.Count > 0) { int pageSize = AppSettings.BatchSize; int pages = (int)Math.Ceiling((double)imdbEpisodes.Count / pageSize); for (int i = 0; i < pages; i++) { var episodesRated = Helper.GetTraktEpisodeRateData(imdbEpisodes.Skip(i * pageSize).Take(pageSize)); UIUtils.UpdateStatus("Importing page {0}/{1} IMDb rated episodes...", i + 1, pages); var response = TraktAPI.AddsEpisodesToRatings(episodesRated); if (response == null) { UIUtils.UpdateStatus("Error importing IMDb episodes ratings to trakt.tv", true); Thread.Sleep(2000); } else if (response.NotFound.Episodes.Count > 0) { UIUtils.UpdateStatus("Unable to sync ratings for {0} IMDb episodes as they're not found on trakt.tv!", response.NotFound.Episodes.Count); Thread.Sleep(1000); } if (importCancelled) { return; } } } } if (importCancelled) { return; } #endregion #endregion #region Mark as Watched IEnumerable <TraktMoviePlays> watchedTraktMovies = null; if (AppSettings.MarkAsWatched) { #region Movies // compare all movies rated against what's not watched on trakt movies = ratedItems.Where(r => r[IMDbFieldMapping.cType].ItemType() == IMDbType.Movie && !string.IsNullOrEmpty(r[IMDbFieldMapping.cRating])).ToList(); if (movies.Count > 0) { // get watched movies from trakt.tv UIUtils.UpdateStatus("Requesting watched movies from trakt..."); watchedTraktMovies = TraktAPI.GetWatchedMovies(); if (watchedTraktMovies == null) { UIUtils.UpdateStatus("Failed to get watched movies from trakt.tv, skipping watched movie import", true); Thread.Sleep(2000); } else { if (importCancelled) { return; } UIUtils.UpdateStatus("Found {0} watched movies on trakt", watchedTraktMovies.Count()); UIUtils.UpdateStatus("Filtering out watched movies that are already watched on trakt.tv"); movies.RemoveAll(w => watchedTraktMovies.FirstOrDefault(t => t.Movie.Ids.ImdbId == w[IMDbFieldMapping.cIMDbID] || (t.Movie.Title.ToLowerInvariant() == w[IMDbFieldMapping.cTitle] && t.Movie.Year.ToString() == w[IMDbFieldMapping.cYear])) != null); // mark all rated movies as watched UIUtils.UpdateStatus("Importing {0} IMDb movies as watched...", movies.Count); int pageSize = AppSettings.BatchSize; int pages = (int)Math.Ceiling((double)movies.Count / pageSize); for (int i = 0; i < pages; i++) { UIUtils.UpdateStatus("Importing page {0}/{1} IMDb movies as watched...", i + 1, pages); var response = TraktAPI.AddMoviesToWatchedHistory(Helper.GetSyncWatchedMoviesData(movies.Skip(i * pageSize).Take(pageSize).ToList())); if (response == null) { UIUtils.UpdateStatus("Failed to send watched status for IMDb movies", true); Thread.Sleep(2000); } else if (response.NotFound.Movies.Count > 0) { UIUtils.UpdateStatus("Unable to sync watched state for {0} IMDb movies as they're not found on trakt.tv!", response.NotFound.Movies.Count); Thread.Sleep(1000); } if (importCancelled) { return; } } } } #endregion #region Episodes if (imdbEpisodes != null && imdbEpisodes.Any()) { int pageSize = AppSettings.BatchSize; int pages = (int)Math.Ceiling((double)imdbEpisodes.Count / pageSize); for (int i = 0; i < pages; i++) { var episodesWatched = Helper.GetTraktEpisodeWatchedData(imdbEpisodes.Skip(i * pageSize).Take(pageSize)); UIUtils.UpdateStatus("Importing page {0}/{1} IMDb watched episodes...", i + 1, pages); var response = TraktAPI.AddEpisodesToWatchedHistory(episodesWatched); if (response == null) { UIUtils.UpdateStatus("Error importing IMDb episodes as watched to trakt.tv", true); Thread.Sleep(2000); } else if (response.NotFound.Episodes.Count > 0) { UIUtils.UpdateStatus("Unable to sync {0} IMDb episodes as watched, as they're not found on trakt.tv!", response.NotFound.Episodes.Count); Thread.Sleep(1000); } if (importCancelled) { return; } } } #endregion } #endregion #region Sync Watchlist if (AppSettings.IMDbSyncWatchlist) { #region Movies var lWatchlistedMovies = lWatchlistItems.Where(r => r.Type.ItemType() == IMDbType.Movie) .Select(s => s.ToTraktMovie()).ToList(); if (lWatchlistedMovies.Any()) { UIUtils.UpdateStatus("Requesting existing watchlist movies from trakt..."); var lWatchlistTraktMovies = TraktAPI.GetWatchlistMovies(); if (lWatchlistTraktMovies != null) { UIUtils.UpdateStatus($"Found {0} watchlist movies on trakt", lWatchlistTraktMovies.Count()); UIUtils.UpdateStatus("Filtering out watchlist movies that are already in watchlist on trakt.tv"); lWatchlistedMovies.RemoveAll(w => lWatchlistTraktMovies.FirstOrDefault(t => t.Movie.Ids.ImdbId == w.Ids.ImdbId || (t.Movie.Title.ToLowerInvariant() == w.Title.ToLowerInvariant() && t.Movie.Year == w.Year)) != null); } if (AppSettings.IgnoreWatchedForWatchlist && lWatchlistedMovies.Count > 0) { // get watched movies from trakt so we don't import movies into watchlist that are already watched // we may already have this if we imported rated items as watched if (watchedTraktMovies == null) { UIUtils.UpdateStatus("Requesting watched movies from trakt..."); watchedTraktMovies = TraktAPI.GetWatchedMovies(); if (watchedTraktMovies == null) { UIUtils.UpdateStatus("Failed to get watched movies from trakt.tv", true); Thread.Sleep(2000); } } if (watchedTraktMovies != null) { UIUtils.UpdateStatus($"Found {0} watched movies on trakt", watchedTraktMovies.Count()); UIUtils.UpdateStatus("Filtering out watchlist movies that are watched on trakt.tv"); // remove movies from sync list which are watched already lWatchlistedMovies.RemoveAll(w => watchedTraktMovies.FirstOrDefault(t => t.Movie.Ids.ImdbId == w.Ids.ImdbId || (t.Movie.Title.ToLowerInvariant() == w.Title.ToLowerInvariant() && t.Movie.Year == w.Year)) != null); } } // add movies to watchlist UIUtils.UpdateStatus($"Importing {0} IMDb watchlist movies to trakt.tv...", lWatchlistedMovies.Count()); int lPageSize = AppSettings.BatchSize; int lPages = (int)Math.Ceiling((double)lWatchlistedMovies.Count / lPageSize); for (int i = 0; i < lPages; i++) { UIUtils.UpdateStatus($"Importing page {0}/{1} IMDb watchlist movies...", i + 1, lPages); var lWatchlistedToSync = new TraktMovieSync() { Movies = lWatchlistedMovies.Skip(i * lPageSize).Take(lPageSize).ToList() }; var lResponse = TraktAPI.AddMoviesToWatchlist(lWatchlistedToSync); if (lResponse == null) { UIUtils.UpdateStatus("Failed to send watchlist for IMDb movies", true); Thread.Sleep(2000); } else if (lResponse.NotFound.Movies.Count > 0) { UIUtils.UpdateStatus($"Unable to sync watchlist for {0} movies as they're not found on trakt.tv!", lResponse.NotFound.Movies.Count); Thread.Sleep(1000); } if (importCancelled) { return; } } } if (importCancelled) { return; } #endregion #region TV Shows IEnumerable <TraktShowPlays> lWatchedTraktShows = null; var lWatchlistedShows = lWatchlistItems.Where(r => r.Type.ItemType() == IMDbType.Show) .Select(s => s.ToTraktShow()).ToList(); if (lWatchlistedShows.Any()) { UIUtils.UpdateStatus("Requesting existing watchlisted shows from trakt..."); var lWatchlistTraktShows = TraktAPI.GetWatchlistShows(); if (lWatchlistTraktShows != null) { UIUtils.UpdateStatus($"Found {0} watchlist shows on trakt", lWatchlistTraktShows.Count()); UIUtils.UpdateStatus("Filtering out watchlist shows that are already in watchlist on trakt.tv"); lWatchlistedShows.RemoveAll(w => lWatchlistTraktShows.FirstOrDefault(t => t.Show.Ids.ImdbId == w.Ids.ImdbId || (t.Show.Title.ToLowerInvariant() == w.Title.ToLowerInvariant() && t.Show.Year == w.Year)) != null); } if (AppSettings.IgnoreWatchedForWatchlist && lWatchlistedShows.Count > 0) { UIUtils.UpdateStatus("Requesting watched shows from trakt..."); // get watched movies from trakt so we don't import shows into watchlist that are already watched lWatchedTraktShows = TraktAPI.GetWatchedShows(); if (lWatchedTraktShows != null) { UIUtils.UpdateStatus($"Found {0} watched shows on trakt", lWatchedTraktShows.Count()); UIUtils.UpdateStatus("Filtering out watchlist shows containing watched episodes on trakt.tv."); // remove shows from sync list which are watched already lWatchlistedShows.RemoveAll(w => lWatchedTraktShows.FirstOrDefault(t => (t.Show.Ids.ImdbId == w.Ids.ImdbId) || (t.Show.Title.ToLowerInvariant() == w.Title.ToLowerInvariant() && t.Show.Year == w.Year)) != null); } } // add shows to watchlist UIUtils.UpdateStatus($"Importing {0} IMDb watchlist shows to trakt.tv...", lWatchlistedShows.Count()); int lPageSize = AppSettings.BatchSize; int lPages = (int)Math.Ceiling((double)lWatchlistedShows.Count / lPageSize); for (int i = 0; i < lPages; i++) { UIUtils.UpdateStatus($"Importing page {0}/{1} IMDb watchlist shows...", i + 1, lPages); var lWatchlistShowsToSync = new TraktShowSync { Shows = lWatchlistedShows.Skip(i * lPageSize).Take(lPageSize).ToList() }; var lResponse = TraktAPI.AddShowsToWatchlist(lWatchlistShowsToSync); if (lResponse == null) { UIUtils.UpdateStatus("Failed to send watchlist for IMDb tv shows", true); Thread.Sleep(2000); } else if (lResponse.NotFound.Shows.Count > 0) { UIUtils.UpdateStatus($"Unable to sync watchlist for {0} shows as they're not found on trakt.tv!", lResponse.NotFound.Shows.Count); Thread.Sleep(1000); } if (importCancelled) { return; } } } if (importCancelled) { return; } #endregion #region Episodes var lImdbEpisodes = new List <IMDbEpisode>(); var lImdbWatchlistedEpisodes = lWatchlistItems.Where(r => r.Type.ItemType() == IMDbType.Episode).ToList(); if (lImdbWatchlistedEpisodes.Any()) { UIUtils.UpdateStatus($"Found {0} IMDb watchlisted episodes", lImdbWatchlistedEpisodes.Count()); lImdbEpisodes.AddRange(lImdbWatchlistedEpisodes.Select(Helper.GetIMDbEpisodeFromTrakt).Where(imdbEpisode => imdbEpisode != null)); if (importCancelled) { return; } // filter out existing watchlist episodes UIUtils.UpdateStatus("Requesting existing watchlist episodes from trakt..."); var lWatchlistedTraktEpisodes = TraktAPI.GetWatchlistEpisodes(); if (lWatchlistedTraktEpisodes != null) { UIUtils.UpdateStatus($"Found {0} watchlist episodes on trakt", lWatchlistedTraktEpisodes.Count()); UIUtils.UpdateStatus("Filtering out watchlist episodes that are already in watchlist on trakt.tv"); lImdbEpisodes.RemoveAll(e => lWatchlistedTraktEpisodes.FirstOrDefault(w => w.Episode.Ids.Trakt == e.TraktId) != null); } if (AppSettings.IgnoreWatchedForWatchlist && lImdbEpisodes.Count > 0) { // we already might have it from the shows sync if (lWatchedTraktShows == null) { UIUtils.UpdateStatus("Requesting watched episodes from trakt..."); // get watched episodes from trakt so we don't import episodes into watchlist that are already watched lWatchedTraktShows = TraktAPI.GetWatchedShows(); } if (lWatchedTraktShows != null) { UIUtils.UpdateStatus("Filtering out watchlist episodes containing watched episodes on trakt.tv"); // this wont work atm due to show IMDb ID not being set in the IMDbEpisode object lImdbEpisodes.RemoveAll(e => lWatchedTraktShows.Where(s => s.Show.Ids.ImdbId == e.ShowImdbId) .Any(s => s.Seasons.Exists(se => se.Number == e.SeasonNumber && se.Episodes.Exists(ep => ep.Number == e.EpisodeNumber)))); } } UIUtils.UpdateStatus($"Importing {0} episodes in watchlist to trakt.tv", lImdbEpisodes.Count()); if (lImdbEpisodes.Count > 0) { int lPageSize = AppSettings.BatchSize; int lPages = (int)Math.Ceiling((double)lImdbEpisodes.Count / lPageSize); for (int i = 0; i < lPages; i++) { UIUtils.UpdateStatus($"Importing page {0}/{1} IMDb watchlisted episodes...", i + 1, lPages); var lResponse = TraktAPI.AddEpisodesToWatchlist(Helper.GetTraktEpisodeData(lImdbEpisodes.Skip(i * lPageSize).Take(lPageSize))); if (lResponse == null) { UIUtils.UpdateStatus("Error importing IMDb episode watchlist to trakt.tv", true); Thread.Sleep(2000); } else if (lResponse.NotFound.Episodes.Count > 0) { UIUtils.UpdateStatus("Unable to sync watchlist for {0} IMDb episodes as they're not found on trakt.tv!", lResponse.NotFound.Episodes.Count); Thread.Sleep(1000); } if (importCancelled) { return; } } } } #endregion } #endregion }
/// <summary> /// Sends movie sync data to Trakt /// </summary> /// <param name="syncData">The sync data to send</param> /// <param name="mode">The sync mode to use</param> /// <returns>The response from trakt</returns> public static TraktSyncResponse SyncMovieLibrary(TraktMovieSync syncData, TraktSyncModes mode) { // check that we have everything we need // server can accept title/year if imdb id is not supplied if (syncData == null || syncData.MovieList.Count == 0) { TraktSyncResponse error = new TraktSyncResponse { Error = "Not enough information to send to server", Status = "failure" }; return error; } // serialize Scrobble object to JSON and send to server string response = Transmit(string.Format(TraktURIs.SyncMovieLibrary, mode), syncData.ToJSON()); // return success or failure return response.FromJSON<TraktSyncResponse>(); }
private TraktMovieSync CreateMovieSyncData(TraktMovie movie) { if (movie == null) return null; TraktMovieSync.Movie syncMovie = new TraktMovieSync.Movie { IMDBID = movie.Imdb, Title = movie.Title, Year = movie.Year }; TraktMovieSync syncData = new TraktMovieSync { UserName = TraktSettings.Username, Password = TraktSettings.Password, MovieList = new List<TraktMovieSync.Movie> { syncMovie } }; return syncData; }