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