diff --git a/Trakt/ScheduledTasks/SyncFromTraktTask.cs b/Trakt/ScheduledTasks/SyncFromTraktTask.cs index a80992c..b1854af 100644 --- a/Trakt/ScheduledTasks/SyncFromTraktTask.cs +++ b/Trakt/ScheduledTasks/SyncFromTraktTask.cs @@ -1,30 +1,30 @@ -using System.Globalization; -using MediaBrowser.Common.IO; -using MediaBrowser.Common.Net; -using MediaBrowser.Common.ScheduledTasks; -using MediaBrowser.Controller; -using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.Entities.Movies; -using MediaBrowser.Controller.Entities.TV; -using MediaBrowser.Controller.Library; -using MediaBrowser.Model.Entities; -using MediaBrowser.Model.Logging; -using MediaBrowser.Model.Serialization; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using CommonIO; -using Trakt.Api; -using Trakt.Api.DataContracts.BaseModel; -using Trakt.Api.DataContracts.Users.Collection; -using Trakt.Api.DataContracts.Users.Watched; -using Trakt.Helpers; -using Trakt.Model; - -namespace Trakt.ScheduledTasks +namespace Trakt.ScheduledTasks { + using System; + using System.Collections.Generic; + using System.Globalization; + using System.Linq; + using System.Threading; + using System.Threading.Tasks; + + using CommonIO; + + using MediaBrowser.Common.Net; + using MediaBrowser.Common.ScheduledTasks; + using MediaBrowser.Controller; + using MediaBrowser.Controller.Entities; + using MediaBrowser.Controller.Entities.Movies; + using MediaBrowser.Controller.Entities.TV; + using MediaBrowser.Controller.Library; + using MediaBrowser.Model.Entities; + using MediaBrowser.Model.Logging; + using MediaBrowser.Model.Serialization; + + using Trakt.Api; + using Trakt.Api.DataContracts.BaseModel; + using Trakt.Api.DataContracts.Users.Collection; + using Trakt.Api.DataContracts.Users.Watched; + using Trakt.Helpers; /// /// Task that will Sync each users trakt.tv profile with their local library. This task will only include @@ -120,24 +120,24 @@ namespace Trakt.ScheduledTasks throw; } - _logger.Info("Trakt.tv watched Movies count = " + traktWatchedMovies.Count()); _logger.Info("Trakt.tv watched Shows count = " + traktWatchedShows.Count()); + var mediaItems = + _libraryManager.GetItemList( + new InternalItemsQuery + { + IncludeItemTypes = new[] { typeof(Movie).Name, typeof(Episode).Name }, + ExcludeLocationTypes = new[] { LocationType.Virtual } + }) + .Where(i => _traktApi.CanSync(i, traktUser)) + .OrderBy( + i => + { + var episode = i as Episode; - var mediaItems = _libraryManager.GetItemList(new InternalItemsQuery - { - IncludeItemTypes = new[] { typeof(Movie).Name, typeof(Episode).Name }, - ExcludeLocationTypes = new[] { LocationType.Virtual } - }) - .Where(i => _traktApi.CanSync(i, traktUser)) - .OrderBy(i => - { - var episode = i as Episode; - - return episode != null ? episode.Series.Id : i.Id; - }) - .ToList(); + return episode != null ? episode.Series.Id : i.Id; + }).ToList(); // purely for progress reporting var percentPerItem = percentPerUser / mediaItems.Count; @@ -164,6 +164,7 @@ namespace Trakt.ScheduledTasks // keep the highest play count int playcount = Math.Max(matchedMovie.Plays, userData.PlayCount); + // set movie playcount if (userData.PlayCount != playcount) { @@ -175,9 +176,7 @@ namespace Trakt.ScheduledTasks if (!string.IsNullOrEmpty(matchedMovie.LastWatchedAt)) { var tLastPlayed = DateTime.Parse(matchedMovie.LastWatchedAt); - var latestPlayed = tLastPlayed > userData.LastPlayedDate - ? tLastPlayed - : userData.LastPlayedDate; + var latestPlayed = tLastPlayed > userData.LastPlayedDate ? tLastPlayed : userData.LastPlayedDate; if (userData.LastPlayedDate != latestPlayed) { userData.LastPlayedDate = latestPlayed; @@ -189,7 +188,11 @@ namespace Trakt.ScheduledTasks if (changed) { await - _userDataManager.SaveUserData(user.Id, movie, userData, UserDataSaveReason.Import, + _userDataManager.SaveUserData( + user.Id, + movie, + userData, + UserDataSaveReason.Import, cancellationToken); } } @@ -210,8 +213,13 @@ namespace Trakt.ScheduledTasks if (matchedShow != null) { - var matchedSeason = matchedShow.Seasons - .FirstOrDefault(tSeason => tSeason.Number == (episode.ParentIndexNumber == 0 ? 0 : ((episode.ParentIndexNumber ?? 1) + (episode.Series.AnimeSeriesIndex ?? 1) - 1))); + var matchedSeason = + matchedShow.Seasons.FirstOrDefault( + tSeason => + tSeason.Number + == (episode.ParentIndexNumber == 0 + ? 0 + : ((episode.ParentIndexNumber ?? 1) + (episode.Series.AnimeSeriesIndex ?? 1) - 1))); // if it's not a match then it means trakt doesn't know about the season, leave the watched state alone and move on if (matchedSeason != null) @@ -220,7 +228,8 @@ namespace Trakt.ScheduledTasks var userData = _userDataManager.GetUserData(user.Id, episode); bool changed = false; - var matchedEpisode = matchedSeason.Episodes.FirstOrDefault(x => x.Number == (episode.IndexNumber ?? -1)); + var matchedEpisode = + matchedSeason.Episodes.FirstOrDefault(x => x.Number == (episode.IndexNumber ?? -1)); if (matchedEpisode != null) { @@ -236,6 +245,7 @@ namespace Trakt.ScheduledTasks // keep the highest play count int playcount = Math.Max(matchedEpisode.Plays, userData.PlayCount); + // set episode playcount if (userData.PlayCount != playcount) { @@ -255,7 +265,11 @@ namespace Trakt.ScheduledTasks if (changed) { await - _userDataManager.SaveUserData(user.Id, episode, userData, UserDataSaveReason.Import, + _userDataManager.SaveUserData( + user.Id, + episode, + userData, + UserDataSaveReason.Import, cancellationToken); } } @@ -273,17 +287,18 @@ namespace Trakt.ScheduledTasks currentProgress += percentPerItem; progress.Report(currentProgress); } - //_logger.Info(syncItemFailures + " items not parsed"); + + // _logger.Info(syncItemFailures + " items not parsed"); } private string GetVerboseEpisodeData(Episode episode) { - string episodeString = ""; + string episodeString = string.Empty; episodeString += "Episode: " + (episode.ParentIndexNumber != null ? episode.ParentIndexNumber.ToString() : "null"); episodeString += "x" + (episode.IndexNumber != null ? episode.IndexNumber.ToString() : "null"); episodeString += " '" + episode.Name + "' "; episodeString += "Series: '" + (episode.Series != null - ? !String.IsNullOrWhiteSpace(episode.Series.Name) + ? !string.IsNullOrWhiteSpace(episode.Series.Name) ? episode.Series.Name : "null property" : "null class"); diff --git a/Trakt/ScheduledTasks/SyncLibraryTask.cs b/Trakt/ScheduledTasks/SyncLibraryTask.cs index 978bfbb..1c7912d 100644 --- a/Trakt/ScheduledTasks/SyncLibraryTask.cs +++ b/Trakt/ScheduledTasks/SyncLibraryTask.cs @@ -388,6 +388,51 @@ progress.Report(progPercent); } + await SendEpisodeCollectionUpdates(true, traktUser, collectedEpisodes, progress, progPercent, percentPerItem, cancellationToken); + + await SendEpisodePlaystateUpdates(true, traktUser, playedEpisodes, progress, progPercent, percentPerItem, cancellationToken); + + await SendEpisodePlaystateUpdates(false, traktUser, unplayedEpisodes, progress, progPercent, percentPerItem, cancellationToken); + } + + private async Task SendEpisodePlaystateUpdates( + bool seen, + TraktUser traktUser, + List playedEpisodes, + IProgress progress, + double progPercent, + double percentPerItem, + CancellationToken cancellationToken) + { + _logger.Info("Episodes to set " + (seen ? string.Empty : "un") + "watched: " + playedEpisodes.Count); + if (playedEpisodes.Count > 0) + { + try + { + var dataContracts = + await _traktApi.SendEpisodePlaystateUpdates(playedEpisodes, traktUser, seen, cancellationToken); + dataContracts?.ForEach(LogTraktResponseDataContract); + } + catch (Exception e) + { + _logger.ErrorException("Error updating episode play states", e); + } + + // purely for progress reporting + progPercent += percentPerItem * playedEpisodes.Count; + progress.Report(progPercent); + } + } + + private async Task SendEpisodeCollectionUpdates( + bool collected, + TraktUser traktUser, + List collectedEpisodes, + IProgress progress, + double progPercent, + double percentPerItem, + CancellationToken cancellationToken) + { _logger.Info("Episodes to add to Collection: " + collectedEpisodes.Count); if (collectedEpisodes.Count > 0) { @@ -395,7 +440,7 @@ { var dataContracts = await - _traktApi.SendLibraryUpdateAsync(collectedEpisodes, traktUser, cancellationToken, EventType.Add) + _traktApi.SendLibraryUpdateAsync(collectedEpisodes, traktUser, cancellationToken, collected ? EventType.Add : EventType.Remove) .ConfigureAwait(false); if (dataContracts != null) { @@ -418,47 +463,8 @@ progPercent += percentPerItem * collectedEpisodes.Count; progress.Report(progPercent); } - - _logger.Info("Episodes to set watched: " + playedEpisodes.Count); - if (playedEpisodes.Count > 0) - { - try - { - var dataContracts = - await _traktApi.SendEpisodePlaystateUpdates(playedEpisodes, traktUser, true, cancellationToken); - dataContracts?.ForEach(LogTraktResponseDataContract); - } - catch (Exception e) - { - _logger.ErrorException("Error updating episode play states", e); - } - - // purely for progress reporting - progPercent += percentPerItem * playedEpisodes.Count; - progress.Report(progPercent); - } - - _logger.Info("Episodes to set unwatched: " + unplayedEpisodes.Count); - if (unplayedEpisodes.Count > 0) - { - try - { - var dataContracts = - await - _traktApi.SendEpisodePlaystateUpdates(unplayedEpisodes, traktUser, false, cancellationToken); - dataContracts?.ForEach(LogTraktResponseDataContract); - } - catch (Exception e) - { - _logger.ErrorException("Error updating episode play states", e); - } - - // purely for progress reporting - progPercent += percentPerItem * unplayedEpisodes.Count; - progress.Report(progPercent); - } } - + public string Name => "Sync library to trakt.tv"; public string Category => "Trakt";