Index: MP-TVSeries/DB Classes/DBSeries.cs =================================================================== --- MP-TVSeries/DB Classes/DBSeries.cs (revision 2109) +++ MP-TVSeries/DB Classes/DBSeries.cs (working copy) @@ -864,7 +864,11 @@ season.Commit(); seriesEpsTotal += count; - seriesEpsUnWatched += unWatchedCount; + // Count the Special (Season 0 (zero)) episodes as watched! + if ( (season[DBSeason.cIndex] != 0) && (DBOption.GetOptions(DBOption.cCountSpecialEpisodesAsWatched)) ) + { + seriesEpsUnWatched += unWatchedCount; + } } // update series counts @@ -898,11 +902,18 @@ epsUnWatched = 0; DBEpisode.GetSeasonEpisodeCounts(series, season, out epsTotal, out epsUnWatched); - season[DBSeason.cEpisodeCount] = epsTotal; seriesEpsTotal += epsTotal; - season[DBSeason.cEpisodesUnWatched] = epsUnWatched; seriesEpsUnWatched += epsUnWatched; + season[DBSeason.cEpisodeCount] = epsTotal; + season[DBSeason.cEpisodesUnWatched] = epsUnWatched; season[DBSeason.cUnwatchedItems] = epsUnWatched > 0; season.Commit(); + seriesEpsTotal += epsTotal; + // Count the Special (Season 0 (zero)) episodes as watched! + if ((season[DBSeason.cIndex] != 0) && (DBOption.GetOptions(DBOption.cCountSpecialEpisodesAsWatched))) + { + seriesEpsUnWatched += epsUnWatched; + } + MPTVSeriesLog.Write(string.Format("Series \"{0} Season {1}\" has {2}/{3} unwatched episodes", series.ToString(), season[DBSeason.cIndex], epsUnWatched, epsTotal), MPTVSeriesLog.LogLevel.Debug); } Index: MP-TVSeries/TVSeriesPlugin.cs =================================================================== --- MP-TVSeries/TVSeriesPlugin.cs (revision 2109) +++ MP-TVSeries/TVSeriesPlugin.cs (working copy) @@ -4094,7 +4094,7 @@ pItem = new GUIListItem(Translation.AskToRate + " (" + (DBOption.GetOptions(DBOption.cAskToRate) ? Translation.on : Translation.off) + ")"); dlg.Add(pItem); - pItem.ItemId = (int)eContextItems.optionsAskToRate; + pItem.ItemId = (int)eContextItems.optionsAskToRate; if (FanartBackground != null) { @@ -4179,18 +4179,25 @@ case (int)eContextItems.actionCountSpecialEpisodesAsWatched: DBOption.SetOptions(DBOption.cCountSpecialEpisodesAsWatched, !DBOption.GetOptions(DBOption.cCountSpecialEpisodesAsWatched)); - // Set number of watched/unwatched episodes + // Set number of watched/unwatched episodes in the background thread allSeries = DBSeries.Get(new SQLCondition()); - foreach (var series in allSeries) + + if (allSeries.Count > 0) { - int epsTotal = 0; - int epsUnWatched = 0; - DBEpisode.GetSeriesEpisodeCounts(series[DBSeries.cID], out epsTotal, out epsUnWatched); - series[DBOnlineSeries.cEpisodeCount] = epsTotal; - series[DBOnlineSeries.cEpisodesUnWatched] = epsUnWatched; - series.Commit(); + MPTVSeriesLog.Write("Begin Count Special Episode as Watched/ Unwatched"); + BackgroundWorker backgroundWorker = new BackgroundWorker(); + backgroundWorker.DoWork += new DoWorkEventHandler(asyncCountSpecialEpisodesAsWatched); + backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(asyncCountSpecialEpisodesAsWatchedCompleted); + backgroundWorker.ProgressChanged += new ProgressChangedEventHandler((s, e) => + { + if (backgroundWorker.IsBusy) + { + object[] userState = e.UserState as object[]; + backgroundWorker.ReportProgress(0, new ParsingProgress(ParsingAction.UpdateEpisodeCounts, (userState[0] as DBSeries).ToString(), (int)userState[1], allSeries.Count)); + } + }); + backgroundWorker.RunWorkerAsync(allSeries); } - LoadFacade(); break; } } @@ -4197,7 +4204,29 @@ } #endregion - #region View Tags Menu + void asyncCountSpecialEpisodesAsWatched(object sender, DoWorkEventArgs e) + { + System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.Lowest; + + List allSeries = (List)e.Argument; + foreach (var series in allSeries) + { + int epsTotal = 0; + int epsUnWatched = 0; + DBEpisode.GetSeriesEpisodeCounts(series[DBSeries.cID], out epsTotal, out epsUnWatched); + series[DBOnlineSeries.cEpisodeCount] = epsTotal; + series[DBOnlineSeries.cEpisodesUnWatched] = epsUnWatched; + series.Commit(); + } + } + + void asyncCountSpecialEpisodesAsWatchedCompleted(object sender, RunWorkerCompletedEventArgs e) + { + MPTVSeriesLog.Write("Count Special Episode as Watched/ Unwatched completed!"); + LoadFacade(); + } + + #region View Tags Menu private void ShowViewTagsMenu(bool add, DBSeries series) { IDialogbox dlg = (IDialogbox)GUIWindowManager.GetWindow((int)GUIWindow.Window.WINDOW_DIALOG_MENU);