public void Save(AnimeGroup_User obj) { using (var session = JMMService.SessionFactory.OpenSession()) { // populate the database using (var transaction = session.BeginTransaction()) { session.SaveOrUpdate(obj); transaction.Commit(); } } //logger.Trace("Updating group stats by group from AnimeGroup_UserRepository.Save: {0}", obj.AnimeGroupID); //StatsCache.Instance.UpdateUsingGroup(obj.AnimeGroupID); logger.Trace("Updating group filter stats by animegroup from AnimeGroup_UserRepository.Save: {0}", obj.AnimeGroupID); StatsCache.Instance.UpdateGroupFilterUsingGroup(obj.AnimeGroupID); }
public bool AllowedGroup(AnimeGroup grp, AnimeGroup_User userRec) { if (string.IsNullOrEmpty(HideCategories)) { return(true); } string[] cats = HideCategories.ToLower().Split(','); string[] animeCats = grp.ToContract(userRec).Stat_AllTags.ToLower().Split('|'); foreach (string cat in cats) { if (!string.IsNullOrEmpty(cat.Trim()) && animeCats.Contains(cat.Trim())) { return(false); } } return(true); }
public static HashSet <GroupFilterConditionType> GetConditionTypesChanged(AnimeGroup_User oldcontract, AnimeGroup_User newcontract) { HashSet <GroupFilterConditionType> h = new HashSet <GroupFilterConditionType>(); if (oldcontract == null || oldcontract.UnwatchedEpisodeCount > 0 != newcontract.UnwatchedEpisodeCount > 0) { h.Add(GroupFilterConditionType.HasUnwatchedEpisodes); } if (oldcontract == null || oldcontract.IsFave != newcontract.IsFave) { h.Add(GroupFilterConditionType.Favourite); } if (oldcontract == null || oldcontract.WatchedDate != newcontract.WatchedDate) { h.Add(GroupFilterConditionType.EpisodeWatchedDate); } if (oldcontract == null || oldcontract.WatchedEpisodeCount > 0 != newcontract.WatchedEpisodeCount > 0) { h.Add(GroupFilterConditionType.HasWatchedEpisodes); } return(h); }
public static HashSet<GroupFilterConditionType> GetConditionTypesChanged(AnimeGroup_User oldcontract, AnimeGroup_User newcontract) { HashSet<GroupFilterConditionType> h = new HashSet<GroupFilterConditionType>(); if (oldcontract == null || oldcontract.UnwatchedEpisodeCount > 0 != newcontract.UnwatchedEpisodeCount > 0) h.Add(GroupFilterConditionType.HasUnwatchedEpisodes); if (oldcontract == null || oldcontract.IsFave != newcontract.IsFave) h.Add(GroupFilterConditionType.Favourite); if (oldcontract == null || oldcontract.WatchedDate != newcontract.WatchedDate) h.Add(GroupFilterConditionType.EpisodeWatchedDate); if (oldcontract == null || oldcontract.WatchedEpisodeCount > 0 != newcontract.WatchedEpisodeCount > 0) h.Add(GroupFilterConditionType.HasWatchedEpisodes); return h; }
public Contract_AnimeGroup_SaveResponse SaveGroup(Contract_AnimeGroup_Save contract, int userID) { Contract_AnimeGroup_SaveResponse contractout = new Contract_AnimeGroup_SaveResponse(); contractout.ErrorMessage = ""; contractout.AnimeGroup = null; try { AnimeGroupRepository repGroup = new AnimeGroupRepository(); AnimeGroup grp = null; if (contract.AnimeGroupID.HasValue) { grp = repGroup.GetByID(contract.AnimeGroupID.Value); if (grp == null) { contractout.ErrorMessage = "Could not find existing group with ID: " + contract.AnimeGroupID.Value.ToString(); return contractout; } } else { grp = new AnimeGroup(); grp.Description = ""; grp.IsManuallyNamed = 0; grp.DateTimeCreated = DateTime.Now; grp.DateTimeUpdated = DateTime.Now; grp.SortName = ""; grp.MissingEpisodeCount = 0; grp.MissingEpisodeCountGroups = 0; grp.OverrideDescription = 0; } if (string.IsNullOrEmpty(contract.GroupName)) { contractout.ErrorMessage = "Must specify a group name"; return contractout; } grp.AnimeGroupParentID = contract.AnimeGroupParentID; grp.Description = contract.Description; grp.GroupName = contract.GroupName; grp.IsManuallyNamed = contract.IsManuallyNamed; grp.OverrideDescription = 0; if (string.IsNullOrEmpty(contract.SortName)) grp.SortName = contract.GroupName; else grp.SortName = contract.SortName; repGroup.Save(grp); AnimeGroup_User userRecord = grp.GetUserRecord(userID); if (userRecord == null) userRecord = new AnimeGroup_User(userID, grp.AnimeGroupID); userRecord.IsFave = contract.IsFave; AnimeGroup_UserRepository repUserRecords = new AnimeGroup_UserRepository(); repUserRecords.Save(userRecord); Contract_AnimeGroup contractGrp = grp.ToContract(grp.GetUserRecord(userID)); contractout.AnimeGroup = contractGrp; return contractout; } catch (Exception ex) { logger.ErrorException(ex.ToString(), ex); contractout.ErrorMessage = ex.Message; return contractout; } }
public bool AllowedGroup(AnimeGroup grp, AnimeGroup_User userRec) { if (grp.AnimeGroupID == 266) Console.Write(""); if (string.IsNullOrEmpty(HideCategories)) return true; string[] cats = HideCategories.ToLower().Split(','); string[] animeCats = grp.ToContract(userRec).Stat_AllCategories.ToLower().Split('|'); foreach (string cat in cats) { if (!string.IsNullOrEmpty(cat) && animeCats.Contains(cat)) { return false; } } return true; }
/// <summary> /// Update the stats for this group based on the child series /// Assumes that all the AnimeSeries have had their stats updated already /// </summary> public void UpdateStats(bool watchedStats, bool missingEpsStats) { List<AnimeSeries> seriesList = GetAllSeries(); JMMUserRepository repUsers = new JMMUserRepository(); List<JMMUser> allUsers = repUsers.GetAll(); if (watchedStats) { foreach (JMMUser juser in allUsers) { AnimeGroup_User userRecord = GetUserRecord(juser.JMMUserID); if (userRecord == null) userRecord = new AnimeGroup_User(juser.JMMUserID, this.AnimeGroupID); // reset stats userRecord.WatchedCount = 0; userRecord.UnwatchedEpisodeCount = 0; userRecord.PlayedCount = 0; userRecord.StoppedCount = 0; userRecord.WatchedEpisodeCount = 0; userRecord.WatchedDate = null; foreach (AnimeSeries ser in seriesList) { AnimeSeries_User serUserRecord = ser.GetUserRecord(juser.JMMUserID); if (serUserRecord != null) { userRecord.WatchedCount += serUserRecord.WatchedCount; userRecord.UnwatchedEpisodeCount += serUserRecord.UnwatchedEpisodeCount; userRecord.PlayedCount += serUserRecord.PlayedCount; userRecord.StoppedCount += serUserRecord.StoppedCount; userRecord.WatchedEpisodeCount += serUserRecord.WatchedEpisodeCount; if (serUserRecord.WatchedDate.HasValue) { if (userRecord.WatchedDate.HasValue) { if (serUserRecord.WatchedDate > userRecord.WatchedDate) userRecord.WatchedDate = serUserRecord.WatchedDate; } else userRecord.WatchedDate = serUserRecord.WatchedDate; } } } // now update the stats for the groups logger.Trace("Updating stats for {0}", this.ToString()); AnimeGroup_UserRepository rep = new AnimeGroup_UserRepository(); rep.Save(userRecord); } } if (missingEpsStats) { this.MissingEpisodeCount = 0; this.MissingEpisodeCountGroups = 0; foreach (AnimeSeries ser in seriesList) { this.MissingEpisodeCount += ser.MissingEpisodeCount; this.MissingEpisodeCountGroups += ser.MissingEpisodeCountGroups; } AnimeGroupRepository repGrp = new AnimeGroupRepository(); repGrp.Save(this); } }
public Contract_AnimeGroup ToContract(AnimeGroup_User userRecord) { Contract_AnimeGroup contract = new Contract_AnimeGroup(); contract.AnimeGroupID = this.AnimeGroupID; contract.AnimeGroupParentID = this.AnimeGroupParentID; contract.DefaultAnimeSeriesID = this.DefaultAnimeSeriesID; contract.GroupName = this.GroupName; contract.Description = this.Description; contract.SortName = this.SortName; contract.EpisodeAddedDate = this.EpisodeAddedDate; contract.OverrideDescription = this.OverrideDescription; contract.DateTimeUpdated = this.DateTimeUpdated; if (userRecord == null) { contract.IsFave = 0; contract.UnwatchedEpisodeCount = 0; contract.WatchedEpisodeCount = 0; contract.WatchedDate = null; contract.PlayedCount = 0; contract.WatchedCount = 0; contract.StoppedCount = 0; } else { contract.IsFave = userRecord.IsFave; contract.UnwatchedEpisodeCount = userRecord.UnwatchedEpisodeCount; contract.WatchedEpisodeCount = userRecord.WatchedEpisodeCount; contract.WatchedDate = userRecord.WatchedDate; contract.PlayedCount = userRecord.PlayedCount; contract.WatchedCount = userRecord.WatchedCount; contract.StoppedCount = userRecord.StoppedCount; } contract.MissingEpisodeCount = this.MissingEpisodeCount; contract.MissingEpisodeCountGroups = this.MissingEpisodeCountGroups; if (StatsCache.Instance.StatGroupAudioLanguages.ContainsKey(this.AnimeGroupID)) contract.Stat_AudioLanguages = StatsCache.Instance.StatGroupAudioLanguages[this.AnimeGroupID]; else contract.Stat_AudioLanguages = ""; if (StatsCache.Instance.StatGroupSubtitleLanguages.ContainsKey(this.AnimeGroupID)) contract.Stat_SubtitleLanguages = StatsCache.Instance.StatGroupSubtitleLanguages[this.AnimeGroupID]; else contract.Stat_SubtitleLanguages = ""; if (StatsCache.Instance.StatGroupVideoQuality.ContainsKey(this.AnimeGroupID)) contract.Stat_AllVideoQuality = StatsCache.Instance.StatGroupVideoQuality[this.AnimeGroupID]; else contract.Stat_AllVideoQuality = ""; if (StatsCache.Instance.StatGroupVideoQualityEpisodes.ContainsKey(this.AnimeGroupID)) contract.Stat_AllVideoQuality_Episodes = StatsCache.Instance.StatGroupVideoQualityEpisodes[this.AnimeGroupID]; else contract.Stat_AllVideoQuality_Episodes = ""; if (StatsCache.Instance.StatGroupIsComplete.ContainsKey(this.AnimeGroupID)) contract.Stat_IsComplete = StatsCache.Instance.StatGroupIsComplete[this.AnimeGroupID]; else contract.Stat_IsComplete = false; if (StatsCache.Instance.StatGroupHasTvDB.ContainsKey(this.AnimeGroupID)) contract.Stat_HasTvDBLink = StatsCache.Instance.StatGroupHasTvDB[this.AnimeGroupID]; else contract.Stat_HasTvDBLink = false; if (StatsCache.Instance.StatGroupHasMAL.ContainsKey(this.AnimeGroupID)) contract.Stat_HasMALLink = StatsCache.Instance.StatGroupHasMAL[this.AnimeGroupID]; else contract.Stat_HasMALLink = false; if (StatsCache.Instance.StatGroupHasMovieDB.ContainsKey(this.AnimeGroupID)) contract.Stat_HasMovieDBLink = StatsCache.Instance.StatGroupHasMovieDB[this.AnimeGroupID]; else contract.Stat_HasMovieDBLink = false; if (StatsCache.Instance.StatGroupHasMovieDBOrTvDB.ContainsKey(this.AnimeGroupID)) contract.Stat_HasMovieDBOrTvDBLink = StatsCache.Instance.StatGroupHasMovieDBOrTvDB[this.AnimeGroupID]; else contract.Stat_HasMovieDBOrTvDBLink = false; if (StatsCache.Instance.StatGroupIsFinishedAiring.ContainsKey(this.AnimeGroupID)) contract.Stat_HasFinishedAiring = StatsCache.Instance.StatGroupIsFinishedAiring[this.AnimeGroupID]; else contract.Stat_HasFinishedAiring = false; if (StatsCache.Instance.StatGroupIsCurrentlyAiring.ContainsKey(this.AnimeGroupID)) contract.Stat_IsCurrentlyAiring = StatsCache.Instance.StatGroupIsCurrentlyAiring[this.AnimeGroupID]; else contract.Stat_IsCurrentlyAiring = false; if (StatsCache.Instance.StatGroupAirDate_Max.ContainsKey(this.AnimeGroupID)) contract.Stat_AirDate_Max = StatsCache.Instance.StatGroupAirDate_Max[this.AnimeGroupID]; else contract.Stat_AirDate_Max = null; if (StatsCache.Instance.StatGroupAirDate_Min.ContainsKey(this.AnimeGroupID)) contract.Stat_AirDate_Min = StatsCache.Instance.StatGroupAirDate_Min[this.AnimeGroupID]; else contract.Stat_AirDate_Min = null; if (StatsCache.Instance.StatGroupCategories.ContainsKey(this.AnimeGroupID)) contract.Stat_AllCategories = StatsCache.Instance.StatGroupCategories[this.AnimeGroupID]; else contract.Stat_AllCategories = ""; if (StatsCache.Instance.StatGroupEndDate.ContainsKey(this.AnimeGroupID)) contract.Stat_EndDate = StatsCache.Instance.StatGroupEndDate[this.AnimeGroupID]; else contract.Stat_EndDate = null; if (StatsCache.Instance.StatGroupSeriesCreatedDate.ContainsKey(this.AnimeGroupID)) contract.Stat_SeriesCreatedDate = StatsCache.Instance.StatGroupSeriesCreatedDate[this.AnimeGroupID]; else contract.Stat_SeriesCreatedDate = null; if (StatsCache.Instance.StatGroupTitles.ContainsKey(this.AnimeGroupID)) contract.Stat_AllTitles = StatsCache.Instance.StatGroupTitles[this.AnimeGroupID]; else contract.Stat_AllTitles = ""; if (StatsCache.Instance.StatGroupUserVoteOverall.ContainsKey(this.AnimeGroupID)) contract.Stat_UserVoteOverall = StatsCache.Instance.StatGroupUserVoteOverall[this.AnimeGroupID]; else contract.Stat_UserVoteOverall = null; if (StatsCache.Instance.StatGroupUserVotePermanent.ContainsKey(this.AnimeGroupID)) contract.Stat_UserVotePermanent = StatsCache.Instance.StatGroupUserVotePermanent[this.AnimeGroupID]; else contract.Stat_UserVotePermanent = null; if (StatsCache.Instance.StatGroupUserVoteTemporary.ContainsKey(this.AnimeGroupID)) contract.Stat_UserVoteTemporary = StatsCache.Instance.StatGroupUserVoteTemporary[this.AnimeGroupID]; else contract.Stat_UserVoteTemporary = null; if (StatsCache.Instance.StatGroupSeriesCount.ContainsKey(this.AnimeGroupID)) contract.Stat_SeriesCount = StatsCache.Instance.StatGroupSeriesCount[this.AnimeGroupID]; else contract.Stat_SeriesCount = 0; if (StatsCache.Instance.StatGroupEpisodeCount.ContainsKey(this.AnimeGroupID)) contract.Stat_EpisodeCount = StatsCache.Instance.StatGroupEpisodeCount[this.AnimeGroupID]; else contract.Stat_EpisodeCount = 0; if (StatsCache.Instance.StatGroupAniDBRating.ContainsKey(this.AnimeGroupID)) contract.Stat_AniDBRating = StatsCache.Instance.StatGroupAniDBRating[this.AnimeGroupID]; else contract.Stat_AniDBRating = 0; //contract.AniDB_AirDate = this.AirDate; //contract.AniDB_Year = animeRec.Year; return contract; }
public bool EvaluateGroupFilter(GroupFilter gf, AnimeGroup grp, JMMUser curUser, AnimeGroup_User userRec) { // sub groups don't count if (grp.AnimeGroupParentID.HasValue) return false; // make sure the user has not filtered this out if (!curUser.AllowedGroup(grp, userRec)) return false; // first check for anime groups which are included exluded every time foreach (GroupFilterCondition gfc in gf.FilterConditions) { if (gfc.ConditionTypeEnum != GroupFilterConditionType.AnimeGroup) continue; int groupID = 0; int.TryParse(gfc.ConditionParameter, out groupID); if (groupID == 0) break; if (gfc.ConditionOperatorEnum == GroupFilterOperator.Equals) if (groupID == grp.AnimeGroupID) return true; if (gfc.ConditionOperatorEnum == GroupFilterOperator.NotEquals) if (groupID == grp.AnimeGroupID) return false; } NumberStyles style = NumberStyles.Number; CultureInfo culture = CultureInfo.CreateSpecificCulture("en-GB"); if (gf.BaseCondition == (int)GroupFilterBaseCondition.Exclude) return false; Contract_AnimeGroup contractGroup = grp.ToContract(userRec); // now check other conditions foreach (GroupFilterCondition gfc in gf.FilterConditions) { switch (gfc.ConditionTypeEnum) { case GroupFilterConditionType.Favourite: if (userRec == null) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.Include && userRec.IsFave == 0) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.Exclude && userRec.IsFave == 1) return false; break; case GroupFilterConditionType.MissingEpisodes: if (gfc.ConditionOperatorEnum == GroupFilterOperator.Include && grp.HasMissingEpisodesAny == false) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.Exclude && grp.HasMissingEpisodesAny == true) return false; break; case GroupFilterConditionType.MissingEpisodesCollecting: if (gfc.ConditionOperatorEnum == GroupFilterOperator.Include && grp.HasMissingEpisodesGroups == false) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.Exclude && grp.HasMissingEpisodesGroups == true) return false; break; case GroupFilterConditionType.HasWatchedEpisodes: if (userRec == null) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.Include && userRec.AnyFilesWatched == false) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.Exclude && userRec.AnyFilesWatched == true) return false; break; case GroupFilterConditionType.HasUnwatchedEpisodes: if (userRec == null) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.Include && userRec.HasUnwatchedFiles == false) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.Exclude && userRec.HasUnwatchedFiles == true) return false; break; case GroupFilterConditionType.AssignedTvDBInfo: if (gfc.ConditionOperatorEnum == GroupFilterOperator.Include && contractGroup.Stat_HasTvDBLink == false) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.Exclude && contractGroup.Stat_HasTvDBLink == true) return false; break; case GroupFilterConditionType.AssignedMALInfo: if (gfc.ConditionOperatorEnum == GroupFilterOperator.Include && contractGroup.Stat_HasMALLink == false) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.Exclude && contractGroup.Stat_HasMALLink == true) return false; break; case GroupFilterConditionType.AssignedMovieDBInfo: if (gfc.ConditionOperatorEnum == GroupFilterOperator.Include && contractGroup.Stat_HasMovieDBLink == false) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.Exclude && contractGroup.Stat_HasMovieDBLink == true) return false; break; case GroupFilterConditionType.AssignedTvDBOrMovieDBInfo: if (gfc.ConditionOperatorEnum == GroupFilterOperator.Include && contractGroup.Stat_HasMovieDBOrTvDBLink == false) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.Exclude && contractGroup.Stat_HasMovieDBOrTvDBLink == true) return false; break; case GroupFilterConditionType.CompletedSeries: /*if (grp.IsComplete != grp.Stat_IsComplete) { Debug.Print("IsComplete DIFF {0}", grp.GroupName); }*/ if (gfc.ConditionOperatorEnum == GroupFilterOperator.Include && contractGroup.Stat_IsComplete == false) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.Exclude && contractGroup.Stat_IsComplete == true) return false; break; case GroupFilterConditionType.FinishedAiring: if (gfc.ConditionOperatorEnum == GroupFilterOperator.Include && contractGroup.Stat_HasFinishedAiring == false) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.Exclude && contractGroup.Stat_IsCurrentlyAiring == false) return false; break; case GroupFilterConditionType.UserVoted: if (gfc.ConditionOperatorEnum == GroupFilterOperator.Include && contractGroup.Stat_UserVotePermanent.HasValue == false) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.Exclude && contractGroup.Stat_UserVotePermanent.HasValue == true) return false; break; case GroupFilterConditionType.UserVotedAny: if (gfc.ConditionOperatorEnum == GroupFilterOperator.Include && contractGroup.Stat_UserVoteOverall.HasValue == false) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.Exclude && contractGroup.Stat_UserVoteOverall.HasValue == true) return false; break; case GroupFilterConditionType.AirDate: DateTime filterDate; if (gfc.ConditionOperatorEnum == GroupFilterOperator.LastXDays) { int days = 0; int.TryParse(gfc.ConditionParameter, out days); filterDate = DateTime.Today.AddDays(0 - days); } else filterDate = GetDateFromString(gfc.ConditionParameter); if (gfc.ConditionOperatorEnum == GroupFilterOperator.GreaterThan || gfc.ConditionOperatorEnum == GroupFilterOperator.LastXDays) { if (!contractGroup.Stat_AirDate_Min.HasValue || !contractGroup.Stat_AirDate_Max.HasValue) return false; if (contractGroup.Stat_AirDate_Max.Value < filterDate) return false; } if (gfc.ConditionOperatorEnum == GroupFilterOperator.LessThan) { if (!contractGroup.Stat_AirDate_Min.HasValue || !contractGroup.Stat_AirDate_Max.HasValue) return false; if (contractGroup.Stat_AirDate_Min.Value > filterDate) return false; } break; case GroupFilterConditionType.SeriesCreatedDate: DateTime filterDateSeries; if (gfc.ConditionOperatorEnum == GroupFilterOperator.LastXDays) { int days = 0; int.TryParse(gfc.ConditionParameter, out days); filterDateSeries = DateTime.Today.AddDays(0 - days); } else filterDateSeries = GetDateFromString(gfc.ConditionParameter); if (gfc.ConditionOperatorEnum == GroupFilterOperator.GreaterThan || gfc.ConditionOperatorEnum == GroupFilterOperator.LastXDays) { if (!contractGroup.Stat_SeriesCreatedDate.HasValue) return false; if (contractGroup.Stat_SeriesCreatedDate.Value < filterDateSeries) return false; } if (gfc.ConditionOperatorEnum == GroupFilterOperator.LessThan) { if (!contractGroup.Stat_SeriesCreatedDate.HasValue) return false; if (contractGroup.Stat_SeriesCreatedDate.Value > filterDateSeries) return false; } break; case GroupFilterConditionType.EpisodeWatchedDate: DateTime filterDateEpsiodeWatched; if (gfc.ConditionOperatorEnum == GroupFilterOperator.LastXDays) { int days = 0; int.TryParse(gfc.ConditionParameter, out days); filterDateEpsiodeWatched = DateTime.Today.AddDays(0 - days); } else filterDateEpsiodeWatched = GetDateFromString(gfc.ConditionParameter); if (gfc.ConditionOperatorEnum == GroupFilterOperator.GreaterThan || gfc.ConditionOperatorEnum == GroupFilterOperator.LastXDays) { if (userRec == null) return false; if (!userRec.WatchedDate.HasValue) return false; if (userRec.WatchedDate.Value < filterDateEpsiodeWatched) return false; } if (gfc.ConditionOperatorEnum == GroupFilterOperator.LessThan) { if (userRec == null) return false; if (!userRec.WatchedDate.HasValue) return false; if (userRec.WatchedDate.Value > filterDateEpsiodeWatched) return false; } break; case GroupFilterConditionType.EpisodeAddedDate: DateTime filterDateEpisodeAdded; if (gfc.ConditionOperatorEnum == GroupFilterOperator.LastXDays) { int days = 0; int.TryParse(gfc.ConditionParameter, out days); filterDateEpisodeAdded = DateTime.Today.AddDays(0 - days); } else filterDateEpisodeAdded = GetDateFromString(gfc.ConditionParameter); if (gfc.ConditionOperatorEnum == GroupFilterOperator.GreaterThan || gfc.ConditionOperatorEnum == GroupFilterOperator.LastXDays) { if (!grp.EpisodeAddedDate.HasValue) return false; if (grp.EpisodeAddedDate.Value < filterDateEpisodeAdded) return false; } if (gfc.ConditionOperatorEnum == GroupFilterOperator.LessThan) { if (!grp.EpisodeAddedDate.HasValue) return false; if (grp.EpisodeAddedDate.Value > filterDateEpisodeAdded) return false; } break; case GroupFilterConditionType.EpisodeCount: int epCount = -1; int.TryParse(gfc.ConditionParameter, out epCount); if (gfc.ConditionOperatorEnum == GroupFilterOperator.GreaterThan && contractGroup.Stat_EpisodeCount < epCount) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.LessThan && contractGroup.Stat_EpisodeCount > epCount) return false; break; case GroupFilterConditionType.AniDBRating: decimal dRating = -1; decimal.TryParse(gfc.ConditionParameter, style, culture, out dRating); decimal thisRating = contractGroup.Stat_AniDBRating / (decimal)100; if (gfc.ConditionOperatorEnum == GroupFilterOperator.GreaterThan && thisRating < dRating) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.LessThan && thisRating > dRating) return false; break; case GroupFilterConditionType.UserRating: if (!contractGroup.Stat_UserVoteOverall.HasValue) return false; decimal dUserRating = -1; decimal.TryParse(gfc.ConditionParameter, style, culture, out dUserRating); if (gfc.ConditionOperatorEnum == GroupFilterOperator.GreaterThan && contractGroup.Stat_UserVoteOverall.Value < dUserRating) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.LessThan && contractGroup.Stat_UserVoteOverall.Value > dUserRating) return false; break; case GroupFilterConditionType.Category: string filterParm = gfc.ConditionParameter.Trim(); string[] cats = filterParm.Split(','); bool foundCat = false; int index = 0; foreach (string cat in cats) { if (cat.Trim().Length == 0) continue; if (cat.Trim() == ",") continue; index = contractGroup.Stat_AllCategories.IndexOf(cat, 0, StringComparison.InvariantCultureIgnoreCase); if (index > -1) { foundCat = true; break; } } if (gfc.ConditionOperatorEnum == GroupFilterOperator.In) if (!foundCat) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.NotIn) if (foundCat) return false; break; case GroupFilterConditionType.AnimeType: filterParm = gfc.ConditionParameter.Trim(); List<string> grpTypeList = grp.AnimeTypesList; string[] atypes = filterParm.Split(','); bool foundAnimeType = false; index = 0; foreach (string atype in atypes) { if (atype.Trim().Length == 0) continue; if (atype.Trim() == ",") continue; foreach (string thisAType in grpTypeList) { if (string.Equals(thisAType, atype, StringComparison.InvariantCultureIgnoreCase)) { foundAnimeType = true; break; } } } if (gfc.ConditionOperatorEnum == GroupFilterOperator.In) if (!foundAnimeType) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.NotIn) if (foundAnimeType) return false; break; case GroupFilterConditionType.VideoQuality: filterParm = gfc.ConditionParameter.Trim(); string[] vidQuals = filterParm.Split(','); bool foundVid = false; bool foundVidAllEps = false; index = 0; foreach (string vidq in vidQuals) { if (vidq.Trim().Length == 0) continue; if (vidq.Trim() == ",") continue; index = contractGroup.Stat_AllVideoQuality.IndexOf(vidq, 0, StringComparison.InvariantCultureIgnoreCase); if (index > -1) foundVid = true; index = contractGroup.Stat_AllVideoQuality_Episodes.IndexOf(vidq, 0, StringComparison.InvariantCultureIgnoreCase); if (index > -1) foundVidAllEps = true; } if (gfc.ConditionOperatorEnum == GroupFilterOperator.In) if (!foundVid) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.NotIn) if (foundVid) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.InAllEpisodes) if (!foundVidAllEps) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.NotInAllEpisodes) if (foundVidAllEps) return false; break; case GroupFilterConditionType.AudioLanguage: case GroupFilterConditionType.SubtitleLanguage: filterParm = gfc.ConditionParameter.Trim(); string[] languages = filterParm.Split(','); bool foundLan = false; index = 0; foreach (string lanName in languages) { if (lanName.Trim().Length == 0) continue; if (lanName.Trim() == ",") continue; if (gfc.ConditionTypeEnum == GroupFilterConditionType.AudioLanguage) index = contractGroup.Stat_AudioLanguages.IndexOf(lanName, 0, StringComparison.InvariantCultureIgnoreCase); if (gfc.ConditionTypeEnum == GroupFilterConditionType.SubtitleLanguage) index = contractGroup.Stat_SubtitleLanguages.IndexOf(lanName, 0, StringComparison.InvariantCultureIgnoreCase); if (index > -1) foundLan = true; } if (gfc.ConditionOperatorEnum == GroupFilterOperator.In) if (!foundLan) return false; if (gfc.ConditionOperatorEnum == GroupFilterOperator.NotIn) if (foundLan) return false; break; } } return true; }
/// <summary> /// Update the stats for this group based on the child series /// Assumes that all the AnimeSeries have had their stats updated already /// </summary> public void UpdateStats(bool watchedStats, bool missingEpsStats) { List <AnimeSeries> seriesList = GetAllSeries(); JMMUserRepository repUsers = new JMMUserRepository(); List <JMMUser> allUsers = repUsers.GetAll(); if (watchedStats) { foreach (JMMUser juser in allUsers) { AnimeGroup_User userRecord = GetUserRecord(juser.JMMUserID); if (userRecord == null) { userRecord = new AnimeGroup_User(juser.JMMUserID, this.AnimeGroupID); } // reset stats userRecord.WatchedCount = 0; userRecord.UnwatchedEpisodeCount = 0; userRecord.PlayedCount = 0; userRecord.StoppedCount = 0; userRecord.WatchedEpisodeCount = 0; userRecord.WatchedDate = null; foreach (AnimeSeries ser in seriesList) { AnimeSeries_User serUserRecord = ser.GetUserRecord(juser.JMMUserID); if (serUserRecord != null) { userRecord.WatchedCount += serUserRecord.WatchedCount; userRecord.UnwatchedEpisodeCount += serUserRecord.UnwatchedEpisodeCount; userRecord.PlayedCount += serUserRecord.PlayedCount; userRecord.StoppedCount += serUserRecord.StoppedCount; userRecord.WatchedEpisodeCount += serUserRecord.WatchedEpisodeCount; if (serUserRecord.WatchedDate.HasValue) { if (userRecord.WatchedDate.HasValue) { if (serUserRecord.WatchedDate > userRecord.WatchedDate) { userRecord.WatchedDate = serUserRecord.WatchedDate; } } else { userRecord.WatchedDate = serUserRecord.WatchedDate; } } } } // now update the stats for the groups logger.Trace("Updating stats for {0}", this.ToString()); AnimeGroup_UserRepository rep = new AnimeGroup_UserRepository(); rep.Save(userRecord); } } if (missingEpsStats) { this.MissingEpisodeCount = 0; this.MissingEpisodeCountGroups = 0; foreach (AnimeSeries ser in seriesList) { this.MissingEpisodeCount += ser.MissingEpisodeCount; this.MissingEpisodeCountGroups += ser.MissingEpisodeCountGroups; } AnimeGroupRepository repGrp = new AnimeGroupRepository(); repGrp.Save(this); } }
public Contract_AnimeGroup ToContract(AnimeGroup_User userRecord) { Contract_AnimeGroup contract = new Contract_AnimeGroup(); contract.AnimeGroupID = this.AnimeGroupID; contract.AnimeGroupParentID = this.AnimeGroupParentID; contract.DefaultAnimeSeriesID = this.DefaultAnimeSeriesID; contract.GroupName = this.GroupName; contract.Description = this.Description; contract.SortName = this.SortName; contract.EpisodeAddedDate = this.EpisodeAddedDate; contract.OverrideDescription = this.OverrideDescription; contract.DateTimeUpdated = this.DateTimeUpdated; if (userRecord == null) { contract.IsFave = 0; contract.UnwatchedEpisodeCount = 0; contract.WatchedEpisodeCount = 0; contract.WatchedDate = null; contract.PlayedCount = 0; contract.WatchedCount = 0; contract.StoppedCount = 0; } else { contract.IsFave = userRecord.IsFave; contract.UnwatchedEpisodeCount = userRecord.UnwatchedEpisodeCount; contract.WatchedEpisodeCount = userRecord.WatchedEpisodeCount; contract.WatchedDate = userRecord.WatchedDate; contract.PlayedCount = userRecord.PlayedCount; contract.WatchedCount = userRecord.WatchedCount; contract.StoppedCount = userRecord.StoppedCount; } contract.MissingEpisodeCount = this.MissingEpisodeCount; contract.MissingEpisodeCountGroups = this.MissingEpisodeCountGroups; if (StatsCache.Instance.StatGroupAudioLanguages.ContainsKey(this.AnimeGroupID)) { contract.Stat_AudioLanguages = StatsCache.Instance.StatGroupAudioLanguages[this.AnimeGroupID]; } else { contract.Stat_AudioLanguages = ""; } if (StatsCache.Instance.StatGroupSubtitleLanguages.ContainsKey(this.AnimeGroupID)) { contract.Stat_SubtitleLanguages = StatsCache.Instance.StatGroupSubtitleLanguages[this.AnimeGroupID]; } else { contract.Stat_SubtitleLanguages = ""; } if (StatsCache.Instance.StatGroupVideoQuality.ContainsKey(this.AnimeGroupID)) { contract.Stat_AllVideoQuality = StatsCache.Instance.StatGroupVideoQuality[this.AnimeGroupID]; } else { contract.Stat_AllVideoQuality = ""; } if (StatsCache.Instance.StatGroupVideoQualityEpisodes.ContainsKey(this.AnimeGroupID)) { contract.Stat_AllVideoQuality_Episodes = StatsCache.Instance.StatGroupVideoQualityEpisodes[this.AnimeGroupID]; } else { contract.Stat_AllVideoQuality_Episodes = ""; } if (StatsCache.Instance.StatGroupIsComplete.ContainsKey(this.AnimeGroupID)) { contract.Stat_IsComplete = StatsCache.Instance.StatGroupIsComplete[this.AnimeGroupID]; } else { contract.Stat_IsComplete = false; } if (StatsCache.Instance.StatGroupHasTvDB.ContainsKey(this.AnimeGroupID)) { contract.Stat_HasTvDBLink = StatsCache.Instance.StatGroupHasTvDB[this.AnimeGroupID]; } else { contract.Stat_HasTvDBLink = false; } if (StatsCache.Instance.StatGroupHasMAL.ContainsKey(this.AnimeGroupID)) { contract.Stat_HasMALLink = StatsCache.Instance.StatGroupHasMAL[this.AnimeGroupID]; } else { contract.Stat_HasMALLink = false; } if (StatsCache.Instance.StatGroupHasMovieDB.ContainsKey(this.AnimeGroupID)) { contract.Stat_HasMovieDBLink = StatsCache.Instance.StatGroupHasMovieDB[this.AnimeGroupID]; } else { contract.Stat_HasMovieDBLink = false; } if (StatsCache.Instance.StatGroupHasMovieDBOrTvDB.ContainsKey(this.AnimeGroupID)) { contract.Stat_HasMovieDBOrTvDBLink = StatsCache.Instance.StatGroupHasMovieDBOrTvDB[this.AnimeGroupID]; } else { contract.Stat_HasMovieDBOrTvDBLink = false; } if (StatsCache.Instance.StatGroupIsFinishedAiring.ContainsKey(this.AnimeGroupID)) { contract.Stat_HasFinishedAiring = StatsCache.Instance.StatGroupIsFinishedAiring[this.AnimeGroupID]; } else { contract.Stat_HasFinishedAiring = false; } if (StatsCache.Instance.StatGroupIsCurrentlyAiring.ContainsKey(this.AnimeGroupID)) { contract.Stat_IsCurrentlyAiring = StatsCache.Instance.StatGroupIsCurrentlyAiring[this.AnimeGroupID]; } else { contract.Stat_IsCurrentlyAiring = false; } if (StatsCache.Instance.StatGroupAirDate_Max.ContainsKey(this.AnimeGroupID)) { contract.Stat_AirDate_Max = StatsCache.Instance.StatGroupAirDate_Max[this.AnimeGroupID]; } else { contract.Stat_AirDate_Max = null; } if (StatsCache.Instance.StatGroupAirDate_Min.ContainsKey(this.AnimeGroupID)) { contract.Stat_AirDate_Min = StatsCache.Instance.StatGroupAirDate_Min[this.AnimeGroupID]; } else { contract.Stat_AirDate_Min = null; } if (StatsCache.Instance.StatGroupCategories.ContainsKey(this.AnimeGroupID)) { contract.Stat_AllCategories = StatsCache.Instance.StatGroupCategories[this.AnimeGroupID]; } else { contract.Stat_AllCategories = ""; } if (StatsCache.Instance.StatGroupEndDate.ContainsKey(this.AnimeGroupID)) { contract.Stat_EndDate = StatsCache.Instance.StatGroupEndDate[this.AnimeGroupID]; } else { contract.Stat_EndDate = null; } if (StatsCache.Instance.StatGroupSeriesCreatedDate.ContainsKey(this.AnimeGroupID)) { contract.Stat_SeriesCreatedDate = StatsCache.Instance.StatGroupSeriesCreatedDate[this.AnimeGroupID]; } else { contract.Stat_SeriesCreatedDate = null; } if (StatsCache.Instance.StatGroupTitles.ContainsKey(this.AnimeGroupID)) { contract.Stat_AllTitles = StatsCache.Instance.StatGroupTitles[this.AnimeGroupID]; } else { contract.Stat_AllTitles = ""; } if (StatsCache.Instance.StatGroupUserVoteOverall.ContainsKey(this.AnimeGroupID)) { contract.Stat_UserVoteOverall = StatsCache.Instance.StatGroupUserVoteOverall[this.AnimeGroupID]; } else { contract.Stat_UserVoteOverall = null; } if (StatsCache.Instance.StatGroupUserVotePermanent.ContainsKey(this.AnimeGroupID)) { contract.Stat_UserVotePermanent = StatsCache.Instance.StatGroupUserVotePermanent[this.AnimeGroupID]; } else { contract.Stat_UserVotePermanent = null; } if (StatsCache.Instance.StatGroupUserVoteTemporary.ContainsKey(this.AnimeGroupID)) { contract.Stat_UserVoteTemporary = StatsCache.Instance.StatGroupUserVoteTemporary[this.AnimeGroupID]; } else { contract.Stat_UserVoteTemporary = null; } if (StatsCache.Instance.StatGroupSeriesCount.ContainsKey(this.AnimeGroupID)) { contract.Stat_SeriesCount = StatsCache.Instance.StatGroupSeriesCount[this.AnimeGroupID]; } else { contract.Stat_SeriesCount = 0; } if (StatsCache.Instance.StatGroupEpisodeCount.ContainsKey(this.AnimeGroupID)) { contract.Stat_EpisodeCount = StatsCache.Instance.StatGroupEpisodeCount[this.AnimeGroupID]; } else { contract.Stat_EpisodeCount = 0; } if (StatsCache.Instance.StatGroupAniDBRating.ContainsKey(this.AnimeGroupID)) { contract.Stat_AniDBRating = StatsCache.Instance.StatGroupAniDBRating[this.AnimeGroupID]; } else { contract.Stat_AniDBRating = 0; } //contract.AniDB_AirDate = this.AirDate; //contract.AniDB_Year = animeRec.Year; return(contract); }