protected virtual QueryResult<Tuple<BaseItem, ItemCounts>> GetItems(GetItemsByName request, InternalItemsQuery query) { return new QueryResult<Tuple<BaseItem, ItemCounts>>(); }
/// <summary> /// Gets all items. /// </summary> /// <param name="request">The request.</param> /// <param name="items">The items.</param> /// <returns>IEnumerable{Tuple{System.StringFunc{System.Int32}}}.</returns> protected override IEnumerable <BaseItem> GetAllItems(GetItemsByName request, IEnumerable <BaseItem> items) { throw new NotImplementedException(); }
protected override QueryResult <Tuple <BaseItem, ItemCounts> > GetItems(GetItemsByName request, InternalItemsQuery query) { return(LibraryManager.GetGameGenres(query)); }
/// <summary> /// Gets all items. /// </summary> /// <param name="request">The request.</param> /// <param name="items">The items.</param> /// <returns>IEnumerable{Task{`0}}.</returns> protected abstract IEnumerable <BaseItem> GetAllItems(GetItemsByName request, IEnumerable <BaseItem> items);
protected ItemsResult GetResultSlim(GetItemsByName request) { var dtoOptions = GetDtoOptions(request); User user = null; BaseItem parentItem; if (!string.IsNullOrWhiteSpace(request.UserId)) { user = UserManager.GetUserById(request.UserId); parentItem = string.IsNullOrEmpty(request.ParentId) ? user.RootFolder : LibraryManager.GetItemById(request.ParentId); } else { parentItem = string.IsNullOrEmpty(request.ParentId) ? LibraryManager.RootFolder : LibraryManager.GetItemById(request.ParentId); } var excludeItemTypes = request.GetExcludeItemTypes(); var includeItemTypes = request.GetIncludeItemTypes(); var mediaTypes = request.GetMediaTypes(); var query = new InternalItemsQuery(user) { ExcludeItemTypes = excludeItemTypes, IncludeItemTypes = includeItemTypes, MediaTypes = mediaTypes, StartIndex = request.StartIndex, Limit = request.Limit, IsFavorite = request.IsFavorite, NameLessThan = request.NameLessThan, NameStartsWith = request.NameStartsWith, NameStartsWithOrGreater = request.NameStartsWithOrGreater, AlbumArtistStartsWithOrGreater = request.AlbumArtistStartsWithOrGreater, Tags = request.GetTags(), OfficialRatings = request.GetOfficialRatings(), Genres = request.GetGenres(), GenreIds = request.GetGenreIds(), Studios = request.GetStudios(), StudioIds = request.GetStudioIds(), Person = request.Person, PersonIds = request.GetPersonIds(), PersonTypes = request.GetPersonTypes(), Years = request.GetYears(), MinCommunityRating = request.MinCommunityRating }; if (!string.IsNullOrWhiteSpace(request.ParentId)) { if (parentItem is Folder) { query.AncestorIds = new[] { request.ParentId }; } else { query.ItemIds = new[] { request.ParentId }; } } foreach (var filter in request.GetFilters()) { switch (filter) { case ItemFilter.Dislikes: query.IsLiked = false; break; case ItemFilter.IsFavorite: query.IsFavorite = true; break; case ItemFilter.IsFavoriteOrLikes: query.IsFavoriteOrLiked = true; break; case ItemFilter.IsFolder: query.IsFolder = true; break; case ItemFilter.IsNotFolder: query.IsFolder = false; break; case ItemFilter.IsPlayed: query.IsPlayed = true; break; case ItemFilter.IsResumable: query.IsResumable = true; break; case ItemFilter.IsUnplayed: query.IsPlayed = false; break; case ItemFilter.Likes: query.IsLiked = true; break; } } var result = GetItems(request, query); var syncProgess = DtoService.GetSyncedItemProgress(dtoOptions); var dtos = result.Items.Select(i => { var dto = DtoService.GetItemByNameDto(i.Item1, dtoOptions, null, syncProgess, user); if (!string.IsNullOrWhiteSpace(request.IncludeItemTypes)) { SetItemCounts(dto, i.Item2); } return(dto); }); return(new ItemsResult { Items = dtos.ToArray(), TotalRecordCount = result.TotalRecordCount }); }
/// <summary> /// Gets the specified request. /// </summary> /// <param name="request">The request.</param> /// <returns>Task{ItemsResult}.</returns> protected ItemsResult GetResult(GetItemsByName request) { var dtoOptions = GetDtoOptions(request); User user = null; BaseItem parentItem; List <BaseItem> libraryItems = null; if (!string.IsNullOrWhiteSpace(request.UserId)) { user = UserManager.GetUserById(request.UserId); parentItem = string.IsNullOrEmpty(request.ParentId) ? user.RootFolder : LibraryManager.GetItemById(request.ParentId); if (RequiresLibraryItems(request, dtoOptions)) { libraryItems = user.RootFolder.GetRecursiveChildren(user).ToList(); } } else { parentItem = string.IsNullOrEmpty(request.ParentId) ? LibraryManager.RootFolder : LibraryManager.GetItemById(request.ParentId); if (RequiresLibraryItems(request, dtoOptions)) { libraryItems = LibraryManager.RootFolder.GetRecursiveChildren().ToList(); } } IEnumerable <BaseItem> items; var excludeItemTypes = request.GetExcludeItemTypes(); var includeItemTypes = request.GetIncludeItemTypes(); var mediaTypes = request.GetMediaTypes(); var query = new InternalItemsQuery(user) { ExcludeItemTypes = excludeItemTypes, IncludeItemTypes = includeItemTypes, MediaTypes = mediaTypes }; Func <BaseItem, bool> filter = i => FilterItem(request, i, excludeItemTypes, includeItemTypes, mediaTypes); if (parentItem.IsFolder) { var folder = (Folder)parentItem; if (!string.IsNullOrWhiteSpace(request.UserId)) { items = request.Recursive ? folder.GetRecursiveChildren(user, query) : folder.GetChildren(user, true).Where(filter); } else { items = request.Recursive ? folder.GetRecursiveChildren(filter) : folder.Children.Where(filter); } } else { items = new[] { parentItem }.Where(filter); } var extractedItems = GetAllItems(request, items); var filteredItems = FilterItems(request, extractedItems, user); filteredItems = FilterByLibraryItems(request, filteredItems.Cast <IItemByName>(), user, libraryItems).Cast <BaseItem>(); filteredItems = LibraryManager.Sort(filteredItems, user, request.GetOrderBy(), request.SortOrder ?? SortOrder.Ascending); var ibnItemsArray = filteredItems.ToList(); IEnumerable <BaseItem> ibnItems = ibnItemsArray; var result = new ItemsResult { TotalRecordCount = ibnItemsArray.Count }; if (request.StartIndex.HasValue || request.Limit.HasValue) { if (request.StartIndex.HasValue) { ibnItems = ibnItems.Skip(request.StartIndex.Value); } if (request.Limit.HasValue) { ibnItems = ibnItems.Take(request.Limit.Value); } } IEnumerable <Tuple <BaseItem, List <BaseItem> > > tuples; if (dtoOptions.Fields.Contains(ItemFields.ItemCounts)) { tuples = ibnItems.Select(i => new Tuple <BaseItem, List <BaseItem> >(i, ((IItemByName)i).GetTaggedItems(libraryItems).ToList())); } else { tuples = ibnItems.Select(i => new Tuple <BaseItem, List <BaseItem> >(i, new List <BaseItem>())); } var syncProgess = DtoService.GetSyncedItemProgress(dtoOptions); var dtos = tuples.Select(i => DtoService.GetItemByNameDto(i.Item1, dtoOptions, i.Item2, syncProgess, user)); result.Items = dtos.Where(i => i != null).ToArray(); return(result); }
/// <summary> /// Filters the items. /// </summary> /// <param name="request">The request.</param> /// <param name="items">The items.</param> /// <param name="user">The user.</param> /// <returns>IEnumerable{`0}.</returns> private IEnumerable <BaseItem> FilterItems(GetItemsByName request, IEnumerable <BaseItem> items, User user) { if (!string.IsNullOrEmpty(request.NameStartsWithOrGreater)) { items = items.Where(i => string.Compare(request.NameStartsWithOrGreater, i.SortName, StringComparison.CurrentCultureIgnoreCase) < 1); } if (!string.IsNullOrEmpty(request.NameStartsWith)) { items = items.Where(i => string.Compare(request.NameStartsWith, i.SortName.Substring(0, 1), StringComparison.CurrentCultureIgnoreCase) == 0); } if (!string.IsNullOrEmpty(request.NameLessThan)) { items = items.Where(i => string.Compare(request.NameLessThan, i.SortName, StringComparison.CurrentCultureIgnoreCase) == 1); } var imageTypes = request.GetImageTypes().ToList(); if (imageTypes.Count > 0) { items = items.Where(item => imageTypes.Any(item.HasImage)); } var filters = request.GetFilters().ToList(); if (filters.Contains(ItemFilter.Dislikes)) { items = items.Where(i => { var userdata = UserDataRepository.GetUserData(user, i); return(userdata != null && userdata.Likes.HasValue && !userdata.Likes.Value); }); } if (filters.Contains(ItemFilter.Likes)) { items = items.Where(i => { var userdata = UserDataRepository.GetUserData(user, i); return(userdata != null && userdata.Likes.HasValue && userdata.Likes.Value); }); } if (filters.Contains(ItemFilter.IsFavoriteOrLikes)) { items = items.Where(i => { var userdata = UserDataRepository.GetUserData(user, i); var likes = userdata.Likes ?? false; var favorite = userdata.IsFavorite; return(likes || favorite); }); } if (filters.Contains(ItemFilter.IsFavorite)) { items = items.Where(i => { var userdata = UserDataRepository.GetUserData(user, i); return(userdata != null && userdata.IsFavorite); }); } // Avoid implicitly captured closure var currentRequest = request; return(items.Where(i => ApplyAdditionalFilters(currentRequest, i, user, false))); }
/// <summary> /// Gets the specified request. /// </summary> /// <param name="request">The request.</param> /// <returns>Task{ItemsResult}.</returns> protected QueryResult <BaseItemDto> GetResult(GetItemsByName request) { var dtoOptions = GetDtoOptions(AuthorizationContext, request); User user = null; BaseItem parentItem; if (!request.UserId.Equals(Guid.Empty)) { user = UserManager.GetUserById(request.UserId); parentItem = string.IsNullOrEmpty(request.ParentId) ? LibraryManager.GetUserRootFolder() : LibraryManager.GetItemById(request.ParentId); } else { parentItem = string.IsNullOrEmpty(request.ParentId) ? LibraryManager.RootFolder : LibraryManager.GetItemById(request.ParentId); } IList <BaseItem> items; var excludeItemTypes = request.GetExcludeItemTypes(); var includeItemTypes = request.GetIncludeItemTypes(); var mediaTypes = request.GetMediaTypes(); var query = new InternalItemsQuery(user) { ExcludeItemTypes = excludeItemTypes, IncludeItemTypes = includeItemTypes, MediaTypes = mediaTypes, DtoOptions = dtoOptions }; Func <BaseItem, bool> filter = i => FilterItem(request, i, excludeItemTypes, includeItemTypes, mediaTypes); if (parentItem.IsFolder) { var folder = (Folder)parentItem; if (!request.UserId.Equals(Guid.Empty)) { items = request.Recursive ? folder.GetRecursiveChildren(user, query).ToList() : folder.GetChildren(user, true).Where(filter).ToList(); } else { items = request.Recursive ? folder.GetRecursiveChildren(filter) : folder.Children.Where(filter).ToList(); } } else { items = new[] { parentItem }.Where(filter).ToList(); } var extractedItems = GetAllItems(request, items); var filteredItems = FilterItems(request, extractedItems, user); filteredItems = LibraryManager.Sort(filteredItems, user, request.GetOrderBy()); var ibnItemsArray = filteredItems.ToList(); IEnumerable <BaseItem> ibnItems = ibnItemsArray; var result = new QueryResult <BaseItemDto> { TotalRecordCount = ibnItemsArray.Count }; if (request.StartIndex.HasValue || request.Limit.HasValue) { if (request.StartIndex.HasValue) { ibnItems = ibnItems.Skip(request.StartIndex.Value); } if (request.Limit.HasValue) { ibnItems = ibnItems.Take(request.Limit.Value); } } var tuples = ibnItems.Select(i => new Tuple <BaseItem, List <BaseItem> >(i, new List <BaseItem>())); var dtos = tuples.Select(i => DtoService.GetItemByNameDto(i.Item1, dtoOptions, i.Item2, user)); result.Items = dtos.Where(i => i != null).ToArray(); return(result); }
protected QueryResult <BaseItemDto> GetResultSlim(GetItemsByName request) { var dtoOptions = GetDtoOptions(AuthorizationContext, request); User user = null; BaseItem parentItem; if (!request.UserId.Equals(Guid.Empty)) { user = UserManager.GetUserById(request.UserId); parentItem = string.IsNullOrEmpty(request.ParentId) ? LibraryManager.GetUserRootFolder() : LibraryManager.GetItemById(request.ParentId); } else { parentItem = string.IsNullOrEmpty(request.ParentId) ? LibraryManager.RootFolder : LibraryManager.GetItemById(request.ParentId); } var excludeItemTypes = request.GetExcludeItemTypes(); var includeItemTypes = request.GetIncludeItemTypes(); var mediaTypes = request.GetMediaTypes(); var query = new InternalItemsQuery(user) { ExcludeItemTypes = excludeItemTypes, IncludeItemTypes = includeItemTypes, MediaTypes = mediaTypes, StartIndex = request.StartIndex, Limit = request.Limit, IsFavorite = request.IsFavorite, NameLessThan = request.NameLessThan, NameStartsWith = request.NameStartsWith, NameStartsWithOrGreater = request.NameStartsWithOrGreater, Tags = request.GetTags(), OfficialRatings = request.GetOfficialRatings(), Genres = request.GetGenres(), GenreIds = GetGuids(request.GenreIds), StudioIds = GetGuids(request.StudioIds), Person = request.Person, PersonIds = GetGuids(request.PersonIds), PersonTypes = request.GetPersonTypes(), Years = request.GetYears(), MinCommunityRating = request.MinCommunityRating, DtoOptions = dtoOptions }; if (!string.IsNullOrWhiteSpace(request.ParentId)) { if (parentItem is Folder) { query.AncestorIds = new[] { new Guid(request.ParentId) }; } else { query.ItemIds = new[] { new Guid(request.ParentId) }; } } // Studios if (!string.IsNullOrEmpty(request.Studios)) { query.StudioIds = request.Studios.Split('|').Select(i => { try { return(LibraryManager.GetStudio(i)); } catch { return(null); } }).Where(i => i != null).Select(i => i.Id).ToArray(); } foreach (var filter in request.GetFilters()) { switch (filter) { case ItemFilter.Dislikes: query.IsLiked = false; break; case ItemFilter.IsFavorite: query.IsFavorite = true; break; case ItemFilter.IsFavoriteOrLikes: query.IsFavoriteOrLiked = true; break; case ItemFilter.IsFolder: query.IsFolder = true; break; case ItemFilter.IsNotFolder: query.IsFolder = false; break; case ItemFilter.IsPlayed: query.IsPlayed = true; break; case ItemFilter.IsResumable: query.IsResumable = true; break; case ItemFilter.IsUnplayed: query.IsPlayed = false; break; case ItemFilter.Likes: query.IsLiked = true; break; } } var result = GetItems(request, query); var dtos = result.Items.Select(i => { var dto = DtoService.GetItemByNameDto(i.Item1, dtoOptions, null, user); if (!string.IsNullOrWhiteSpace(request.IncludeItemTypes)) { SetItemCounts(dto, i.Item2); } return(dto); }); return(new QueryResult <BaseItemDto> { Items = dtos.ToArray(result.Items.Length), TotalRecordCount = result.TotalRecordCount }); }
/// <summary> /// Gets the specified request. /// </summary> /// <param name="request">The request.</param> /// <returns>Task{ItemsResult}.</returns> protected async Task <ItemsResult> GetResult(GetItemsByName request) { User user = null; BaseItem item; if (request.UserId.HasValue) { user = UserManager.GetUserById(request.UserId.Value); item = string.IsNullOrEmpty(request.ParentId) ? user.RootFolder : DtoService.GetItemByDtoId(request.ParentId, user.Id); } else { item = string.IsNullOrEmpty(request.ParentId) ? LibraryManager.RootFolder : DtoService.GetItemByDtoId(request.ParentId); } IEnumerable <BaseItem> items; if (item.IsFolder) { var folder = (Folder)item; if (request.UserId.HasValue) { items = request.Recursive ? folder.GetRecursiveChildren(user) : folder.GetChildren(user, true); } else { items = request.Recursive ? folder.RecursiveChildren : folder.Children; } } else { items = new[] { item }; } items = FilterItems(request, items); var ibnItemTasks = GetAllItems(request, items); var extractedItems = await Task.WhenAll(ibnItemTasks).ConfigureAwait(false); var filteredItems = FilterItems(request, extractedItems, user); filteredItems = ItemsService.ApplySortOrder(request, filteredItems, user, LibraryManager).Cast <TItemType>(); var ibnItemsArray = filteredItems.ToArray(); IEnumerable <TItemType> ibnItems = ibnItemsArray; var result = new ItemsResult { TotalRecordCount = ibnItemsArray.Length }; if (request.StartIndex.HasValue || request.Limit.HasValue) { if (request.StartIndex.HasValue) { ibnItems = ibnItems.Skip(request.StartIndex.Value); } if (request.Limit.HasValue) { ibnItems = ibnItems.Take(request.Limit.Value); } } var fields = request.GetItemFields().ToList(); var tasks = ibnItems.Select(i => GetDto(i, user, fields)); var resultItems = await Task.WhenAll(tasks).ConfigureAwait(false); result.Items = resultItems.Where(i => i != null).ToArray(); return(result); }
/// <summary> /// Filters the items. /// </summary> /// <param name="request">The request.</param> /// <param name="items">The items.</param> /// <param name="user">The user.</param> /// <returns>IEnumerable{`0}.</returns> private IEnumerable <TItemType> FilterItems(GetItemsByName request, IEnumerable <TItemType> items, User user) { if (!string.IsNullOrEmpty(request.NameStartsWithOrGreater)) { items = items.Where(i => string.Compare(request.NameStartsWithOrGreater, i.Name, StringComparison.CurrentCultureIgnoreCase) < 1); } var imageTypes = request.GetImageTypes().ToArray(); if (imageTypes.Length > 0) { items = items.Where(item => imageTypes.Any(imageType => ItemsService.HasImage(item, imageType))); } var filters = request.GetFilters().ToList(); if (filters.Count == 0) { return(items); } items = items.AsParallel(); if (filters.Contains(ItemFilter.Dislikes)) { items = items.Where(i => { var userdata = UserDataRepository.GetUserData(user.Id, i.GetUserDataKey()); return(userdata != null && userdata.Likes.HasValue && !userdata.Likes.Value); }); } if (filters.Contains(ItemFilter.Likes)) { items = items.Where(i => { var userdata = UserDataRepository.GetUserData(user.Id, i.GetUserDataKey()); return(userdata != null && userdata.Likes.HasValue && userdata.Likes.Value); }); } if (filters.Contains(ItemFilter.IsFavoriteOrLikes)) { items = items.Where(i => { var userdata = UserDataRepository.GetUserData(user.Id, i.GetUserDataKey()); var likes = userdata.Likes ?? false; var favorite = userdata.IsFavorite; return(likes || favorite); }); } if (filters.Contains(ItemFilter.IsFavorite)) { items = items.Where(i => { var userdata = UserDataRepository.GetUserData(user.Id, i.GetUserDataKey()); return(userdata != null && userdata.Likes.HasValue && userdata.IsFavorite); }); } return(items.AsEnumerable()); }
/// <summary> /// Gets the specified request. /// </summary> /// <param name="request">The request.</param> /// <returns>Task{ItemsResult}.</returns> protected ItemsResult GetResult(GetItemsByName request) { User user = null; BaseItem item; List <BaseItem> libraryItems; if (request.UserId.HasValue) { user = UserManager.GetUserById(request.UserId.Value); item = string.IsNullOrEmpty(request.ParentId) ? user.RootFolder : LibraryManager.GetItemById(request.ParentId); libraryItems = user.RootFolder.GetRecursiveChildren(user).ToList(); } else { item = string.IsNullOrEmpty(request.ParentId) ? LibraryManager.RootFolder : LibraryManager.GetItemById(request.ParentId); libraryItems = LibraryManager.RootFolder.RecursiveChildren.ToList(); } IEnumerable <BaseItem> items; if (item.IsFolder) { var folder = (Folder)item; if (request.UserId.HasValue) { items = request.Recursive ? folder.GetRecursiveChildren(user) : folder.GetChildren(user, true); } else { items = request.Recursive ? folder.GetRecursiveChildren() : folder.Children; } } else { items = new[] { item }; } items = FilterItems(request, items); var extractedItems = GetAllItems(request, items); var filteredItems = FilterItems(request, extractedItems, user); filteredItems = FilterByLibraryItems(request, filteredItems, user, libraryItems); filteredItems = ItemsService.ApplySortOrder(request, filteredItems, user, LibraryManager).Cast <TItemType>(); var ibnItemsArray = filteredItems.ToList(); IEnumerable <TItemType> ibnItems = ibnItemsArray; var result = new ItemsResult { TotalRecordCount = ibnItemsArray.Count }; if (request.StartIndex.HasValue || request.Limit.HasValue) { if (request.StartIndex.HasValue) { ibnItems = ibnItems.Skip(request.StartIndex.Value); } if (request.Limit.HasValue) { ibnItems = ibnItems.Take(request.Limit.Value); } } var fields = request.GetItemFields().ToList(); var tuples = ibnItems.Select(i => new Tuple <TItemType, List <BaseItem> >(i, i.GetTaggedItems(libraryItems).ToList())); var dtos = tuples.Select(i => GetDto(i.Item1, user, fields, i.Item2)); result.Items = dtos.Where(i => i != null).ToArray(); return(result); }
/// <summary> /// Gets all items. /// </summary> /// <param name="request">The request.</param> /// <param name="items">The items.</param> /// <returns>IEnumerable{Tuple{System.StringFunc{System.Int32}}}.</returns> protected abstract IEnumerable <IbnStub <TItemType> > GetAllItems(GetItemsByName request, IEnumerable <BaseItem> items);
/// <summary> /// Filters the items. /// </summary> /// <param name="request">The request.</param> /// <param name="items">The items.</param> /// <param name="user">The user.</param> /// <returns>IEnumerable{IbnStub}.</returns> private IEnumerable <IbnStub <TItemType> > FilterItems(GetItemsByName request, IEnumerable <IbnStub <TItemType> > items, User user) { if (!string.IsNullOrEmpty(request.NameStartsWithOrGreater)) { items = items.Where(i => string.Compare(request.NameStartsWithOrGreater, i.Name, StringComparison.CurrentCultureIgnoreCase) < 1); } var filters = request.GetFilters().ToList(); if (filters.Count == 0) { return(items); } items = items.AsParallel(); if (filters.Contains(ItemFilter.Dislikes)) { items = items.Where(i => { var userdata = i.GetUserItemData(UserDataRepository, user.Id).Result; return(userdata != null && userdata.Likes.HasValue && !userdata.Likes.Value); }); } if (filters.Contains(ItemFilter.Likes)) { items = items.Where(i => { var userdata = i.GetUserItemData(UserDataRepository, user.Id).Result; return(userdata != null && userdata.Likes.HasValue && userdata.Likes.Value); }); } if (filters.Contains(ItemFilter.IsFavoriteOrLikes)) { items = items.Where(i => { var userdata = i.GetUserItemData(UserDataRepository, user.Id).Result; if (userdata == null) { return(false); } var likes = userdata.Likes ?? false; var favorite = userdata.IsFavorite; return(likes || favorite); }); } if (filters.Contains(ItemFilter.IsFavorite)) { items = items.Where(i => { var userdata = i.GetUserItemData(UserDataRepository, user.Id).Result; return(userdata != null && userdata.Likes.HasValue && userdata.IsFavorite); }); } return(items.AsEnumerable()); }