internal new static Filter GenerateFromGroupFilter(HttpContext ctx, SVR_GroupFilter gf, int uid, bool nocast, bool notag, int level, bool all, bool allpic, int pic, TagFilter.Filter tagfilter) { List <Group> groups = new List <Group>(); Filter filter = new Filter { name = gf.GroupFilterName, id = gf.GroupFilterID, size = 0 }; if (gf.GroupsIds.ContainsKey(uid)) { HashSet <int> groupsh = gf.GroupsIds[uid]; if (groupsh.Count != 0) { filter.size = groupsh.Count; // Populate Random Art List <SVR_AnimeGroup> groupsList; List <SVR_AnimeSeries> arts = null; if (gf.SeriesIds.ContainsKey(uid)) { var seriesList = gf.SeriesIds[uid].Select(Repo.Instance.AnimeSeries.GetByID).ToList(); groupsList = seriesList.Select(a => a.AnimeGroupID).Distinct() .Select(Repo.Instance.AnimeGroup.GetByID).ToList(); if (pic == 1) { arts = seriesList.Where(SeriesHasCompleteArt).Where(a => a != null).ToList(); if (arts.Count == 0) { arts = seriesList.Where(SeriesHasMostlyCompleteArt).Where(a => a != null).ToList(); } if (arts.Count == 0) { arts = seriesList; } } } else { groupsList = new List <SVR_AnimeGroup>(); } if (arts?.Count > 0) { Random rand = new Random(); var anime = arts[rand.Next(arts.Count)]; var fanarts = GetFanartFromSeries(anime); if (fanarts.Any()) { var fanart = fanarts[rand.Next(fanarts.Count)]; filter.art.fanart.Add(new Art { index = 0, url = APIHelper.ConstructImageLinkFromTypeAndId(ctx, (int)ImageEntityType.TvDB_FanArt, fanart.TvDB_ImageFanartID) }); } var banners = GetBannersFromSeries(anime); if (banners.Any()) { var banner = banners[rand.Next(banners.Count)]; filter.art.banner.Add(new Art() { index = 0, url = APIHelper.ConstructImageLinkFromTypeAndId(ctx, (int)ImageEntityType.TvDB_Banner, banner.TvDB_ImageWideBannerID) }); } filter.art.thumb.Add(new Art() { url = APIHelper.ConstructImageLinkFromTypeAndId(ctx, (int)ImageEntityType.AniDB_Cover, anime.AniDB_ID), index = 0 }); } Dictionary <CL_AnimeGroup_User, Group> order = new Dictionary <CL_AnimeGroup_User, Group>(); if (level > 0) { foreach (SVR_AnimeGroup ag in groupsList) { Group group = Group.GenerateFromAnimeGroup(ctx, ag, uid, nocast, notag, (level - 1), all, filter.id, allpic, pic, tagfilter); groups.Add(group); order.Add(ag.GetUserContract(uid), group); } } if (groups.Count > 0) { // Proper Sorting! IEnumerable <CL_AnimeGroup_User> grps = order.Keys; grps = gf.SortCriteriaList.Count != 0 ? GroupFilterHelper.Sort(grps, gf) : grps.OrderBy(a => a.GroupName); groups = grps.Select(a => order[a]).ToList(); filter.groups = groups; } } } filter.viewed = 0; filter.url = APIHelper.ConstructFilterIdUrl(ctx, filter.id); return(filter); }
internal static Filter GenerateFromGroupFilter(NancyContext ctx, SVR_GroupFilter gf, int uid, bool nocast, bool notag, int level, bool all, bool allpic, int pic) { List <Group> groups = new List <Group>(); Filter filter = new Filter { name = gf.GroupFilterName, id = gf.GroupFilterID, size = 0 }; if (gf.GroupsIds.ContainsKey(uid)) { HashSet <int> groupsh = gf.GroupsIds[uid]; if (groupsh.Count != 0) { filter.size = groupsh.Count; // Populate Random Art List <SVR_AnimeGroup> groupsList = groupsh.Select(a => RepoFactory.AnimeGroup.GetByID(a)) .Where(a => a != null) .ToList(); List <Video> arts = groupsList.Select(a => a.GetPlexContract(uid)).Where(contract => { if (!(contract.Fanarts?.Any() ?? false)) { return(false); } if (!(contract.Banners?.Any() ?? false)) { return(false); } return(!string.IsNullOrEmpty(contract.Art)); }).ToList(); if (arts.Count > 0) { Random rand = new Random(); Video art = arts[rand.Next(arts.Count)]; var fanart = art.Fanarts[rand.Next(art.Fanarts.Count)]; filter.art.fanart.Add(new Art() { index = 0, url = APIHelper.ConstructImageLinkFromTypeAndId(ctx, fanart.ImageType, fanart.ImageID) }); var banner = art.Banners[rand.Next(art.Banners.Count)]; filter.art.banner.Add(new Art() { index = 0, url = APIHelper.ConstructImageLinkFromTypeAndId(ctx, banner.ImageType, banner.ImageID) }); filter.art.thumb.Add(new Art() { index = 0, url = APIHelper.ConstructImageLinkFromRest(ctx, art.Thumb) }); } Dictionary <CL_AnimeGroup_User, Group> order = new Dictionary <CL_AnimeGroup_User, Group>(); if (level > 0) { foreach (SVR_AnimeGroup ag in groupsList) { Group group = Group.GenerateFromAnimeGroup(ctx, ag, uid, nocast, notag, (level - 1), all, filter.id, allpic, pic); groups.Add(group); order.Add(ag.GetUserContract(uid), group); } } if (groups.Count > 0) { // Proper Sorting! IEnumerable <CL_AnimeGroup_User> grps = order.Keys; grps = gf.SortCriteriaList.Count != 0 ? GroupFilterHelper.Sort(grps, gf) : grps.OrderBy(a => a.GroupName); groups = grps.Select(a => order[a]).ToList(); filter.groups = groups; } } } filter.viewed = 0; filter.url = APIHelper.ConstructFilterIdUrl(ctx, filter.id); return(filter); }
internal static Filter GenerateFromGroupFilter(NancyContext ctx, SVR_GroupFilter gf, int uid, bool nocast, bool notag, int level, bool all, bool allpic, int pic, byte tagfilter) { List <Group> groups = new List <Group>(); Filter filter = new Filter { name = gf.GroupFilterName, id = gf.GroupFilterID, size = 0 }; if (gf.GroupsIds.ContainsKey(uid)) { HashSet <int> groupsh = gf.GroupsIds[uid]; if (groupsh.Count != 0) { filter.size = groupsh.Count; // Populate Random Art List <SVR_AnimeGroup> groupsList; List <CL_AniDB_Anime> arts; if (gf.ApplyToSeries == 1 && gf.SeriesIds.ContainsKey(uid)) { var seriesList = gf.SeriesIds[uid].Select(RepoFactory.AnimeSeries.GetByID).ToList(); groupsList = seriesList.Select(a => a.AnimeGroupID).Distinct() .Select(RepoFactory.AnimeGroup.GetByID).ToList(); arts = seriesList.Where(SeriesHasCompleteArt).Select(a => a?.GetAnime()?.Contract?.AniDBAnime) .Where(a => a != null).ToList(); if (arts.Count == 0) { arts = seriesList.Where(SeriesHasMostlyCompleteArt) .Select(a => a?.GetAnime()?.Contract?.AniDBAnime).Where(a => a != null).ToList(); } if (arts.Count == 0) { arts = seriesList.Select(a => a?.GetAnime()?.Contract?.AniDBAnime).Where(a => a != null) .ToList(); } } else { groupsList = groupsh.Select(a => RepoFactory.AnimeGroup.GetByID(a)) .Where(a => a != null) .ToList(); arts = groupsList.Where(GroupHasCompleteArt).Select(GetAnimeContractFromGroup).ToList(); if (arts.Count == 0) { arts = groupsList.Where(GroupHasMostlyCompleteArt).Select(GetAnimeContractFromGroup) .ToList(); } if (arts.Count == 0) { arts = groupsList.Where(a => (a.Anime?.Count ?? 0) > 0).Select(GetAnimeContractFromGroup) .ToList(); } } if (arts.Count > 0) { Random rand = new Random(); var anime = arts[rand.Next(arts.Count)]; if (anime.Fanarts?.Count > 0) { var fanart = anime.Fanarts[rand.Next(anime.Fanarts.Count)]; filter.art.fanart.Add(new Art { index = 0, url = APIHelper.ConstructImageLinkFromTypeAndId(ctx, fanart.ImageType, fanart.AniDB_Anime_DefaultImageID) }); } if (anime.Banners?.Count > 0) { var banner = anime.Banners[rand.Next(anime.Banners.Count)]; filter.art.banner.Add(new Art() { index = 0, url = APIHelper.ConstructImageLinkFromTypeAndId(ctx, banner.ImageType, banner.AniDB_Anime_DefaultImageID) }); } filter.art.thumb.Add(new Art() { url = APIHelper.ConstructImageLinkFromTypeAndId(ctx, (int)ImageEntityType.AniDB_Cover, anime.AnimeID), index = 0 }); } Dictionary <CL_AnimeGroup_User, Group> order = new Dictionary <CL_AnimeGroup_User, Group>(); if (level > 0) { foreach (SVR_AnimeGroup ag in groupsList) { Group group = Group.GenerateFromAnimeGroup(ctx, ag, uid, nocast, notag, (level - 1), all, filter.id, allpic, pic, tagfilter); groups.Add(group); order.Add(ag.GetUserContract(uid), group); } } if (groups.Count > 0) { // Proper Sorting! IEnumerable <CL_AnimeGroup_User> grps = order.Keys; grps = gf.SortCriteriaList.Count != 0 ? GroupFilterHelper.Sort(grps, gf) : grps.OrderBy(a => a.GroupName); groups = grps.Select(a => order[a]).ToList(); filter.groups = groups; } } } filter.viewed = 0; filter.url = APIHelper.ConstructFilterIdUrl(ctx, filter.id); return(filter); }
internal static Filter GenerateFromGroupFilter(NancyContext ctx, SVR_GroupFilter gf, int uid, bool nocast, bool notag, int level, bool all) { List <Group> groups = new List <Group>(); Filter filter = new Filter(); filter.name = gf.GroupFilterName; filter.id = gf.GroupFilterID; filter.size = 0; if (gf.GroupsIds.ContainsKey(uid)) { HashSet <int> groupsh = gf.GroupsIds[uid]; if (groupsh.Count != 0) { filter.size = groupsh.Count; int rand_art_iteration = 0; // Populate Random Art while (rand_art_iteration < 3) { int index = new Random().Next(groupsh.Count); SVR_AnimeGroup randGrp = Repositories.RepoFactory.AnimeGroup.GetByID(groupsh.ToList()[index]); Video contract = randGrp?.GetPlexContract(uid); if (contract != null) { Random rand = new Random(); Contract_ImageDetails art = new Contract_ImageDetails(); // contract.Fanarts can be null even if contract isn't if (contract.Fanarts != null && contract.Fanarts.Count > 0) { art = contract.Fanarts[rand.Next(contract.Fanarts.Count)]; filter.art.fanart.Add(new Art() { url = APIHelper.ConstructImageLinkFromTypeAndId(ctx, art.ImageType, art.ImageID), index = 0 }); rand_art_iteration = 3; // we only want banner if we have fanart, other way will desync images if (contract.Banners != null && contract.Banners.Count > 0) { art = contract.Banners[rand.Next(contract.Banners.Count)]; filter.art.banner.Add(new Art() { url = APIHelper.ConstructImageLinkFromTypeAndId(ctx, art.ImageType, art.ImageID), index = 0 }); if (!string.IsNullOrEmpty(contract.Thumb)) { filter.art.thumb.Add(new Art() { url = APIHelper.ConstructImageLinkFromRest(ctx, contract.Thumb), index = 0 }); } } } } rand_art_iteration++; } Dictionary <CL_AnimeGroup_User, Group> order = new Dictionary <CL_AnimeGroup_User, Group>(); if (level > 0) { foreach (int gp in groupsh) { SVR_AnimeGroup ag = Repositories.RepoFactory.AnimeGroup.GetByID(gp); if (ag == null) { continue; } Group group = Group.GenerateFromAnimeGroup(ctx, ag, uid, nocast, notag, (level - 1), all, filter.id); groups.Add(group); order.Add(ag.GetUserContract(uid), group); } } if (groups.Count > 0) { // Proper Sorting! IEnumerable <CL_AnimeGroup_User> grps = order.Keys; grps = gf.SortCriteriaList.Count != 0 ? GroupFilterHelper.Sort(grps, gf) : grps.OrderBy(a => a.GroupName); groups = grps.Select(a => order[a]).ToList(); filter.groups = groups; } } } filter.viewed = 0; filter.url = APIHelper.ConstructFilterIdUrl(ctx, filter.id); return(filter); }