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); }
private IEnumerable <BaseItem> GetItemsForLatestItems(User user, LatestItemsQuery request) { var parentId = request.ParentId; var includeItemTypes = request.IncludeItemTypes; var limit = request.Limit ?? 10; var parents = new List <BaseItem>(); if (!string.IsNullOrWhiteSpace(parentId)) { var parent = _libraryManager.GetItemById(parentId) as Folder; if (parent != null) { parents.Add(parent); } } if (parents.Count == 0) { parents = user.RootFolder.GetChildren(user, true) .Where(i => i is Folder) .Where(i => !user.Configuration.LatestItemsExcludes.Contains(i.Id.ToString("N"))) .ToList(); } if (parents.Count == 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 = parents.Count == 0 ? new[] { SourceType.Library } : new SourceType[] { }, IsPlayed = request.IsPlayed }, parents)); }
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, ExcludeSourceTypes = parentIds.Length == 0 ? new[] { SourceType.Channel, SourceType.LiveTV } : new SourceType[] { }, IsPlayed = request.IsPlayed }, parentIds)); }
public List <Tuple <BaseItem, List <BaseItem> > > GetLatestItems(LatestItemsQuery request, DtoOptions options) { var user = _userManager.GetUserById(request.UserId); var libraryItems = GetItemsForLatestItems(user, request, options); 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 IReadOnlyList <BaseItem> GetItemsForLatestItems(User user, LatestItemsQuery request, DtoOptions options) { var parentId = request.ParentId; var includeItemTypes = request.IncludeItemTypes; var limit = request.Limit ?? 10; var parents = new List <BaseItem>(); if (!parentId.Equals(Guid.Empty)) { var parentItem = _libraryManager.GetItemById(parentId); if (parentItem is Channel) { return(_channelManager.GetLatestChannelItemsInternal( new InternalItemsQuery(user) { ChannelIds = new[] { parentId }, IsPlayed = request.IsPlayed, StartIndex = request.StartIndex, Limit = request.Limit, IncludeItemTypes = request.IncludeItemTypes, EnableTotalRecordCount = false }, CancellationToken.None).GetAwaiter().GetResult().Items); } if (parentItem is Folder parent) { parents.Add(parent); } } var isPlayed = request.IsPlayed; if (parents.OfType <ICollectionFolder>().Any(i => string.Equals(i.CollectionType, CollectionType.Music, StringComparison.OrdinalIgnoreCase))) { isPlayed = null; } if (parents.Count == 0) { parents = _libraryManager.GetUserRootFolder().GetChildren(user, true) .Where(i => i is Folder) .Where(i => !user.GetPreference(PreferenceKind.LatestItemExcludes) .Contains(i.Id.ToString("N", CultureInfo.InvariantCulture))) .ToList(); } if (parents.Count == 0) { return(new List <BaseItem>()); } if (includeItemTypes.Length == 0) { // Handle situations with the grouping setting, e.g. movies showing up in tv, etc. // Thanks to mixed content libraries included in the UserView var hasCollectionType = parents.OfType <UserView>().ToArray(); if (hasCollectionType.Length > 0) { if (hasCollectionType.All(i => string.Equals(i.CollectionType, CollectionType.Movies, StringComparison.OrdinalIgnoreCase))) { includeItemTypes = new string[] { "Movie" }; } else if (hasCollectionType.All(i => string.Equals(i.CollectionType, CollectionType.TvShows, StringComparison.OrdinalIgnoreCase))) { includeItemTypes = new string[] { "Episode" }; } } } var mediaTypes = new List <string>(); if (includeItemTypes.Length == 0) { foreach (var parent in parents.OfType <ICollectionFolder>()) { switch (parent.CollectionType) { case CollectionType.Books: mediaTypes.Add(MediaType.Book); mediaTypes.Add(MediaType.Audio); break; case CollectionType.Music: mediaTypes.Add(MediaType.Audio); break; case CollectionType.Photos: mediaTypes.Add(MediaType.Photo); mediaTypes.Add(MediaType.Video); break; case CollectionType.HomeVideos: mediaTypes.Add(MediaType.Photo); mediaTypes.Add(MediaType.Video); break; default: mediaTypes.Add(MediaType.Video); break; } } mediaTypes = mediaTypes.Distinct().ToList(); } var excludeItemTypes = includeItemTypes.Length == 0 && mediaTypes.Count == 0 ? new[] { nameof(Person), nameof(Studio), nameof(Year), nameof(MusicGenre), nameof(Genre) } : Array.Empty <string>(); var query = new InternalItemsQuery(user) { IncludeItemTypes = includeItemTypes, OrderBy = new[] { (ItemSortBy.DateCreated, SortOrder.Descending) },
private List <BaseItem> GetItemsForLatestItems(User user, LatestItemsQuery request, DtoOptions options) { var parentId = request.ParentId; var includeItemTypes = request.IncludeItemTypes; var limit = request.Limit ?? 10; var parents = new List <BaseItem>(); if (!string.IsNullOrEmpty(parentId)) { var parentItem = _libraryManager.GetItemById(parentId); var parentItemChannel = parentItem as Channel; if (parentItemChannel != null) { return(_channelManager.GetLatestChannelItemsInternal(new InternalItemsQuery(user) { ChannelIds = new Guid[] { new Guid(request.ParentId) }, IsPlayed = request.IsPlayed, StartIndex = request.StartIndex, Limit = request.Limit, IncludeItemTypes = request.IncludeItemTypes, EnableTotalRecordCount = false }, CancellationToken.None).Result.Items.ToList()); } var parent = parentItem as Folder; if (parent != null) { parents.Add(parent); } } var isPlayed = request.IsPlayed; if (parents.OfType <ICollectionFolder>().Any(i => string.Equals(i.CollectionType, CollectionType.Music, StringComparison.OrdinalIgnoreCase))) { isPlayed = null; } if (parents.Count == 0) { parents = _libraryManager.GetUserRootFolder().GetChildren(user, true) .Where(i => i is Folder) .Where(i => !user.Configuration.LatestItemsExcludes.Contains(i.Id.ToString("N"))) .ToList(); } if (parents.Count == 0) { return(new List <BaseItem>()); } if (includeItemTypes.Length == 0) { // Handle situations with the grouping setting, e.g. movies showing up in tv, etc. // Thanks to mixed content libraries included in the UserView var hasCollectionType = parents.OfType <UserView>().ToArray(); if (hasCollectionType.Length > 0) { if (hasCollectionType.All(i => string.Equals(i.CollectionType, CollectionType.Movies, StringComparison.OrdinalIgnoreCase))) { includeItemTypes = new string[] { "Movie" }; } else if (hasCollectionType.All(i => string.Equals(i.CollectionType, CollectionType.TvShows, StringComparison.OrdinalIgnoreCase))) { includeItemTypes = new string[] { "Episode" }; } } } var mediaTypes = new List <string>(); if (includeItemTypes.Length == 0) { foreach (var parent in parents.OfType <ICollectionFolder>()) { switch (parent.CollectionType) { case CollectionType.Books: mediaTypes.Add(MediaType.Book); mediaTypes.Add(MediaType.Audio); break; case CollectionType.Games: mediaTypes.Add(MediaType.Game); break; case CollectionType.Music: mediaTypes.Add(MediaType.Audio); break; case CollectionType.Photos: mediaTypes.Add(MediaType.Photo); mediaTypes.Add(MediaType.Video); break; case CollectionType.HomeVideos: mediaTypes.Add(MediaType.Photo); mediaTypes.Add(MediaType.Video); break; default: mediaTypes.Add(MediaType.Video); break; } } mediaTypes = mediaTypes.Distinct().ToList(); } var excludeItemTypes = includeItemTypes.Length == 0 && mediaTypes.Count == 0 ? new[] { typeof(Person).Name, typeof(Studio).Name, typeof(Year).Name, typeof(GameGenre).Name, typeof(MusicGenre).Name, typeof(Genre).Name } : Array.Empty <string>(); var query = new InternalItemsQuery(user) { IncludeItemTypes = includeItemTypes, OrderBy = new[] { new Tuple <string, SortOrder>(ItemSortBy.DateCreated, SortOrder.Descending) }, IsFolder = includeItemTypes.Length == 0 ? false : (bool?)null, ExcludeItemTypes = excludeItemTypes, IsVirtualItem = false, Limit = limit * 5, IsPlayed = isPlayed, DtoOptions = options, MediaTypes = mediaTypes.ToArray(mediaTypes.Count) }; if (parents.Count == 0) { return(_libraryManager.GetItemList(query, false)); } return(_libraryManager.GetItemList(query, parents)); }
private List <BaseItem> GetItemsForLatestItems(User user, LatestItemsQuery request, DtoOptions options) { var parentId = request.ParentId; var includeItemTypes = request.IncludeItemTypes; var limit = request.Limit ?? 10; var parents = new List <BaseItem>(); if (!string.IsNullOrWhiteSpace(parentId)) { var parent = _libraryManager.GetItemById(parentId) as Folder; if (parent != null) { parents.Add(parent); } } var isPlayed = request.IsPlayed; if (parents.OfType <ICollectionFolder>().Any(i => string.Equals(i.CollectionType, CollectionType.Music, StringComparison.OrdinalIgnoreCase))) { isPlayed = null; } if (parents.Count == 0) { parents = user.RootFolder.GetChildren(user, true) .Where(i => i is Folder) .Where(i => !user.Configuration.LatestItemsExcludes.Contains(i.Id.ToString("N"))) .ToList(); } if (parents.Count == 0) { return(new List <BaseItem>()); } var mediaTypes = new List <string>(); if (includeItemTypes.Length == 0) { foreach (var parent in parents.OfType <ICollectionFolder>()) { switch (parent.CollectionType) { case CollectionType.Books: mediaTypes.Add(MediaType.Book); break; case CollectionType.Games: mediaTypes.Add(MediaType.Game); break; case CollectionType.Music: mediaTypes.Add(MediaType.Audio); break; case CollectionType.Photos: mediaTypes.Add(MediaType.Photo); mediaTypes.Add(MediaType.Video); break; case CollectionType.HomeVideos: mediaTypes.Add(MediaType.Photo); mediaTypes.Add(MediaType.Video); break; default: mediaTypes.Add(MediaType.Video); break; } } mediaTypes = mediaTypes.Distinct().ToList(); } var excludeItemTypes = includeItemTypes.Length == 0 && mediaTypes.Count == 0 ? new[] { typeof(Person).Name, typeof(Studio).Name, typeof(Year).Name, typeof(GameGenre).Name, typeof(MusicGenre).Name, typeof(Genre).Name } : new string[] { }; var query = new InternalItemsQuery(user) { IncludeItemTypes = includeItemTypes, SortOrder = SortOrder.Descending, SortBy = new[] { ItemSortBy.DateCreated }, IsFolder = includeItemTypes.Length == 0 ? false : (bool?)null, ExcludeItemTypes = excludeItemTypes, IsVirtualItem = false, Limit = limit * 5, IsPlayed = isPlayed, DtoOptions = options, MediaTypes = mediaTypes.ToArray(mediaTypes.Count) }; if (parents.Count == 0) { return(_libraryManager.GetItemList(query, false)); } return(_libraryManager.GetItemList(query, parents)); }
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); }