public virtual IndexFolder UpdateQuickList(string recentItemOption) { //rebuild the proper list List <BaseItem> items = null; int containerNo = 0; int maxItems = this.ActualChildren.Count > 0 ? (this.ActualChildren[0] is IContainer || this.ActualChildren[0] is MusicArtist) && Kernel.Instance.ConfigData.RecentItemCollapseThresh <= 6 ? Kernel.Instance.ConfigData.RecentItemContainerCount : Kernel.Instance.ConfigData.RecentItemCount : Kernel.Instance.ConfigData.RecentItemCount; using (new Profiler(string.Format("RAL child retrieval for {0} option {1}", Name, recentItemOption))) { items = GetLatestItems(recentItemOption, maxItems).ToList(); } Logger.ReportVerbose(recentItemOption + " list for " + this.Name + " loaded with " + items.Count + " items."); var folderChildren = new List <BaseItem>(); //now collapse anything that needs to be and create the child list for the list folder var containers = from item in items where item is IGroupInIndex group item by(item as IGroupInIndex).MainContainerId; foreach (var container in containers) { var containerObj = ((IGroupInIndex)container.First()).MainContainer; //Logger.ReportVerbose("Container " + (containerObj == null ? "--Unknown--" : containerObj.Name) + " items: " + container.Count()); if (container.Count() < Kernel.Instance.ConfigData.RecentItemCollapseThresh) { //add the items without rolling up foreach (var i in container) { //make sure any inherited images get loaded var ignore = i.Parent != null ? i.Parent.BackdropImages : null; ignore = i.BackdropImages; var ignore2 = i.LogoImage; ignore2 = i.ArtImage; folderChildren.Add(i); } } else { var currentContainer = containerObj ?? new IndexFolder() { Name = "<Unknown>" }; var currentSeries = currentContainer as Series; containerNo++; var aContainer = new SearchResultFolder(new List <BaseItem>()) { Id = ("container" + recentItemOption + this.Name + this.Path + containerNo).GetMD5(), Name = currentContainer.Name + " (" + container.Count() + " Items)", Overview = currentContainer.Overview, MpaaRating = currentContainer.MpaaRating, Genres = currentContainer.Genres, ImdbRating = currentContainer.ImdbRating, Studios = currentContainer.Studios, PrimaryImagePath = currentContainer.PrimaryImagePath, SecondaryImagePath = currentContainer.SecondaryImagePath, BannerImagePath = currentContainer.BannerImagePath, BackdropImagePaths = currentContainer.BackdropImagePaths, ThemeId = currentSeries != null ? currentSeries.ApiId : null, TVDBSeriesId = currentSeries != null ? currentSeries.TVDBSeriesId : null, LogoImagePath = currentSeries != null ? currentSeries.LogoImagePath : null, ArtImagePath = currentSeries != null ? currentSeries.ArtImagePath : null, ThumbnailImagePath = currentSeries != null ? currentSeries.ThumbnailImagePath : null, DisplayMediaType = currentContainer.DisplayMediaType, DateCreated = container.First().DateCreated, Parent = this }; if (containerObj is Series) { //always roll into seasons var seasons = from episode in container group episode by(episode as Episode).SeasonId; foreach (var season in seasons) { var currentSeason = ((Episode)season.First()).Season; containerNo++; var aSeason = new SearchResultFolder(season.ToList()) { Id = ("season" + recentItemOption + this.Name + this.Path + containerNo).GetMD5(), Name = currentSeason.Name + " (" + season.Count() + " Items)", Overview = currentSeason.Overview, MpaaRating = currentSeason.MpaaRating, Genres = currentSeason.Genres, ImdbRating = currentSeason.ImdbRating, Studios = currentSeason.Studios, PrimaryImagePath = currentSeason.PrimaryImagePath ?? containerObj.PrimaryImagePath, SecondaryImagePath = currentSeason.SecondaryImagePath, BannerImagePath = currentSeason.BannerImagePath ?? containerObj.BannerImagePath, BackdropImagePaths = currentSeason.BackdropImagePaths ?? containerObj.BackdropImagePaths, TVDBSeriesId = currentSeason.TVDBSeriesId, LogoImagePath = currentSeason.LogoImagePath, ArtImagePath = currentSeason.ArtImagePath, ThumbnailImagePath = currentSeason.ThumbnailImagePath, DisplayMediaType = currentSeason.DisplayMediaType, DateCreated = season.First().DateCreated, Parent = currentSeason.Id == aContainer.Id ? this : aContainer }; aContainer.AddChild(aSeason); } } else { //not series so just add all children to container aContainer.AddChildren(container.ToList()); } //and container to children folderChildren.Add(aContainer); } } //finally add all the items that don't go in containers folderChildren.AddRange(items.Where(i => (!(i is IGroupInIndex)))); //and create our quicklist folder return(new IndexFolder(folderChildren) { Id = QuickListID(recentItemOption), Name = "User:" + Kernel.CurrentUser.Name, DateCreated = DateTime.UtcNow, Parent = this }); }
public virtual IndexFolder UpdateQuickList(string recentItemOption) { //rebuild the proper list List <BaseItem> items = null; int containerNo = 0; int maxItems = this.ActualChildren.Count > 0 ? (this.ActualChildren[0] is IContainer || this.ActualChildren[0] is MusicArtist) && Kernel.Instance.ConfigData.RecentItemCollapseThresh <= 6 ? Kernel.Instance.ConfigData.RecentItemContainerCount : Kernel.Instance.ConfigData.RecentItemCount : Kernel.Instance.ConfigData.RecentItemCount; using (new Profiler(string.Format("RAL child retrieval for {0} option {1}", Name, recentItemOption))) { switch (recentItemOption) { case "watched": items = Kernel.Instance.MB3ApiRepository.RetrieveItems(new ItemQuery { UserId = Kernel.CurrentUser.ApiId, ParentId = RalParentId, Limit = maxItems, Recursive = true, ExcludeItemTypes = RalExcludeTypes, IncludeItemTypes = RalIncludeTypes, ExcludeLocationTypes = new[] { LocationType.Virtual }, Fields = MB3ApiRepository.StandardFields, Filters = (new[] { Config.Instance.TreatWatchedAsInProgress?ItemFilter.IsResumable: ItemFilter.IsPlayed, }).Concat(AdditionalRalFilters).ToArray(), SortBy = new[] { ItemSortBy.DatePlayed }, SortOrder = Model.Entities.SortOrder.Descending }).ToList(); break; case "unwatched": items = Kernel.Instance.MB3ApiRepository.RetrieveItems(new ItemQuery { UserId = Kernel.CurrentUser.ApiId, ParentId = RalParentId, Limit = maxItems, Recursive = true, Fields = MB3ApiRepository.StandardFields, ExcludeItemTypes = RalExcludeTypes, IncludeItemTypes = RalIncludeTypes, ExcludeLocationTypes = new[] { LocationType.Virtual }, Filters = (new[] { ItemFilter.IsUnplayed, }).Concat(AdditionalRalFilters).ToArray(), SortBy = new[] { ItemSortBy.DateCreated }, SortOrder = Model.Entities.SortOrder.Descending }).ToList(); break; default: items = Kernel.Instance.MB3ApiRepository.RetrieveItems(new ItemQuery { UserId = Kernel.CurrentUser.ApiId, ParentId = RalParentId, Limit = maxItems, Recursive = true, Filters = AdditionalRalFilters, ExcludeItemTypes = RalExcludeTypes, IncludeItemTypes = RalIncludeTypes, ExcludeLocationTypes = new[] { LocationType.Virtual }, Fields = MB3ApiRepository.StandardFields, SortBy = new[] { ItemSortBy.DateCreated }, SortOrder = Model.Entities.SortOrder.Descending }).ToList(); break; } } Logger.ReportVerbose(recentItemOption + " list for " + this.Name + " loaded with " + items.Count + " items."); var folderChildren = new List <BaseItem>(); //now collapse anything that needs to be and create the child list for the list folder var containers = from item in items where item is IGroupInIndex group item by(item as IGroupInIndex).MainContainer.Id; foreach (var container in containers) { var containerObj = ((IGroupInIndex)container.First()).MainContainer; //Logger.ReportVerbose("Container " + (containerObj == null ? "--Unknown--" : containerObj.Name) + " items: " + container.Count()); if (container.Count() < Kernel.Instance.ConfigData.RecentItemCollapseThresh) { //add the items without rolling up foreach (var i in container) { //make sure any inherited images get loaded var ignore = i.Parent != null ? i.Parent.BackdropImages : null; ignore = i.BackdropImages; var ignore2 = i.LogoImage; ignore2 = i.ArtImage; folderChildren.Add(i); } } else { var currentContainer = containerObj ?? new IndexFolder() { Name = "<Unknown>" }; var currentSeries = currentContainer as Series; containerNo++; var aContainer = new SearchResultFolder(new List <BaseItem>()) { Id = ("container" + recentItemOption + this.Name + this.Path + containerNo).GetMD5(), Name = currentContainer.Name + " (" + container.Count() + " Items)", Overview = currentContainer.Overview, MpaaRating = currentContainer.MpaaRating, Genres = currentContainer.Genres, ImdbRating = currentContainer.ImdbRating, Studios = currentContainer.Studios, PrimaryImagePath = currentContainer.PrimaryImagePath, SecondaryImagePath = currentContainer.SecondaryImagePath, BannerImagePath = currentContainer.BannerImagePath, BackdropImagePaths = currentContainer.BackdropImagePaths, TVDBSeriesId = currentSeries != null ? currentSeries.TVDBSeriesId : null, LogoImagePath = currentSeries != null ? currentSeries.LogoImagePath : null, ArtImagePath = currentSeries != null ? currentSeries.ArtImagePath : null, ThumbnailImagePath = currentSeries != null ? currentSeries.ThumbnailImagePath : null, DisplayMediaType = currentContainer.DisplayMediaType, DateCreated = container.First().DateCreated, Parent = this }; if (containerObj is Series) { //always roll into seasons var seasons = from episode in container group episode by(episode as Episode).Season.Id; foreach (var season in seasons) { var currentSeason = ((Episode)season.First()).Season; containerNo++; var aSeason = new SearchResultFolder(season.ToList()) { Id = ("season" + recentItemOption + this.Name + this.Path + containerNo).GetMD5(), Name = currentSeason.Name + " (" + season.Count() + " Items)", Overview = currentSeason.Overview, MpaaRating = currentSeason.MpaaRating, Genres = currentSeason.Genres, ImdbRating = currentSeason.ImdbRating, Studios = currentSeason.Studios, PrimaryImagePath = currentSeason.PrimaryImagePath, SecondaryImagePath = currentSeason.SecondaryImagePath, BannerImagePath = currentSeason.BannerImagePath, BackdropImagePaths = currentSeason.BackdropImagePaths, TVDBSeriesId = currentSeason.TVDBSeriesId, LogoImagePath = currentSeason.LogoImagePath, ArtImagePath = currentSeason.ArtImagePath, ThumbnailImagePath = currentSeason.ThumbnailImagePath, DisplayMediaType = currentSeason.DisplayMediaType, DateCreated = season.First().DateCreated, Parent = currentSeason.Id == aContainer.Id ? this : aContainer }; aContainer.AddChild(aSeason); } } else { //not series so just add all children to container aContainer.AddChildren(container.ToList()); } //and container to children folderChildren.Add(aContainer); } } //finally add all the items that don't go in containers folderChildren.AddRange(items.Where(i => (!(i is IGroupInIndex)))); //and create our quicklist folder return(new IndexFolder(folderChildren) { Id = QuickListID(recentItemOption), Name = "User:" + Kernel.CurrentUser.Name, DateCreated = DateTime.UtcNow, Parent = this }); }