/// <summary> /// Shows the Rate Dialog after playback has ended /// </summary> /// <param name="episode">The item being rated</param> internal static void ShowRateDialog(VideoInfo videoInfo) { if (!TraktSettings.ShowRateDialogOnWatched) return; // not enabled TraktLogger.Debug("Showing rate dialog for '{0}'", videoInfo.Title); var rateThread = new System.Threading.Thread((o) => { var itemToRate = o as VideoInfo; if (itemToRate == null) return; int rating = 0; if (itemToRate.Type == VideoType.Series) { var rateObject = new TraktSyncShowRatedEx { Title = itemToRate.Title, Year = itemToRate.Year.ToNullableInt32(), Seasons = new List<TraktSyncShowRatedEx.Season> { new TraktSyncShowRatedEx.Season { Number = itemToRate.SeasonIdx.ToInt(), Episodes = new List<TraktSyncShowRatedEx.Season.Episode> { new TraktSyncShowRatedEx.Season.Episode { Number = itemToRate.EpisodeIdx.ToInt(), RatedAt = DateTime.UtcNow.ToISO8601() } } } } }; // get the rating submitted to trakt rating = GUIUtils.ShowRateDialog<TraktSyncShowRatedEx>(rateObject); // add episode rated to cache if (rating > 0) { TraktCache.AddEpisodeToRatings( new TraktShow { Ids = new TraktShowId(), Title = rateObject.Title, Year = rateObject.Year, }, new TraktEpisode { Ids = new TraktEpisodeId(), Season = rateObject.Seasons[0].Number, Number = rateObject.Seasons[0].Episodes[0].Number }, rating ); } } else if (itemToRate.Type == VideoType.Movie) { var rateObject = new TraktSyncMovieRated { Ids = new TraktMovieId(), Title = itemToRate.Title, Year = itemToRate.Year.ToNullableInt32(), RatedAt = DateTime.UtcNow.ToISO8601() }; // get the rating submitted to trakt rating = GUIUtils.ShowRateDialog<TraktSyncMovieRated>(rateObject); // add movie rated to cache if (rating > 0) { TraktCache.AddMovieToRatings(rateObject, rating); } else { TraktCache.RemoveMovieFromRatings(rateObject); } } if (rating > 0) { TraktLogger.Debug("Rating {0} as {1}/10", itemToRate.Title, rating.ToString()); } }) { Name = "Rate", IsBackground = true }; rateThread.Start(videoInfo); }
public static bool ShowTraktExtEpisodeMenu(string title, string year, string season, string episode, string tvdbid, string imdbid, string episodetvdbid, bool isWatched, string fanart, SearchPeople people, bool showAll) { var dlg = (IDialogbox)GUIWindowManager.GetWindow((int)GUIWindow.Window.WINDOW_DIALOG_MENU); dlg.Reset(); dlg.SetHeading(GUIUtils.PluginName()); var pItem = new GUIListItem(Translation.Comments); dlg.Add(pItem); pItem.ItemId = (int)TraktMenuItems.Shouts; pItem = new GUIListItem(Translation.Rate); dlg.Add(pItem); pItem.ItemId = (int)TraktMenuItems.Rate; pItem = new GUIListItem(Translation.AddToWatchList); dlg.Add(pItem); pItem.ItemId = (int)TraktMenuItems.AddToWatchList; pItem = new GUIListItem(Translation.AddToList); dlg.Add(pItem); pItem.ItemId = (int)TraktMenuItems.AddToCustomList; // Show Search By menu... if (people != null && people.Count != 0) { pItem = new GUIListItem(Translation.SearchBy + "..."); dlg.Add(pItem); pItem.ItemId = (int)TraktMenuItems.SearchBy; } // also show non-context sensitive items related to episodes if (showAll) { // might want to check your recently watched, stats etc pItem = new GUIListItem(Translation.UserProfile); dlg.Add(pItem); pItem.ItemId = (int)TraktMenuItems.UserProfile; pItem = new GUIListItem(Translation.Network); dlg.Add(pItem); pItem.ItemId = (int)TraktMenuItems.Network; pItem = new GUIListItem(Translation.Calendar); dlg.Add(pItem); pItem.ItemId = (int)TraktMenuItems.Calendar; pItem = new GUIListItem(Translation.WatchList); dlg.Add(pItem); pItem.ItemId = (int)TraktMenuItems.WatchList; pItem = new GUIListItem(Translation.Lists); dlg.Add(pItem); pItem.ItemId = (int)TraktMenuItems.Lists; } // Show Context Menu dlg.DoModal(GUIWindowManager.ActiveWindow); if (dlg.SelectedId < 0) return false; switch (dlg.SelectedId) { case ((int)TraktMenuItems.Rate): TraktLogger.Info("Displaying rate dialog for tv episode. Title = '{0}', Year = '{1}', Season = '{2}', Episode = '{3}', Show ID = '{4}', Episode ID = '{5}'", title, year.ToLogString(), season, episode, tvdbid.ToLogString(), episodetvdbid.ToLogString()); var show = new TraktSyncShowRatedEx { Ids = new TraktShowId { Tvdb = tvdbid.ToNullableInt32(), Imdb = imdbid.ToNullIfEmpty() }, Title = title, Year = year.ToNullableInt32(), Seasons = new List<TraktSyncShowRatedEx.Season> { new TraktSyncShowRatedEx.Season { Number = season.ToInt(), Episodes = new List<TraktSyncShowRatedEx.Season.Episode> { new TraktSyncShowRatedEx.Season.Episode { Number = episode.ToInt(), RatedAt = DateTime.UtcNow.ToISO8601() } } } } }; int rating = GUIUtils.ShowRateDialog<TraktSyncShowRatedEx>(show); // update local databases if (rating >= 0) { switch (GUIWindowManager.ActiveWindow) { case (int)ExternalPluginWindows.TVSeries: TraktHandlers.TVSeries.SetEpisodeUserRating(rating); break; } } break; case ((int)TraktMenuItems.Shouts): TraktLogger.Info("Displaying Shouts for tv episode. Title = '{0}', Year = '{1}', Season = '{2}', Episode = '{3}'", title, year.ToLogString(), season, episode); TraktHelper.ShowEpisodeShouts(title, year.ToNullableInt32(), tvdbid.ToNullableInt32(), null, imdbid.ToNullIfEmpty(), season.ToInt(), episode.ToInt(), isWatched, fanart); break; case ((int)TraktMenuItems.AddToWatchList): TraktLogger.Info("Adding tv episode to Watchlist. Title = '{0}', Year = '{1}', Season = '{2}', Episode = '{3}'", title, year.ToLogString(), season, episode); TraktHelper.AddEpisodeToWatchList(title, season.ToInt(), episode.ToInt(), tvdbid.ToNullableInt32(), null, null, null); break; case ((int)TraktMenuItems.AddToCustomList): TraktLogger.Info("Adding tv episode to Custom List. Title = '{0}', Year = '{1}', Season = '{2}', Episode = '{3}', Episode ID = '{4}'", title, year.ToLogString(), season, episode, episodetvdbid.ToLogString()); if (string.IsNullOrEmpty(episodetvdbid)) { TraktHelper.AddRemoveEpisodeInUserList(new TraktEpisode { Ids = new TraktEpisodeId { Tvdb = episodetvdbid.ToNullableInt32() } }, false); } break; case ((int)TraktMenuItems.SearchBy): ShowSearchByMenu(people, title, fanart); break; case ((int)TraktMenuItems.UserProfile): GUIWindowManager.ActivateWindow((int)TraktGUIWindows.UserProfile); break; case ((int)TraktMenuItems.Calendar): GUIWindowManager.ActivateWindow((int)TraktGUIWindows.Calendar); break; case ((int)TraktMenuItems.Network): GUIWindowManager.ActivateWindow((int)TraktGUIWindows.Network); break; case ((int)TraktMenuItems.WatchList): GUIWindowManager.ActivateWindow((int)TraktGUIWindows.WatchedListEpisodes); break; case ((int)TraktMenuItems.Lists): GUIWindowManager.ActivateWindow((int)TraktGUIWindows.CustomLists); break; } return true; }
/// <summary> /// Shows the Rate Dialog after playback has ended /// </summary> /// <param name="episode">The item being rated</param> private void ShowRateDialog(ITrackingInfo videoInfo) { if (!TraktSettings.ShowRateDialogOnWatched) return; var rateThread = new Thread((objInfo) => { var itemToRate = objInfo as ITrackingInfo; if (itemToRate == null) return; int rating = -1; if (itemToRate.VideoKind == VideoKind.TvSeries) { TraktLogger.Info("Showing rate dialog for episode. Title = '{0}', Year = '{1}', IMDb ID = '{2}', TMDb ID = '{3}', Season = '{4}', Episode = '{5}'", itemToRate.Title, itemToRate.Year == 0 ? "<empty>" : itemToRate.Year.ToString(), itemToRate.ID_IMDB.ToLogString(), itemToRate.ID_TMDB.ToLogString(), itemToRate.Episode, itemToRate.Season); // this gets complicated when the episode IDs are not available! var rateObject = new TraktSyncShowRatedEx { Ids = new TraktShowId { Tvdb = itemToRate.ID_TVDB.ToNullableInt32(), Tmdb = itemToRate.ID_TMDB.ToNullableInt32() }, Title = itemToRate.Title, Year = itemToRate.Year > 0 ? (int?)itemToRate.Year : null, Seasons = new List<TraktSyncShowRatedEx.Season> { new TraktSyncShowRatedEx.Season { Number = (int)itemToRate.Season, Episodes = new List<TraktSyncShowRatedEx.Season.Episode> { new TraktSyncShowRatedEx.Season.Episode { Number = (int)itemToRate.Episode, RatedAt = DateTime.UtcNow.ToISO8601() } } } } }; // get the rating submitted to trakt rating = GUIUtils.ShowRateDialog<TraktSyncShowRatedEx>(rateObject); // add episode rated to cache if (rating > 0) { TraktCache.AddEpisodeToRatings( new TraktShow { Ids = rateObject.Ids, Title = rateObject.Title, Year = rateObject.Year, }, new TraktEpisode { Ids = new TraktEpisodeId(), Season = rateObject.Seasons[0].Number, Number = rateObject.Seasons[0].Episodes[0].Number }, rating ); } } else if (itemToRate.VideoKind == VideoKind.Movie) { TraktLogger.Info("Showing rate dialog for movie. Title = '{0}', Year = '{1}', IMDb Id = '{2}', TMDb ID = '{3}'", itemToRate.Title, itemToRate.Year, itemToRate.ID_IMDB.ToLogString(), itemToRate.ID_TMDB.ToLogString()); var rateObject = new TraktSyncMovieRated { Ids = new TraktMovieId { Imdb = itemToRate.ID_IMDB, Tmdb = itemToRate.ID_TMDB.ToNullableInt32() }, Title = itemToRate.Title, Year = (int)itemToRate.Year, RatedAt = DateTime.UtcNow.ToISO8601() }; // get the rating submitted to trakt rating = GUIUtils.ShowRateDialog<TraktSyncMovieRated>(rateObject); // add movie rated to cache if (rating > 0) { TraktCache.AddMovieToRatings(rateObject, rating); } else { TraktCache.RemoveMovieFromRatings(rateObject); } } }) { Name = "Rate", IsBackground = true }; rateThread.Start(videoInfo); }
/// <summary> /// Shows the Rate Episode Dialog after playback has ended /// </summary> /// <param name="episode">The episode being rated</param> private void ShowRateDialog(DBEpisode episode, bool isPlaylist) { if (DBOption.GetOptions(DBOption.cAskToRate)) return; // tvseries dialog is enabled if (!TraktSettings.ShowRateDialogOnWatched) return; // not enabled if (episode[DBOnlineEpisode.cMyRating] > 0) return; // already rated if (isPlaylist && !TraktSettings.ShowRateDlgForPlaylists) return; // disabled for playlists TraktLogger.Debug("Showing rate dialog for episode. Title = '{0}'", episode.ToString()); var rateThread = new Thread((o) => { var epToRate = o as DBEpisode; if (epToRate == null) return; var show = Helper.getCorrespondingSeries(epToRate[DBOnlineEpisode.cSeriesID]); if (show == null || show[DBOnlineSeries.cTraktIgnore]) return; var episodeRateData = new TraktSyncShowRatedEx { Title = show[DBOnlineSeries.cOriginalName], Year = show.Year.ToNullableInt32(), Ids = new TraktShowId { Tvdb = show[DBSeries.cID], Imdb = BasicHandler.GetProperImdbId(show[DBOnlineSeries.cIMDBID]) }, Seasons = new List<TraktSyncShowRatedEx.Season> { new TraktSyncShowRatedEx.Season { Number = episode[DBOnlineEpisode.cSeasonIndex], Episodes = new List<TraktSyncShowRatedEx.Season.Episode> { new TraktSyncShowRatedEx.Season.Episode { Number = episode[DBOnlineEpisode.cEpisodeIndex], Rating = episode[DBOnlineEpisode.cMyRating], RatedAt = DateTime.UtcNow.ToISO8601() } } } } }; // get the rating submitted to trakt int rating = GUIUtils.ShowRateDialog<TraktSyncShowRatedEx>(episodeRateData); if (rating > 0) { TraktLogger.Debug("Rating {0} as {1}/10", epToRate.ToString(), rating.ToString()); // update local cache TraktCache.AddEpisodeToRatings ( new TraktShow { Ids = new TraktShowId { Tvdb = show[DBSeries.cID], Imdb = BasicHandler.GetProperImdbId(show[DBOnlineSeries.cIMDBID]) }, Title = show[DBOnlineSeries.cPrettyName], Year = show.Year.ToNullableInt32(), }, new TraktEpisode { Ids = new TraktEpisodeId { Tvdb = episode[DBOnlineEpisode.cID], Imdb = episode[DBOnlineEpisode.cIMDBID].ToString().ToNullIfEmpty() }, Number = episode[DBOnlineEpisode.cEpisodeIndex], Season = episode[DBOnlineEpisode.cSeasonIndex], Title = episode[DBOnlineEpisode.cEpisodeName] }, rating ); epToRate[DBOnlineEpisode.cMyRating] = rating; if (epToRate[DBOnlineEpisode.cRatingCount] == 0) { // not really needed but nice touch // tvseries does not do this automatically on userrating insert // we could do one step further and re-calculate rating for any vote count epToRate[DBOnlineEpisode.cRatingCount] = 1; epToRate[DBOnlineEpisode.cRating] = rating; } // ensure we force watched flag otherwise // we will overwrite current state on facade with state before playback epToRate[DBOnlineEpisode.cWatched] = true; epToRate.Commit(); // update the facade holding the episode objects var listItem = FindEpisodeInFacade(episode); if (listItem != null) { listItem.TVTag = epToRate; } } else if(rating == 0) { TraktCache.RemoveEpisodeFromRatings ( new TraktEpisode { Ids = new TraktEpisodeId { Tvdb = episode[DBOnlineEpisode.cID], Imdb = episode[DBOnlineEpisode.cIMDBID].ToString().ToNullIfEmpty() } } ); } }) { Name = "Rate", IsBackground = true }; rateThread.Start(episode); }
internal static bool RateEpisode(TraktShowSummary show, TraktEpisodeSummary episode) { // this object will work without episode ids var rateObjectEx = new TraktSyncShowRatedEx { Ids = show.Ids, Title = show.Title, Year = show.Year, Seasons = new List<TraktSyncShowRatedEx.Season> { new TraktSyncShowRatedEx.Season { Number = episode.Season, Episodes = new List<TraktSyncShowRatedEx.Season.Episode> { new TraktSyncShowRatedEx.Season.Episode { Number = episode.Number, RatedAt = DateTime.UtcNow.ToISO8601() } } } } }; // only use if we have episode ids var rateObject = new TraktSyncEpisodeRated { Ids = new TraktEpisodeId { Trakt = episode.Ids.Trakt, Imdb = episode.Ids.Imdb.ToNullIfEmpty(), Tmdb = episode.Ids.Tmdb, Tvdb = episode.Ids.Tvdb, TvRage = episode.Ids.TvRage }, Title = episode.Title, Season = episode.Season, Number = episode.Number, RatedAt = DateTime.UtcNow.ToISO8601() }; int? prevRating = episode.UserRating(show); int newRating = 0; if (episode.Ids == null || episode.Ids.Trakt == null) { newRating = GUIUtils.ShowRateDialog<TraktSyncShowRatedEx>(rateObjectEx); } else { newRating = GUIUtils.ShowRateDialog<TraktSyncEpisodeRated>(rateObject); } if (newRating == -1) return false; // If previous rating not equal to current rating then // update skin properties to reflect changes if (prevRating == newRating) return false; if (prevRating == null || prevRating == 0) { // add to ratings TraktCache.AddEpisodeToRatings(show, episode, newRating); episode.Votes++; } else if (newRating == 0) { // remove from ratings TraktCache.RemoveEpisodeFromRatings(episode); episode.Votes--; } else { // rating changed, remove then add TraktCache.RemoveEpisodeFromRatings(episode); TraktCache.AddEpisodeToRatings(show, episode, newRating); } // update ratings until next online update // if we have the ratings distribution we could calculate correctly if (episode.Votes == 0) { episode.Rating = 0; } else if (episode.Votes == 1 && newRating > 0) { episode.Rating = newRating; } return true; }
private void RateEpisode(DBEpisode episode) { var rateThread = new Thread((objEpisode) => { var rateEpisode = objEpisode as DBEpisode; if (rateEpisode == null) return; var show = Helper.getCorrespondingSeries(rateEpisode[DBOnlineEpisode.cSeriesID]); if (show == null || show[DBOnlineSeries.cTraktIgnore]) return; TraktLogger.Info("Received a Rate Episode event from tvseries. Show Title = '{0}', Show Year = '{1}', Season = '{2}', Episode = '{3}', Episode Title = '{4}', Show TVDb ID = '{5}', Episode TVDb ID = '{6}'", show[DBOnlineSeries.cOriginalName], show.Year ?? "<empty>", episode[DBOnlineEpisode.cSeasonIndex], episode[DBOnlineEpisode.cEpisodeIndex], episode[DBOnlineEpisode.cEpisodeName], episode[DBOnlineEpisode.cSeriesID], episode[DBOnlineEpisode.cID]); // send show data as well in case tvdb ids are not available on trakt server // TraktSyncEpisodeRated object is good if we could trust trakt having the tvdb ids. // trakt is more likely to have a show tvdb id than a episode tvdb id var episodeRateData = new TraktSyncShowRatedEx { Title = show[DBOnlineSeries.cOriginalName], Year = show.Year.ToNullableInt32(), Ids = new TraktShowId { Tvdb = show[DBSeries.cID], Imdb = BasicHandler.GetProperImdbId(show[DBOnlineSeries.cIMDBID]) }, Seasons = new List<TraktSyncShowRatedEx.Season> { new TraktSyncShowRatedEx.Season { Number = episode[DBOnlineEpisode.cSeasonIndex], Episodes = new List<TraktSyncShowRatedEx.Season.Episode> { new TraktSyncShowRatedEx.Season.Episode { Number = episode[DBOnlineEpisode.cEpisodeIndex], Rating = episode[DBOnlineEpisode.cMyRating], RatedAt = DateTime.UtcNow.ToISO8601() } } } } }; // update local cache TraktCache.AddEpisodeToRatings ( new TraktShow { Title = show[DBOnlineSeries.cPrettyName], Year = show.Year.ToNullableInt32(), Ids = new TraktShowId { Tvdb = show[DBSeries.cID], Imdb = BasicHandler.GetProperImdbId(show[DBOnlineSeries.cIMDBID]) } }, new TraktEpisode { Ids = new TraktEpisodeId { Tvdb = episode[DBOnlineEpisode.cID], Imdb = episode[DBOnlineEpisode.cIMDBID].ToString().ToNullIfEmpty() }, Number = episode[DBOnlineEpisode.cEpisodeIndex], Season = episode[DBOnlineEpisode.cSeasonIndex], Title = episode[DBOnlineEpisode.cEpisodeName] }, episode[DBOnlineEpisode.cMyRating] ); var response = TraktAPI.TraktAPI.AddEpisodeToRatingsEx(episodeRateData); TraktLogger.LogTraktResponse(response); }) { IsBackground = true, Name = "Rate" }; rateThread.Start(episode); }
/// <summary> /// Returns a list of shows for rating sync as show objects with season / episode hierarchy /// </summary> private TraktSyncShowsRatedEx GetRatedEpisodesForSyncEx(List<DBEpisode> localRatedEpisodes, List<TraktEpisodeRated> traktEpisodesRated) { TraktLogger.Info("Finding local episodes to add to trakt.tv ratings"); // prepare new sync object var syncRatedEpisodes = new TraktSyncShowsRatedEx(); syncRatedEpisodes.Shows = new List<TraktSyncShowRatedEx>(); // filter out any invalid episodes or ignored series by user var episodes = localRatedEpisodes.Where(lre => lre[DBOnlineEpisode.cEpisodeIndex] != "" && lre[DBOnlineEpisode.cEpisodeIndex] != "0").ToList(); // create a unique key to lookup and search for faster var onlineEpisodes = traktEpisodesRated.ToLookup(tre => CreateLookupKey(tre), tre => tre); foreach (var episode in episodes) { string tvdbKey = CreateLookupKey(episode); var traktEpisode = onlineEpisodes[tvdbKey].FirstOrDefault(); // check if not rated on trakt and add it to sync list if (traktEpisode == null) { // check if we already have the show added to our sync object var syncShow = syncRatedEpisodes.Shows.FirstOrDefault(sre => sre.Ids != null && sre.Ids.Tvdb == episode[DBOnlineEpisode.cSeriesID]); if (syncShow == null) { // get show data from episode var show = Helper.getCorrespondingSeries(episode[DBOnlineEpisode.cSeriesID]); if (show == null) continue; // create new show syncShow = new TraktSyncShowRatedEx { Ids = new TraktShowId { Tvdb = show[DBSeries.cID], Imdb = BasicHandler.GetProperImdbId(show[DBOnlineSeries.cIMDBID]) }, Title = show[DBOnlineSeries.cOriginalName], Year = show.Year.ToNullableInt32() }; // add a new season collection to show object syncShow.Seasons = new List<TraktSyncShowRatedEx.Season>(); // add show to the collection syncRatedEpisodes.Shows.Add(syncShow); } // check if season exists in show sync object var syncSeason = syncShow.Seasons.FirstOrDefault(ss => ss.Number == episode[DBOnlineEpisode.cSeasonIndex]); if (syncSeason == null) { // create new season syncSeason = new TraktSyncShowRatedEx.Season { Number = episode[DBOnlineEpisode.cSeasonIndex] }; // add a new episode collection to season object syncSeason.Episodes = new List<TraktSyncShowRatedEx.Season.Episode>(); // add season to the show syncShow.Seasons.Add(syncSeason); } // add episode to season syncSeason.Episodes.Add(new TraktSyncShowRatedEx.Season.Episode { Number = episode[DBOnlineEpisode.cEpisodeIndex], Rating = episode[DBOnlineEpisode.cMyRating], RatedAt = DateTime.UtcNow.ToISO8601() }); } } return syncRatedEpisodes; }
/// <summary> /// Rate a single episode on trakt.tv (with show info) /// </summary> public static TraktSyncResponse AddEpisodeToRatingsEx(TraktSyncShowRatedEx item) { var episodes = new TraktSyncShowsRatedEx { Shows = new List<TraktSyncShowRatedEx>() { item } }; return AddShowsToRatingsEx(episodes); }
/// <summary> /// UnRate a single episode on trakt.tv (with show info) /// </summary> public static TraktSyncResponse RemoveEpisodeFromRatingsEx(TraktSyncShowRatedEx item) { var episodes = new TraktSyncShowsRatedEx { Shows = new List<TraktSyncShowRatedEx>() { item } }; return RemoveShowsFromRatingsEx(episodes); }
internal static void AddEpisodesToRatings(TraktSyncShowRatedEx show) { var ratedEpisodes = (_RatedEpisodes ?? new List<TraktEpisodeRated>()).ToList(); var episodesToAdd = new List<TraktEpisodeRated>(); foreach (var season in show.Seasons) { foreach (var episode in season.Episodes) { episodesToAdd.Add(new TraktEpisodeRated { RatedAt = episode.RatedAt ?? DateTime.UtcNow.ToISO8601(), Rating = episode.Rating, Show = new TraktShow { Ids = show.Ids, Title = show.Title, Year = show.Year }, Episode = new TraktEpisode { Ids= new TraktEpisodeId(), Number = episode.Number, Season = season.Number } }); } } ratedEpisodes.AddRange(episodesToAdd); _RatedEpisodes = ratedEpisodes; }