private TraktSyncAll GetSyncItems(TraktListItem listItem)
        {
            var syncItems = new TraktSyncAll();

            switch (listItem.Type)
            {
                case "movie":
                    var movie = new TraktMovie
                    {
                        Ids = new TraktMovieId { Trakt = listItem.Movie.Ids.Trakt }
                    };
                    syncItems.Movies = new List<TraktMovie>();
                    syncItems.Movies.Add(movie);
                    break;

                case "show":
                    var show = new TraktShow
                    {
                        Ids = new TraktShowId { Trakt = listItem.Show.Ids.Trakt }
                    };
                    syncItems.Shows = new List<TraktShow>();
                    syncItems.Shows.Add(show);
                    break;

                case "season":
                    var season = new TraktSeason
                    {
                        Ids = new TraktSeasonId { Trakt = listItem.Season.Ids.Trakt }
                    };
                    syncItems.Seasons = new List<TraktSeason>();
                    syncItems.Seasons.Add(season);
                    break;

                case "episode":
                    var episode = new TraktEpisode
                    {
                        Ids = new TraktEpisodeId { Trakt = listItem.Episode.Ids.Trakt }
                    };
                    syncItems.Episodes = new List<TraktEpisode>();
                    syncItems.Episodes.Add(episode);
                    break;

                case "person":
                    var person = new TraktPerson
                    {
                        Ids = new TraktPersonId { Trakt = listItem.Person.Ids.Trakt }
                    };
                    syncItems.People = new List<TraktPerson>();
                    syncItems.People.Add(person);
                    break;
            }

            return syncItems;
        }
        private string GetListItemLabel(TraktListItem listItem)
        {
            string retValue = string.Empty;

            switch (listItem.Type)
            {
                case "movie":
                    retValue = listItem.Movie.Title;
                    break;

                case "show":
                    retValue = listItem.Show.Title;
                    break;

                case "season":
                    retValue = string.Format("{0} {1} {2}", listItem.Show.Title, GUI.Translation.Season, listItem.Season.Number);
                    break;

                case "episode":
                    retValue = string.Format("{0} - {1}x{2}{3}", listItem.Show.Title, listItem.Episode.Season, listItem.Episode.Number, string.IsNullOrEmpty(listItem.Episode.Title) ? string.Empty : " - " + listItem.Episode.Title);
                    break;

                case "person":
                    retValue = listItem.Person.Name;
                    break;
            }
            return retValue;
        }
        private string GetListItemSecondLabel(TraktListItem listItem)
        {
            string retValue = string.Empty;

            switch (listItem.Type)
            {
                case "movie":
                    retValue = listItem.Movie.Year == null ? "----" : listItem.Movie.Year.ToString();
                    break;

                case "show":
                    retValue = listItem.Show.Year == null ? "----" : listItem.Show.Year.ToString();
                    break;

                case "season":
                    retValue = string.Format("{0} {1}", listItem.Season.EpisodeCount, Translation.Episodes);
                    break;

                case "episode":
                    retValue = listItem.Episode.FirstAired.FromISO8601().ToShortDateString();
                    break;

                case "person":
                    retValue = listItem.Person.Birthday;
                    break;
            }
            return retValue;
        }
 private void AddItemToWatchedHistory(TraktListItem item)
 {
     if (SelectedType == TraktItemType.movie)
     {
         TraktHelper.AddMovieToWatchHistory(item.Movie);
     }
     else if (SelectedType == TraktItemType.episode)
     {
         TraktHelper.AddEpisodeToWatchHistory(item.Episode);
         TraktCache.AddEpisodeToWatchHistory(item.Show, item.Episode);
     }
 }
 private void AddItemToWatchList(TraktListItem item)
 {
     if (SelectedType == TraktItemType.movie)
     {
         TraktHelper.AddMovieToWatchList(item.Movie, true);
     }
     else if (SelectedType == TraktItemType.show)
     {
         TraktHelper.AddShowToWatchList(item.Show);
     }
     else if (SelectedType == TraktItemType.episode)
     {
         TraktHelper.AddEpisodeToWatchList(item.Episode);
         TraktCache.AddEpisodeToWatchlist(item.Show, item.Episode);
     }
 }
        private void PublishEpisodeSkinProperties(TraktListItem item)
        {
            if (item == null || item.Episode == null) return;

            GUICommon.SetProperty("#Trakt.Season.Number", item.Episode.Season);
            GUICommon.SetEpisodeProperties(item.Show, item.Episode);

            PublishShowSkinProperties(item);
        }
        public static void AddRemoveShowInUserList(string username, string title, string year, string tvdbid, bool remove)
        {
            if (!GUICommon.CheckLogin(false)) return;

            GUIBackgroundTask.Instance.ExecuteInBackgroundAndCallback(() =>
            {
                return TraktLists.GetListsForUser(username);
            },
            delegate(bool success, object result)
            {
                if (success)
                {
                    IEnumerable<TraktUserList> customlists = result as IEnumerable<TraktUserList>;

                    // get slug of lists selected
                    List<string> slugs = TraktLists.GetUserListSelections(customlists.ToList());
                    if (slugs == null || slugs.Count == 0) return;

                    TraktListItem item = new TraktListItem
                    {
                        Type = TraktItemType.show.ToString(),
                        Title = title,
                        Year = string.IsNullOrEmpty(year) ? 0 : Convert.ToInt32(year),
                        TvdbId = tvdbid
                    };

                    AddRemoveItemInList(slugs, item, remove);
                }
            }, Translation.GettingLists, true);
        }
        private void PublishShowSkinProperties(TraktListItem item)
        {
            if (item == null || item.Show == null) return;

            GUICommon.SetShowProperties(item.Show);
        }
 private void RateItem(TraktListItem item)
 {
     if (SelectedType == TraktItemType.movie)
         GUICommon.RateMovie(item.Movie);
     else if (SelectedType == TraktItemType.show)
         GUICommon.RateShow(item.Show);
     else if (SelectedType == TraktItemType.episode)
         GUICommon.RateEpisode(item.Show, item.Episode);
 }
        private void PublishPersonSkinProperties(TraktListItem item)
        {
            if (item == null || item.Person == null) return;

            GUICommon.SetPersonProperties(item.Person);
        }
        private void PublishSeasonSkinProperties(TraktListItem item)
        {
            if (item == null || item.Season == null) return;

            GUICommon.SetSeasonProperties(item.Show, item.Season);

            PublishShowSkinProperties(item);
        }
        private void PublishMovieSkinProperties(TraktListItem item)
        {
            if (item == null || item.Movie == null) return;

            GUICommon.SetMovieProperties(item.Movie);
        }
        private void CopyList(TraktListDetail sourceList, TraktListDetail newList)
        {
            var copyList = new CopyList { Username = CurrentUser, Source = sourceList, Destination = newList };

            var copyThread = new Thread((obj) =>
            {
                var copyParams = obj as CopyList;

                // first create new list
                TraktLogger.Info("Creating new list online. Privacy = '{0}', Name = '{1}'", copyParams.Destination.Privacy, copyParams.Destination.Name);
                var response = TraktAPI.TraktAPI.CreateCustomList(copyParams.Destination);
                if (response != null)
                {
                    // get items from other list
                    var userListItems = TraktAPI.TraktAPI.GetUserListItems(copyParams.Username, copyParams.Source.Ids.Trakt.ToString(), "min");

                    // copy items to new list
                    var itemsToAdd = new TraktSyncAll();
                    foreach (var item in userListItems)
                    {
                        var listItem = new TraktListItem();
                        listItem.Type = item.Type;

                        switch (item.Type)
                        {
                            case "movie":
                                if (itemsToAdd.Movies == null)
                                    itemsToAdd.Movies = new List<TraktMovie>();

                                itemsToAdd.Movies.Add(new TraktMovie { Ids = item.Movie.Ids });
                                break;

                            case "show":
                                if (itemsToAdd.Shows == null)
                                    itemsToAdd.Shows = new List<TraktShow>();

                                itemsToAdd.Shows.Add(new TraktShow { Ids = item.Show.Ids });
                                break;

                            case "season":
                                if (itemsToAdd.Seasons == null)
                                    itemsToAdd.Seasons = new List<TraktSeason>();

                                itemsToAdd.Seasons.Add(new TraktSeason { Ids = item.Season.Ids });
                                break;

                            case "episode":
                                if (itemsToAdd.Episodes == null)
                                    itemsToAdd.Episodes = new List<TraktEpisode>();

                                itemsToAdd.Episodes.Add(new TraktEpisode { Ids = item.Episode.Ids });
                                break;

                            case "person":
                                if (itemsToAdd.People == null)
                                    itemsToAdd.People = new List<TraktPerson>();

                                itemsToAdd.People.Add(new TraktPerson { Ids = item.Person.Ids });
                                break;
                        }
                    }

                    // add items to the list
                    var ItemsAddedResponse = TraktAPI.TraktAPI.AddItemsToList("me", response.Ids.Trakt.ToString(), itemsToAdd);

                    if (ItemsAddedResponse != null)
                    {
                        TraktLists.ClearListCache(TraktSettings.Username);
                        TraktCache.ClearCustomListCache();

                        // updated MovingPictures categories and filters menu
                        if (TraktHelper.IsMovingPicturesAvailableAndEnabled)
                        {
                            TraktHandlers.MovingPictures.UpdateCategoriesMenu(SyncListType.CustomList);
                            TraktHandlers.MovingPictures.UpdateFiltersMenu(SyncListType.CustomList);
                        }
                    }
                }
            })
            {
                Name = "CopyList",
                IsBackground = true
            };
            copyThread.Start(copyList);
        }
 internal static void AddRemoveItemInList(List<string> slugs, TraktListItem item, bool remove)
 {
     AddRemoveItemInList(slugs, new List<TraktListItem>() { item }, remove);
 }
        private GUITmdbImage GetTmdbImage(TraktListItem listItem)
        {
            var images = new GUITmdbImage();

            switch (listItem.Type)
            {
                case "movie":
                    images.MovieImages = new TmdbMovieImages { Id = listItem.Movie.Ids.Tmdb };
                    break;

                case "show":
                    images.ShowImages = new TmdbShowImages { Id = listItem.Show.Ids.Tmdb };
                    break;
                case "season":
                    images.ShowImages = new TmdbShowImages { Id = listItem.Show.Ids.Tmdb };
                    images.SeasonImages = new TmdbSeasonImages
                    {
                        Id = listItem.Show.Ids.Tmdb,
                        Season = listItem.Season.Number
                    };
                    break;
                case "episode":
                    images.ShowImages = new TmdbShowImages { Id = listItem.Show.Ids.Tmdb };
                    images.SeasonImages = new TmdbSeasonImages
                    {
                        Id = listItem.Show.Ids.Tmdb,
                        Season = listItem.Episode.Season
                    };
                    break;
                case "person":
                    images.PeopleImages = new TmdbPeopleImages { Id = listItem.Person.Ids.TmdbId };
                    break;
            }

            return images;
        }
 private void RemoveItemFromWatchedHistory(TraktListItem item)
 {
     if (SelectedType == TraktItemType.movie)
     {
         TraktHelper.RemoveMovieFromWatchHistory(item.Movie);
     }
     else if (SelectedType == TraktItemType.episode)
     {
         TraktHelper.RemoveEpisodeFromWatchHistory(item.Episode);
         TraktCache.RemoveEpisodeFromWatchHistory(item.Show, item.Episode);
     }
 }
        private bool ListItemMatch(TraktListItem currentItem, TraktListItem itemToMatch)
        {
            switch (itemToMatch.Type)
            {
                case "movie":
                    if (currentItem.Movie == null) return false;
                    return currentItem.Movie.Ids.Trakt == itemToMatch.Movie.Ids.Trakt;

                case "show":
                    if (currentItem.Show == null) return false;
                    return currentItem.Show.Ids.Trakt == itemToMatch.Show.Ids.Trakt;

                case "season":
                    if (currentItem.Season == null) return false;
                    return currentItem.Season.Ids.Trakt == itemToMatch.Season.Ids.Trakt;

                case "episode":
                    if (currentItem.Episode == null) return false;
                    return currentItem.Episode.Ids.Trakt == itemToMatch.Episode.Ids.Trakt;

                case "person":
                    if (currentItem.Person == null) return false;
                    return currentItem.Person.Ids.Trakt == itemToMatch.Person.Ids.Trakt;
            }

            return false;
        }
 private void RemoveItemFromWatchList(TraktListItem item)
 {
     if (SelectedType == TraktItemType.movie)
     {
         TraktHelper.RemoveMovieFromWatchList(item.Movie, true);
     }
     else if (SelectedType == TraktItemType.show)
     {
         TraktHelper.RemoveShowFromWatchList(item.Show);
     }
     else if (SelectedType == TraktItemType.episode)
     {
         TraktHelper.RemoveEpisodeFromWatchList(item.Episode);
     }
 }
        private void CopyList(TraktUserList sourceList, TraktList newList)
        {
            CopyList copyList = new CopyList { Username = CurrentUser, Source = sourceList, Destination = newList };

            Thread copyThread = new Thread(delegate(object obj)
            {
                CopyList copyParams = obj as CopyList;

                // first create new list
                TraktLogger.Info("Creating new '{0}' list '{1}'", copyParams.Destination.Privacy, copyParams.Destination.Name);
                TraktAddListResponse response = TraktAPI.TraktAPI.ListAdd(copyParams.Destination);
                TraktAPI.TraktAPI.LogTraktResponse<TraktResponse>(response);
                if (response.Status == "success")
                {
                    // update with offical slug
                    copyParams.Destination.Slug = response.Slug;

                    // get items from other list
                    TraktUserList userList = TraktAPI.TraktAPI.GetUserList(copyParams.Username, copyParams.Source.Slug);
                    // copy items to new list
                    List<TraktListItem> items = new List<TraktListItem>();
                    foreach (var item in userList.Items)
                    {
                        TraktListItem listItem = new TraktListItem();
                        listItem.Type = item.Type;

                        switch (item.Type)
                        {
                            case "movie":
                                listItem.Title = item.Movie.Title;
                                listItem.Year = Convert.ToInt32(item.Movie.Year);
                                listItem.ImdbId = item.Movie.Imdb;
                                break;
                            case "show":
                                listItem.Title = item.Show.Title;
                                listItem.Year = item.Show.Year;
                                listItem.TvdbId = item.Show.Tvdb;
                                break;
                            case "season":
                                listItem.Title = item.Show.Title;
                                listItem.Year = item.Show.Year;
                                listItem.TvdbId = item.Show.Tvdb;
                                listItem.Season = Convert.ToInt32(item.SeasonNumber);
                                break;
                            case "episode":
                                listItem.Title = item.Show.Title;
                                listItem.Year = item.Show.Year;
                                listItem.TvdbId = item.Show.Tvdb;
                                listItem.Season = Convert.ToInt32(item.SeasonNumber);
                                listItem.Episode = Convert.ToInt32(item.EpisodeNumber);
                                break;
                        }
                        items.Add(listItem);
                    }
                    copyParams.Destination.Items = items;

                    // add items to the list
                    TraktAPI.TraktAPI.LogTraktResponse<TraktSyncResponse>(TraktAPI.TraktAPI.ListAddItems(copyParams.Destination));
                    if (response.Status == "success") TraktLists.ClearCache(TraktSettings.Username);
                }
            })
            {
                Name = "Copy List",
                IsBackground = true
            };
            copyThread.Start(copyList);
        }
        protected override void OnShowContextMenu()
        {
            GUIListItem selectedItem = this.Facade.SelectedListItem;
            if (selectedItem == null) return;

            TraktUserListItem userListItem = (TraktUserListItem)selectedItem.TVTag;

            IDialogbox dlg = (IDialogbox)GUIWindowManager.GetWindow((int)GUIWindow.Window.WINDOW_DIALOG_MENU);
            if (dlg == null) return;

            dlg.Reset();
            dlg.SetHeading(GUIUtils.PluginName());

            GUIListItem listItem = null;

            if (SelectedType == TraktItemType.movie || SelectedType == TraktItemType.episode)
            {
                // Mark As Watched
                if (!userListItem.Watched)
                {
                    listItem = new GUIListItem(Translation.MarkAsWatched);
                    dlg.Add(listItem);
                    listItem.ItemId = (int)ContextMenuItem.MarkAsWatched;
                }

                // Mark As UnWatched
                if (userListItem.Watched)
                {
                    listItem = new GUIListItem(Translation.MarkAsUnWatched);
                    dlg.Add(listItem);
                    listItem.ItemId = (int)ContextMenuItem.MarkAsUnWatched;
                }
            }

            if (SelectedType != TraktItemType.season)
            {
                // Add/Remove Watch List
                if (!userListItem.InWatchList)
                {
                    listItem = new GUIListItem(Translation.AddToWatchList);
                    dlg.Add(listItem);
                    listItem.ItemId = (int)ContextMenuItem.AddToWatchList;
                }
                else
                {
                    listItem = new GUIListItem(Translation.RemoveFromWatchList);
                    dlg.Add(listItem);
                    listItem.ItemId = (int)ContextMenuItem.RemoveFromWatchList;
                }
            }

            // Add to Custom list
            listItem = new GUIListItem(Translation.AddToList + "...");
            dlg.Add(listItem);
            listItem.ItemId = (int)ContextMenuItem.AddToList;

            // Remove from Custom list (Only if current user is the active user)
            if (TraktSettings.Username == CurrentUser)
            {
                listItem = new GUIListItem(Translation.RemoveFromList);
                dlg.Add(listItem);
                listItem.ItemId = (int)ContextMenuItem.RemoveFromList;
            }

            if (SelectedType == TraktItemType.movie || SelectedType == TraktItemType.episode)
            {
                // Add to Library
                // Don't allow if it will be removed again on next sync
                // movie could be part of a DVD collection
                if (!userListItem.InCollection && !TraktSettings.KeepTraktLibraryClean)
                {
                    listItem = new GUIListItem(Translation.AddToLibrary);
                    dlg.Add(listItem);
                    listItem.ItemId = (int)ContextMenuItem.AddToLibrary;
                }

                if (userListItem.InCollection)
                {
                    listItem = new GUIListItem(Translation.RemoveFromLibrary);
                    dlg.Add(listItem);
                    listItem.ItemId = (int)ContextMenuItem.RemoveFromLibrary;
                }
            }

            // Related Movies/Shows
            listItem = new GUIListItem(SelectedType == TraktItemType.movie ? Translation.RelatedMovies : Translation.RelatedShows + "...");
            dlg.Add(listItem);
            listItem.ItemId = (int)ContextMenuItem.Related;

            if (SelectedType != TraktItemType.season)
            {
                // Rate
                listItem = new GUIListItem(Translation.Rate + "...");
                dlg.Add(listItem);
                listItem.ItemId = (int)ContextMenuItem.Rate;

                // Shouts
                listItem = new GUIListItem(Translation.Shouts + "...");
                dlg.Add(listItem);
                listItem.ItemId = (int)ContextMenuItem.Shouts;
            }

            // Trailers
            if (TraktHelper.IsOnlineVideosAvailableAndEnabled)
            {
                listItem = new GUIListItem(Translation.Trailers);
                dlg.Add(listItem);
                listItem.ItemId = (int)ContextMenuItem.Trailers;
            }

            // Search with mpNZB
            if (TraktHelper.IsMpNZBAvailableAndEnabled)
            {
                if ((userListItem.Movie != null && !userListItem.Movie.InCollection) || userListItem.Episode != null)
                {
                    listItem = new GUIListItem(Translation.SearchWithMpNZB);
                    dlg.Add(listItem);
                    listItem.ItemId = (int)ContextMenuItem.SearchWithMpNZB;
                }
            }

            // Search with MyTorrents
            if (TraktHelper.IsMyTorrentsAvailableAndEnabled)
            {
                if ((userListItem.Movie != null && !userListItem.Movie.InCollection) || userListItem.Episode != null)
                {
                    listItem = new GUIListItem(Translation.SearchTorrent);
                    dlg.Add(listItem);
                    listItem.ItemId = (int)ContextMenuItem.SearchTorrent;
                }
            }

            // Change Layout
            listItem = new GUIListItem(Translation.ChangeLayout);
            dlg.Add(listItem);
            listItem.ItemId = (int)ContextMenuItem.ChangeLayout;

            // Show Context Menu
            dlg.DoModal(GUIWindowManager.ActiveWindow);
            if (dlg.SelectedId < 0) return;

            switch (dlg.SelectedId)
            {
                case ((int)ContextMenuItem.MarkAsWatched):
                    MarkItemAsWatched(userListItem);
                    if (userListItem.Plays == 0) userListItem.Plays = 1;
                    userListItem.Watched = true;
                    selectedItem.IsPlayed = true;
                    OnItemSelected(selectedItem, Facade);
                    if (SelectedType == TraktItemType.movie)
                        userListItem.Movie.Images.NotifyPropertyChanged("PosterImageFilename");
                    else
                        userListItem.Show.Images.NotifyPropertyChanged("PosterImageFilename");
                    break;

                case ((int)ContextMenuItem.MarkAsUnWatched):
                    MarkItemAsUnWatched(userListItem);
                    userListItem.Watched = false;
                    selectedItem.IsPlayed = false;
                    OnItemSelected(selectedItem, Facade);
                    if (SelectedType == TraktItemType.movie)
                        userListItem.Movie.Images.NotifyPropertyChanged("PosterImageFilename");
                    else
                        userListItem.Show.Images.NotifyPropertyChanged("PosterImageFilename");
                    break;

                case ((int)ContextMenuItem.AddToWatchList):
                    AddItemToWatchList(userListItem);
                    userListItem.InWatchList = true;
                    OnItemSelected(selectedItem, Facade);
                    if (SelectedType == TraktItemType.movie)
                        userListItem.Movie.Images.NotifyPropertyChanged("PosterImageFilename");
                    else
                        userListItem.Show.Images.NotifyPropertyChanged("PosterImageFilename");
                    GUIWatchListMovies.ClearCache(TraktSettings.Username);
                    break;

                case ((int)ContextMenuItem.RemoveFromWatchList):
                    RemoveItemFromWatchList(userListItem);
                    userListItem.InWatchList = false;
                    OnItemSelected(selectedItem, Facade);
                    if (SelectedType == TraktItemType.movie)
                        userListItem.Movie.Images.NotifyPropertyChanged("PosterImageFilename");
                    else
                        userListItem.Show.Images.NotifyPropertyChanged("PosterImageFilename");
                    GUIWatchListMovies.ClearCache(TraktSettings.Username);
                    break;

                case ((int)ContextMenuItem.AddToList):
                    if (SelectedType == TraktItemType.movie)
                        TraktHelper.AddRemoveMovieInUserList(userListItem.Title, userListItem.Year, userListItem.ImdbId, false);
                    else if (SelectedType == TraktItemType.show)
                        TraktHelper.AddRemoveShowInUserList(userListItem.Title, userListItem.Year, userListItem.Show.Tvdb, false);
                    else if (SelectedType == TraktItemType.season)
                        TraktHelper.AddRemoveSeasonInUserList(userListItem.Title, userListItem.Year, userListItem.SeasonNumber, userListItem.Show.Tvdb, false);
                    else if (SelectedType == TraktItemType.episode)
                        TraktHelper.AddRemoveEpisodeInUserList(userListItem.Title, userListItem.Year, userListItem.SeasonNumber, userListItem.EpisodeNumber, userListItem.Show.Tvdb, false);
                    break;

                case ((int)ContextMenuItem.RemoveFromList):
                    if (!GUIUtils.ShowYesNoDialog(Translation.DeleteListItem, Translation.ConfirmDeleteListItem)) break;

                    // Only do remove from current list
                    // We could do same as Add (ie remove from multile lists) but typically you only remove from the current list
                    if (SelectedType == TraktItemType.movie)
                    {
                        TraktListItem item = new TraktListItem { Type = "movie", ImdbId = userListItem.ImdbId, Title = userListItem.Title, Year = Convert.ToInt32(userListItem.Year) };
                        TraktHelper.AddRemoveItemInList(CurrentList.Slug, item, true);
                    }
                    else if (SelectedType == TraktItemType.show)
                    {
                        TraktListItem item = new TraktListItem { Type = "show", TvdbId = userListItem.Show.Tvdb, Title = userListItem.Title, Year = Convert.ToInt32(userListItem.Year) };
                        TraktHelper.AddRemoveItemInList(CurrentList.Slug, item, true);
                    }
                    else if (SelectedType == TraktItemType.season)
                    {
                        TraktListItem item = new TraktListItem { Type = "season", TvdbId = userListItem.Show.Tvdb, Title = userListItem.Title, Year = Convert.ToInt32(userListItem.Year), Season = Convert.ToInt32(userListItem.SeasonNumber) };
                        TraktHelper.AddRemoveItemInList(CurrentList.Slug, item, true);
                    }
                    else if (SelectedType == TraktItemType.episode)
                    {
                        TraktListItem item = new TraktListItem { Type = "episode", TvdbId = userListItem.Show.Tvdb, Title = userListItem.Title, Year = Convert.ToInt32(userListItem.Year), Season = Convert.ToInt32(userListItem.SeasonNumber), Episode = Convert.ToInt32(userListItem.EpisodeNumber) };
                        TraktHelper.AddRemoveItemInList(CurrentList.Slug, item, true);
                    }

                    // Remove from view
                    if (Facade.Count > 1)
                    {
                        PreviousSelectedIndex = Facade.SelectedListItemIndex;
                        CurrentList.Items.Remove(userListItem);
                        SendListItemsToFacade(CurrentList);
                    }
                    else
                    {
                        CurrentList.Items.Remove(userListItem);

                        // no more items left
                        GUIControl.ClearControl(GetID, Facade.GetID);
                        ClearProperties();
                        GUIWindowManager.Process();

                        // nothing left, exit
                        GUIWindowManager.ShowPreviousWindow();
                        return;
                    }
                    break;

                case ((int)ContextMenuItem.AddToLibrary):
                    AddItemToLibrary(userListItem);
                    userListItem.InCollection = true;
                    OnItemSelected(selectedItem, Facade);
                    if (SelectedType == TraktItemType.movie)
                        userListItem.Movie.Images.NotifyPropertyChanged("PosterImageFilename");
                    else
                        userListItem.Show.Images.NotifyPropertyChanged("PosterImageFilename");
                    break;

                case ((int)ContextMenuItem.RemoveFromLibrary):
                    RemoveItemFromLibrary(userListItem);
                    userListItem.InCollection = false;
                    OnItemSelected(selectedItem, Facade);
                    if (SelectedType == TraktItemType.movie)
                        userListItem.Movie.Images.NotifyPropertyChanged("PosterImageFilename");
                    else
                        userListItem.Show.Images.NotifyPropertyChanged("PosterImageFilename");
                    break;

                case ((int)ContextMenuItem.Related):
                    if (SelectedType == TraktItemType.movie)
                    {
                        RelatedMovie relatedMovie = new RelatedMovie();
                        relatedMovie.IMDbId = userListItem.Movie.Imdb;
                        relatedMovie.Title = userListItem.Movie.Title;
                        GUIRelatedMovies.relatedMovie = relatedMovie;
                        GUIWindowManager.ActivateWindow((int)TraktGUIWindows.RelatedMovies);
                    }
                    else
                    {
                        //series, season & episode
                        RelatedShow relatedShow = new RelatedShow();
                        relatedShow.Title = userListItem.Show.Title;
                        relatedShow.TVDbId = userListItem.Show.Tvdb;
                        GUIRelatedShows.relatedShow = relatedShow;
                        GUIWindowManager.ActivateWindow((int)TraktGUIWindows.RelatedShows);
                    }
                    break;

                case ((int)ContextMenuItem.Rate):
                    RateItem(userListItem);
                    OnItemSelected(selectedItem, Facade);
                    if (SelectedType == TraktItemType.movie)
                        userListItem.Movie.Images.NotifyPropertyChanged("PosterImageFilename");
                    else
                        userListItem.Show.Images.NotifyPropertyChanged("PosterImageFilename");
                    break;

                case ((int)ContextMenuItem.Shouts):
                    GUIShouts.ShoutType = (GUIShouts.ShoutTypeEnum)Enum.Parse(typeof(GUIShouts.ShoutTypeEnum), SelectedType.ToString(), true);
                    if (SelectedType == TraktItemType.movie)
                        GUIShouts.MovieInfo = new MovieShout { IMDbId = userListItem.ImdbId, TMDbId = userListItem.Movie.Tmdb, Title = userListItem.Title, Year = userListItem.Year };
                    else if (SelectedType == TraktItemType.show)
                        GUIShouts.ShowInfo = new ShowShout { IMDbId = userListItem.ImdbId, TVDbId = userListItem.Show.Tvdb, Title = userListItem.Title };
                    else
                        GUIShouts.EpisodeInfo = new EpisodeShout { IMDbId = userListItem.ImdbId, TVDbId = userListItem.Show.Tvdb, Title = userListItem.Title, SeasonIdx = userListItem.SeasonNumber, EpisodeIdx = userListItem.EpisodeNumber };
                    GUIShouts.Fanart = SelectedType == TraktItemType.movie ? (userListItem.Images as TraktMovie.MovieImages).FanartImageFilename : (userListItem.Images as TraktShow.ShowImages).FanartImageFilename;
                    GUIWindowManager.ActivateWindow((int)TraktGUIWindows.Shouts);
                    break;

                case ((int)ContextMenuItem.Trailers):
                    ShowTrailersMenu(userListItem);
                    break;

                case ((int)ContextMenuItem.SearchWithMpNZB):
                    string loadingParam = String.Empty;
                    if (userListItem.Movie != null)
                    {
                        loadingParam = string.Format("search:{0}", userListItem.Movie.Title);
                    }
                    else if (userListItem.Episode != null)
                    {
                        loadingParam = string.Format("search:{0} S{1}E{2}", userListItem.Show.Title, userListItem.Episode.Season.ToString("D2"), userListItem.Episode.Number.ToString("D2"));
                    }
                    GUIWindowManager.ActivateWindow((int)ExternalPluginWindows.MpNZB, loadingParam);
                    break;

                case ((int)ContextMenuItem.SearchTorrent):
                    string loadPar = String.Empty;
                    if (userListItem.Movie != null)
                    {
                        loadPar = userListItem.Movie.Title;
                    }
                    else if (userListItem.Episode != null)
                    {
                        loadPar = string.Format("{0} S{1}E{2}", userListItem.Show.Title, userListItem.Episode.Season.ToString("D2"), userListItem.Episode.Number.ToString("D2"));
                    }
                    GUIWindowManager.ActivateWindow((int)ExternalPluginWindows.MyTorrents, loadPar);
                    break;

                case ((int)ContextMenuItem.ChangeLayout):
                    ShowLayoutMenu();
                    break;

                default:
                    break;
            }

            base.OnShowContextMenu();
        }