/// <summary> /// Media playback has stopped. Depending on playback progress, let Trakt.tv know the user has /// completed watching the item. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private async void KernelPlaybackStopped(object sender, PlaybackStopEventArgs e) { if (e.Users == null || !e.Users.Any() || e.Item == null) { _logger.Error("Event details incomplete. Cannot process current media"); return; } try { var traktUser = UserHelper.GetTraktUser(e.Users.FirstOrDefault()); if (traktUser == null) { _logger.Error("Could not match trakt user"); return; } var video = e.Item as Video; if (e.PlayedToCompletion) { _logger.Info("Item is played. Scrobble"); try { if (video is Movie) { await _traktApi.SendMovieStatusUpdateAsync(video as Movie, MediaStatus.Scrobble, traktUser). ConfigureAwait(false); } else if (video is Episode) { await _traktApi.SendEpisodeStatusUpdateAsync(video as Episode, MediaStatus.Scrobble, traktUser) .ConfigureAwait(false); } } catch (Exception ex) { _logger.ErrorException("Exception handled sending status update", ex); } } else { _logger.Info("Item Not fully played. Tell trakt.tv we are no longer watching but don't scrobble"); if (video is Movie) { await _traktApi.SendCancelWatchingMovie(traktUser); } else { await _traktApi.SendCancelWatchingShow(traktUser); } } } catch (Exception ex) { _logger.ErrorException("Error sending scrobble", ex, null); } // No longer need to track the item var playEvent = _progressEvents.FirstOrDefault(ev => ev.UserId.Equals(e.Users.First().Id) && ev.ItemId.Equals(e.Item.Id)); if (playEvent != null) { _progressEvents.Remove(playEvent); } }