public List<Tuple<BaseItem, List<BaseItem>>> GetLatestItems(LatestItemsQuery request) { var user = _userManager.GetUserById(request.UserId); var includeTypes = request.IncludeItemTypes; var currentUser = user; Func<BaseItem, bool> filter = i => { if (includeTypes.Length > 0) { if (!includeTypes.Contains(i.GetType().Name, StringComparer.OrdinalIgnoreCase)) { return false; } } if (request.IsPlayed.HasValue) { var val = request.IsPlayed.Value; if (i is Video && i.IsPlayed(currentUser) != val) { return false; } } return i.LocationType != LocationType.Virtual && !i.IsFolder; }; // Avoid implicitly captured closure var libraryItems = string.IsNullOrEmpty(request.ParentId) && user != null ? GetItemsConfiguredForLatest(user, filter) : GetAllLibraryItems(request.UserId, _userManager, _libraryManager, request.ParentId, filter); libraryItems = libraryItems.OrderByDescending(i => i.DateCreated); if (request.IsPlayed.HasValue) { var takeLimit = (request.Limit ?? 20) * 20; libraryItems = libraryItems.Take(takeLimit); } // Avoid implicitly captured closure var items = libraryItems .ToList(); var list = new List<Tuple<BaseItem, List<BaseItem>>>(); foreach (var item in items) { // Only grab the index container for media var container = item.IsFolder || !request.GroupItems ? null : item.LatestItemsIndexContainer; if (container == null) { list.Add(new Tuple<BaseItem, List<BaseItem>>(null, new List<BaseItem> { item })); } else { var current = list.FirstOrDefault(i => i.Item1 != null && i.Item1.Id == container.Id); if (current != null) { current.Item2.Add(item); } else { list.Add(new Tuple<BaseItem, List<BaseItem>>(container, new List<BaseItem> { item })); } } if (list.Count >= request.Limit) { break; } } return list; }
public List<Tuple<BaseItem, List<BaseItem>>> GetLatestItems(LatestItemsQuery request) { var user = _userManager.GetUserById(request.UserId); var libraryItems = GetItemsForLatestItems(user, request); var list = new List<Tuple<BaseItem, List<BaseItem>>>(); foreach (var item in libraryItems) { // Only grab the index container for media var container = item.IsFolder || !request.GroupItems ? null : item.LatestItemsIndexContainer; if (container == null) { list.Add(new Tuple<BaseItem, List<BaseItem>>(null, new List<BaseItem> { item })); } else { var current = list.FirstOrDefault(i => i.Item1 != null && i.Item1.Id == container.Id); if (current != null) { current.Item2.Add(item); } else { list.Add(new Tuple<BaseItem, List<BaseItem>>(container, new List<BaseItem> { item })); } } if (list.Count >= request.Limit) { break; } } return list; }
private IEnumerable<BaseItem> GetItemsForLatestItems(User user, LatestItemsQuery request) { var parentId = request.ParentId; var includeItemTypes = request.IncludeItemTypes; var limit = request.Limit ?? 10; var parentIds = string.IsNullOrEmpty(parentId) ? new string[] { } : new[] { parentId }; if (parentIds.Length == 0) { parentIds = user.RootFolder.GetChildren(user, true) .OfType<Folder>() .Select(i => i.Id.ToString("N")) .Where(i => !user.Configuration.LatestItemsExcludes.Contains(i)) .ToArray(); } if (parentIds.Length == 0) { return new List<BaseItem>(); } var excludeItemTypes = includeItemTypes.Length == 0 ? new[] { typeof(Person).Name, typeof(Studio).Name, typeof(Year).Name, typeof(GameGenre).Name, typeof(MusicGenre).Name, typeof(Genre).Name } : new string[] { }; return _libraryManager.GetItemList(new InternalItemsQuery(user) { IncludeItemTypes = includeItemTypes, SortOrder = SortOrder.Descending, SortBy = new[] { ItemSortBy.DateCreated }, IsFolder = includeItemTypes.Length == 0 ? false : (bool?)null, ExcludeItemTypes = excludeItemTypes, ExcludeLocationTypes = new[] { LocationType.Virtual }, Limit = limit * 5, SourceTypes = parentIds.Length == 0 ? new[] { SourceType.Library } : new SourceType[] { }, IsPlayed = request.IsPlayed }, parentIds); }
public List<Tuple<BaseItem, List<BaseItem>>> GetLatestItems(LatestItemsQuery request) { var user = _userManager.GetUserById(request.UserId); var includeTypes = request.IncludeItemTypes; var currentUser = user; var libraryItems = GetItemsForLatestItems(user, request.ParentId, includeTypes, request.Limit ?? 10).Where(i => { if (request.IsPlayed.HasValue) { var val = request.IsPlayed.Value; if (i is Video && i.IsPlayed(currentUser) != val) { return false; } } return true; }); var list = new List<Tuple<BaseItem, List<BaseItem>>>(); foreach (var item in libraryItems) { // Only grab the index container for media var container = item.IsFolder || !request.GroupItems ? null : item.LatestItemsIndexContainer; if (container == null) { list.Add(new Tuple<BaseItem, List<BaseItem>>(null, new List<BaseItem> { item })); } else { var current = list.FirstOrDefault(i => i.Item1 != null && i.Item1.Id == container.Id); if (current != null) { current.Item2.Add(item); } else { list.Add(new Tuple<BaseItem, List<BaseItem>>(container, new List<BaseItem> { item })); } } if (list.Count >= request.Limit) { break; } } return list; }