public static void CreateOrVerifyTagsAndYearsFilters(bool frominit = false, HashSet <string> tags = null, DateTime?airdate = null) { GroupFilterRepository repFilters = new GroupFilterRepository(); using (var session = JMMService.SessionFactory.OpenSession()) { string t = "GroupFilter"; List <GroupFilter> lockedGFs = repFilters.GetLockedGroupFilters(session); AniDB_TagRepository tagsrepo = new AniDB_TagRepository(); AnimeGroupRepository grouprepo = new AnimeGroupRepository(); GroupFilter tagsdirec = lockedGFs.FirstOrDefault(a => a.FilterType == (int)(GroupFilterType.Directory | GroupFilterType.Tag)); if (tagsdirec != null) { HashSet <string> alltags; if (tags == null) { alltags = new HashSet <string>(tagsrepo.GetAll(session).Select(a => a.TagName).Distinct(StringComparer.InvariantCultureIgnoreCase), StringComparer.InvariantCultureIgnoreCase); } else { alltags = new HashSet <string>(tags.Distinct(StringComparer.InvariantCultureIgnoreCase), StringComparer.InvariantCultureIgnoreCase); } HashSet <string> notin = new HashSet <string>(lockedGFs.Where(a => a.FilterType == (int)GroupFilterType.Tag).Select(a => a.Conditions.FirstOrDefault()?.ConditionParameter), StringComparer.InvariantCultureIgnoreCase); alltags.ExceptWith(notin); int max = alltags.Count; int cnt = 0; //AniDB Tags are in english so we use en-us culture TextInfo tinfo = new CultureInfo("en-US", false).TextInfo; foreach (string s in alltags) { cnt++; if (frominit) { ServerState.Instance.CurrentSetupStatus = string.Format(JMMServer.Properties.Resources.Database_Cache, t, Properties.Resources.Filter_CreatingTag + " '" + s + "'" + Properties.Resources.Filter_Filter + cnt + "/" + max); } GroupFilter yf = new GroupFilter { ParentGroupFilterID = tagsdirec.GroupFilterID, InvisibleInClients = 0, GroupFilterName = tinfo.ToTitleCase(s.Replace("`", "'")), BaseCondition = 1, Locked = 1, SortingCriteria = "5;1", FilterType = (int)GroupFilterType.Tag }; GroupFilterCondition gfc = new GroupFilterCondition(); gfc.ConditionType = (int)GroupFilterConditionType.Tag; gfc.ConditionOperator = (int)GroupFilterOperator.Include; gfc.ConditionParameter = s; gfc.GroupFilterID = yf.GroupFilterID; yf.Conditions.Add(gfc); yf.EvaluateAnimeGroups(); yf.EvaluateAnimeSeries(); repFilters.Save(yf); } } GroupFilter yearsdirec = lockedGFs.FirstOrDefault(a => a.FilterType == (int)(GroupFilterType.Directory | GroupFilterType.Year)); if (yearsdirec != null) { HashSet <string> allyears; if (airdate == null) { List <Contract_AnimeGroup> grps = grouprepo.GetAll().Select(a => a.Contract).Where(a => a != null).ToList(); if (grps.Any(a => a.Stat_AirDate_Min.HasValue && a.Stat_AirDate_Max.HasValue)) { DateTime maxtime = grps.Where(a => a.Stat_AirDate_Max.HasValue).Max(a => a.Stat_AirDate_Max.Value); DateTime mintime = grps.Where(a => a.Stat_AirDate_Min.HasValue).Min(a => a.Stat_AirDate_Min.Value); allyears = new HashSet <string>( Enumerable.Range(mintime.Year, maxtime.Year - mintime.Year + 1) .Select(a => a.ToString()), StringComparer.InvariantCultureIgnoreCase); } else { allyears = new HashSet <string>(); } } else { allyears = new HashSet <string>(new string[] { airdate.Value.Year.ToString() }); } HashSet <string> notin = new HashSet <string>( lockedGFs.Where(a => a.FilterType == (int)GroupFilterType.Year) .Select(a => a.Conditions.FirstOrDefault()?.ConditionParameter), StringComparer.InvariantCultureIgnoreCase); allyears.ExceptWith(notin); int max = allyears.Count; int cnt = 0; foreach (string s in allyears) { cnt++; if (frominit) { ServerState.Instance.CurrentSetupStatus = string.Format(JMMServer.Properties.Resources.Database_Cache, t, Properties.Resources.Filter_CreatingYear + " '" + s + "' " + Properties.Resources.Filter_Filter + cnt + "/" + max); } GroupFilter yf = new GroupFilter { ParentGroupFilterID = yearsdirec.GroupFilterID, InvisibleInClients = 0, GroupFilterName = s, BaseCondition = 1, Locked = 1, SortingCriteria = "5;1", FilterType = (int)GroupFilterType.Year }; GroupFilterCondition gfc = new GroupFilterCondition(); gfc.ConditionType = (int)GroupFilterConditionType.Year; gfc.ConditionOperator = (int)GroupFilterOperator.Include; gfc.ConditionParameter = s; gfc.GroupFilterID = yf.GroupFilterID; yf.Conditions.Add(gfc); yf.EvaluateAnimeGroups(); yf.EvaluateAnimeSeries(); repFilters.Save(yf); } } } }
private static void CreateInitialGroupFilters() { // group filters GroupFilterRepository repFilters = new GroupFilterRepository(); GroupFilterConditionRepository repGFC = new GroupFilterConditionRepository(); if (repFilters.GetAll().Count() > 0) { return; } Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(ServerSettings.Culture); // Favorites GroupFilter gf = new GroupFilter(); gf.GroupFilterName = JMMServer.Properties.Resources.Filter_Favorites; gf.ApplyToSeries = 0; gf.BaseCondition = 1; gf.Locked = 0; gf.FilterType = (int)GroupFilterType.UserDefined; GroupFilterCondition gfc = new GroupFilterCondition(); gfc.ConditionType = (int)GroupFilterConditionType.Favourite; gfc.ConditionOperator = (int)GroupFilterOperator.Include; gfc.ConditionParameter = ""; gf.Conditions.Add(gfc); gf.EvaluateAnimeGroups(); gf.EvaluateAnimeSeries(); repFilters.Save(gf); // Missing Episodes gf = new GroupFilter(); gf.GroupFilterName = JMMServer.Properties.Resources.Filter_MissingEpisodes; gf.ApplyToSeries = 0; gf.BaseCondition = 1; gf.Locked = 0; gf.FilterType = (int)GroupFilterType.UserDefined; gfc = new GroupFilterCondition(); gfc.ConditionType = (int)GroupFilterConditionType.MissingEpisodesCollecting; gfc.ConditionOperator = (int)GroupFilterOperator.Include; gfc.ConditionParameter = ""; gf.Conditions.Add(gfc); gf.EvaluateAnimeGroups(); gf.EvaluateAnimeSeries(); repFilters.Save(gf); // Newly Added Series gf = new GroupFilter(); gf.GroupFilterName = JMMServer.Properties.Resources.Filter_Added; gf.ApplyToSeries = 0; gf.BaseCondition = 1; gf.Locked = 0; gf.FilterType = (int)GroupFilterType.UserDefined; gfc = new GroupFilterCondition(); gfc.ConditionType = (int)GroupFilterConditionType.SeriesCreatedDate; gfc.ConditionOperator = (int)GroupFilterOperator.LastXDays; gfc.ConditionParameter = "10"; gf.Conditions.Add(gfc); gf.EvaluateAnimeGroups(); gf.EvaluateAnimeSeries(); repFilters.Save(gf); // Newly Airing Series gf = new GroupFilter(); gf.GroupFilterName = JMMServer.Properties.Resources.Filter_Airing; gf.ApplyToSeries = 0; gf.BaseCondition = 1; gf.Locked = 0; gf.FilterType = (int)GroupFilterType.UserDefined; gfc = new GroupFilterCondition(); gfc.ConditionType = (int)GroupFilterConditionType.AirDate; gfc.ConditionOperator = (int)GroupFilterOperator.LastXDays; gfc.ConditionParameter = "30"; gf.Conditions.Add(gfc); gf.EvaluateAnimeGroups(); gf.EvaluateAnimeSeries(); repFilters.Save(gf); // Votes Needed gf = new GroupFilter(); gf.GroupFilterName = JMMServer.Properties.Resources.Filter_Votes; gf.ApplyToSeries = 0; gf.BaseCondition = 1; gf.Locked = 0; gf.FilterType = (int)GroupFilterType.UserDefined; gfc = new GroupFilterCondition(); gfc.ConditionType = (int)GroupFilterConditionType.CompletedSeries; gfc.ConditionOperator = (int)GroupFilterOperator.Include; gfc.ConditionParameter = ""; gf.Conditions.Add(gfc); gfc = new GroupFilterCondition(); gfc.ConditionType = (int)GroupFilterConditionType.HasUnwatchedEpisodes; gfc.ConditionOperator = (int)GroupFilterOperator.Exclude; gfc.ConditionParameter = ""; gf.Conditions.Add(gfc); gfc = new GroupFilterCondition(); gfc.ConditionType = (int)GroupFilterConditionType.UserVotedAny; gfc.ConditionOperator = (int)GroupFilterOperator.Exclude; gfc.ConditionParameter = ""; gf.Conditions.Add(gfc); gf.EvaluateAnimeGroups(); gf.EvaluateAnimeSeries(); repFilters.Save(gf); // Recently Watched gf = new GroupFilter(); gf.GroupFilterName = JMMServer.Properties.Resources.Filter_RecentlyWatched; gf.ApplyToSeries = 0; gf.BaseCondition = 1; gf.Locked = 0; gf.FilterType = (int)GroupFilterType.UserDefined; gfc = new GroupFilterCondition(); gfc.ConditionType = (int)GroupFilterConditionType.EpisodeWatchedDate; gfc.ConditionOperator = (int)GroupFilterOperator.LastXDays; gfc.ConditionParameter = "10"; gf.Conditions.Add(gfc); gf.EvaluateAnimeGroups(); gf.EvaluateAnimeSeries(); repFilters.Save(gf); // TvDB/MovieDB Link Missing gf = new GroupFilter(); gf.GroupFilterName = JMMServer.Properties.Resources.Filter_LinkMissing; gf.ApplyToSeries = 0; gf.BaseCondition = 1; gf.Locked = 0; gf.FilterType = (int)GroupFilterType.UserDefined; gfc = new GroupFilterCondition(); gfc.ConditionType = (int)GroupFilterConditionType.AssignedTvDBOrMovieDBInfo; gfc.ConditionOperator = (int)GroupFilterOperator.Exclude; gfc.ConditionParameter = ""; gf.Conditions.Add(gfc); gf.EvaluateAnimeGroups(); gf.EvaluateAnimeSeries(); repFilters.Save(gf); }
//TODO Cleanup function for Empty Tags and Empty Years public static void CreateOrVerifyLockedFilters() { GroupFilterRepository repFilters = new GroupFilterRepository(); using (var session = JMMService.SessionFactory.OpenSession()) { string t = "GroupFilter"; List <GroupFilter> lockedGFs = repFilters.GetLockedGroupFilters(session); //Continue Watching // check if it already exists ServerState.Instance.CurrentSetupStatus = string.Format(JMMServer.Properties.Resources.Database_Cache, t, " " + Properties.Resources.Filter_CreateContinueWatching); GroupFilter cwatching = lockedGFs.FirstOrDefault( a => a.FilterType == (int)GroupFilterType.ContinueWatching); if (cwatching != null && cwatching.FilterType != (int)GroupFilterType.ContinueWatching) { ServerState.Instance.CurrentSetupStatus = string.Format(JMMServer.Properties.Resources.Database_Cache, t, " " + Properties.Resources.Filter_CreateContinueWatching); cwatching.FilterType = (int)GroupFilterType.ContinueWatching; repFilters.Save(cwatching); } else if (cwatching == null) { ServerState.Instance.CurrentSetupStatus = string.Format(JMMServer.Properties.Resources.Database_Cache, t, " " + Properties.Resources.Filter_CreateContinueWatching); GroupFilter gf = new GroupFilter(); gf.GroupFilterName = Constants.GroupFilterName.ContinueWatching; gf.Locked = 1; gf.SortingCriteria = "4;2"; // by last watched episode desc gf.ApplyToSeries = 0; gf.BaseCondition = 1; // all gf.FilterType = (int)GroupFilterType.ContinueWatching; gf.InvisibleInClients = 0; gf.Conditions = new List <GroupFilterCondition>(); GroupFilterCondition gfc = new GroupFilterCondition(); gfc.ConditionType = (int)GroupFilterConditionType.HasWatchedEpisodes; gfc.ConditionOperator = (int)GroupFilterOperator.Include; gfc.ConditionParameter = ""; gfc.GroupFilterID = gf.GroupFilterID; gf.Conditions.Add(gfc); gfc = new GroupFilterCondition(); gfc.ConditionType = (int)GroupFilterConditionType.HasUnwatchedEpisodes; gfc.ConditionOperator = (int)GroupFilterOperator.Include; gfc.ConditionParameter = ""; gfc.GroupFilterID = gf.GroupFilterID; gf.Conditions.Add(gfc); gf.EvaluateAnimeGroups(); gf.EvaluateAnimeSeries(); repFilters.Save(gf); //Get ID } //Create All filter GroupFilter allfilter = lockedGFs.FirstOrDefault(a => a.FilterType == (int)GroupFilterType.All); if (allfilter == null) { ServerState.Instance.CurrentSetupStatus = string.Format(JMMServer.Properties.Resources.Database_Cache, t, " " + Properties.Resources.Filter_CreateAll); GroupFilter gf = new GroupFilter { GroupFilterName = Properties.Resources.Filter_All, Locked = 1, InvisibleInClients = 0, FilterType = (int)GroupFilterType.All, BaseCondition = 1, SortingCriteria = "5;1" }; gf.EvaluateAnimeGroups(); gf.EvaluateAnimeSeries(); repFilters.Save(gf); } GroupFilter tagsdirec = lockedGFs.FirstOrDefault( a => a.FilterType == (int)(GroupFilterType.Directory | GroupFilterType.Tag)); if (tagsdirec == null) { tagsdirec = new GroupFilter { GroupFilterName = Properties.Resources.Filter_Tags, InvisibleInClients = 0, FilterType = (int)(GroupFilterType.Directory | GroupFilterType.Tag), BaseCondition = 1, Locked = 1, SortingCriteria = "13;1" }; repFilters.Save(tagsdirec); } GroupFilter yearsdirec = lockedGFs.FirstOrDefault( a => a.FilterType == (int)(GroupFilterType.Directory | GroupFilterType.Year)); if (yearsdirec == null) { yearsdirec = new GroupFilter { GroupFilterName = Properties.Resources.Filter_Years, InvisibleInClients = 0, FilterType = (int)(GroupFilterType.Directory | GroupFilterType.Year), BaseCondition = 1, Locked = 1, SortingCriteria = "13;1" }; repFilters.Save(yearsdirec); } } CreateOrVerifyTagsAndYearsFilters(true); }