public ActionResult <IEnumerable <BaseItemDto> > GetLatestMedia( [FromRoute, Required] Guid userId, [FromQuery] Guid?parentId, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind[] includeItemTypes, [FromQuery] bool?isPlayed, [FromQuery] bool?enableImages, [FromQuery] int?imageTypeLimit, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ImageType[] enableImageTypes, [FromQuery] bool?enableUserData, [FromQuery] int limit = 20, [FromQuery] bool groupItems = true) { var user = _userManager.GetUserById(userId); if (!isPlayed.HasValue) { if (user.HidePlayedInLatest) { isPlayed = false; } } var dtoOptions = new DtoOptions { Fields = fields } .AddClientFields(Request) .AddAdditionalDtoOptions(enableImages, enableUserData, imageTypeLimit, enableImageTypes); var list = _userViewManager.GetLatestItems( new LatestItemsQuery { GroupItems = groupItems, IncludeItemTypes = RequestHelpers.GetItemTypeStrings(includeItemTypes), IsPlayed = isPlayed, Limit = limit, ParentId = parentId ?? Guid.Empty, UserId = userId, }, dtoOptions); var dtos = list.Select(i => { var item = i.Item2[0]; var childCount = 0; if (i.Item1 != null && (i.Item2.Count > 1 || i.Item1 is MusicAlbum)) { item = i.Item1; childCount = i.Item2.Count; } var dto = _dtoService.GetBaseItemDto(item, dtoOptions, user); dto.ChildCount = childCount; return(dto); }); return(Ok(dtos)); }
public ActionResult <SearchHintResult> Get( [FromQuery] int?startIndex, [FromQuery] int?limit, [FromQuery] Guid?userId, [FromQuery, Required] string searchTerm, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind[] includeItemTypes, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind[] excludeItemTypes, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] mediaTypes, [FromQuery] Guid?parentId, [FromQuery] bool?isMovie, [FromQuery] bool?isSeries, [FromQuery] bool?isNews, [FromQuery] bool?isKids, [FromQuery] bool?isSports, [FromQuery] bool includePeople = true, [FromQuery] bool includeMedia = true, [FromQuery] bool includeGenres = true, [FromQuery] bool includeStudios = true, [FromQuery] bool includeArtists = true) { var result = _searchEngine.GetSearchHints(new SearchQuery { Limit = limit, SearchTerm = searchTerm, IncludeArtists = includeArtists, IncludeGenres = includeGenres, IncludeMedia = includeMedia, IncludePeople = includePeople, IncludeStudios = includeStudios, StartIndex = startIndex, UserId = userId ?? Guid.Empty, IncludeItemTypes = RequestHelpers.GetItemTypeStrings(includeItemTypes), ExcludeItemTypes = RequestHelpers.GetItemTypeStrings(excludeItemTypes), MediaTypes = mediaTypes, ParentId = parentId, IsKids = isKids, IsMovie = isMovie, IsNews = isNews, IsSeries = isSeries, IsSports = isSports }); return(new SearchHintResult { TotalRecordCount = result.TotalRecordCount, SearchHints = result.Items.Select(GetSearchHintResult).ToArray() }); }
public ActionResult <QueryResult <BaseItemDto> > GetGenres( [FromQuery] int?startIndex, [FromQuery] int?limit, [FromQuery] string?searchTerm, [FromQuery] Guid?parentId, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind[] excludeItemTypes, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind[] includeItemTypes, [FromQuery] bool?isFavorite, [FromQuery] int?imageTypeLimit, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ImageType[] enableImageTypes, [FromQuery] Guid?userId, [FromQuery] string?nameStartsWithOrGreater, [FromQuery] string?nameStartsWith, [FromQuery] string?nameLessThan, [FromQuery] bool?enableImages = true, [FromQuery] bool enableTotalRecordCount = true) { var dtoOptions = new DtoOptions { Fields = fields } .AddClientFields(Request) .AddAdditionalDtoOptions(enableImages, false, imageTypeLimit, enableImageTypes); User?user = userId.HasValue && userId != Guid.Empty ? _userManager.GetUserById(userId.Value) : null; var parentItem = _libraryManager.GetParentItem(parentId, userId); var query = new InternalItemsQuery(user) { ExcludeItemTypes = RequestHelpers.GetItemTypeStrings(excludeItemTypes), IncludeItemTypes = RequestHelpers.GetItemTypeStrings(includeItemTypes), StartIndex = startIndex, Limit = limit, IsFavorite = isFavorite, NameLessThan = nameLessThan, NameStartsWith = nameStartsWith, NameStartsWithOrGreater = nameStartsWithOrGreater, DtoOptions = dtoOptions, SearchTerm = searchTerm, EnableTotalRecordCount = enableTotalRecordCount }; if (parentId.HasValue) { if (parentItem is Folder) { query.AncestorIds = new[] { parentId.Value }; } else { query.ItemIds = new[] { parentId.Value }; } } QueryResult <(BaseItem, ItemCounts)> result; if (parentItem is ICollectionFolder parentCollectionFolder && (string.Equals(parentCollectionFolder.CollectionType, CollectionType.Music, StringComparison.Ordinal) || string.Equals(parentCollectionFolder.CollectionType, CollectionType.MusicVideos, StringComparison.Ordinal))) { result = _libraryManager.GetMusicGenres(query); }
public ActionResult <QueryResult <BaseItemDto> > GetArtists( [FromQuery] double?minCommunityRating, [FromQuery] int?startIndex, [FromQuery] int?limit, [FromQuery] string?searchTerm, [FromQuery] Guid?parentId, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind[] excludeItemTypes, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind[] includeItemTypes, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFilter[] filters, [FromQuery] bool?isFavorite, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] mediaTypes, [FromQuery, ModelBinder(typeof(PipeDelimitedArrayModelBinder))] string[] genres, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] Guid[] genreIds, [FromQuery, ModelBinder(typeof(PipeDelimitedArrayModelBinder))] string[] officialRatings, [FromQuery, ModelBinder(typeof(PipeDelimitedArrayModelBinder))] string[] tags, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] int[] years, [FromQuery] bool?enableUserData, [FromQuery] int?imageTypeLimit, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ImageType[] enableImageTypes, [FromQuery] string?person, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] Guid[] personIds, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] personTypes, [FromQuery, ModelBinder(typeof(PipeDelimitedArrayModelBinder))] string[] studios, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] Guid[] studioIds, [FromQuery] Guid?userId, [FromQuery] string?nameStartsWithOrGreater, [FromQuery] string?nameStartsWith, [FromQuery] string?nameLessThan, [FromQuery] bool?enableImages = true, [FromQuery] bool enableTotalRecordCount = true) { var dtoOptions = new DtoOptions { Fields = fields } .AddClientFields(Request) .AddAdditionalDtoOptions(enableImages, enableUserData, imageTypeLimit, enableImageTypes); User? user = null; BaseItem parentItem = _libraryManager.GetParentItem(parentId, userId); if (userId.HasValue && !userId.Equals(Guid.Empty)) { user = _userManager.GetUserById(userId.Value); } var query = new InternalItemsQuery(user) { ExcludeItemTypes = RequestHelpers.GetItemTypeStrings(excludeItemTypes), IncludeItemTypes = RequestHelpers.GetItemTypeStrings(includeItemTypes), MediaTypes = mediaTypes, StartIndex = startIndex, Limit = limit, IsFavorite = isFavorite, NameLessThan = nameLessThan, NameStartsWith = nameStartsWith, NameStartsWithOrGreater = nameStartsWithOrGreater, Tags = tags, OfficialRatings = officialRatings, Genres = genres, GenreIds = genreIds, StudioIds = studioIds, Person = person, PersonIds = personIds, PersonTypes = personTypes, Years = years, MinCommunityRating = minCommunityRating, DtoOptions = dtoOptions, SearchTerm = searchTerm, EnableTotalRecordCount = enableTotalRecordCount }; if (parentId.HasValue) { if (parentItem is Folder) { query.AncestorIds = new[] { parentId.Value }; } else { query.ItemIds = new[] { parentId.Value }; } } // Studios if (studios.Length != 0) { query.StudioIds = studios.Select(i => { try { return(_libraryManager.GetStudio(i)); } catch { return(null); } }).Where(i => i != null).Select(i => i !.Id).ToArray(); } foreach (var filter in filters) { 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 = _libraryManager.GetArtists(query); var dtos = result.Items.Select(i => { var(baseItem, itemCounts) = i; var dto = _dtoService.GetItemByNameDto(baseItem, dtoOptions, null, user); if (includeItemTypes.Length != 0) { dto.ChildCount = itemCounts.ItemCount; dto.ProgramCount = itemCounts.ProgramCount; dto.SeriesCount = itemCounts.SeriesCount; dto.EpisodeCount = itemCounts.EpisodeCount; dto.MovieCount = itemCounts.MovieCount; dto.TrailerCount = itemCounts.TrailerCount; dto.AlbumCount = itemCounts.AlbumCount; dto.SongCount = itemCounts.SongCount; dto.ArtistCount = itemCounts.ArtistCount; } return(dto); }); return(new QueryResult <BaseItemDto> { Items = dtos.ToArray(), TotalRecordCount = result.TotalRecordCount }); }
public ActionResult <QueryFiltersLegacy> GetQueryFiltersLegacy( [FromQuery] Guid?userId, [FromQuery] Guid?parentId, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind[] includeItemTypes, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] mediaTypes) { var user = userId.HasValue && !userId.Equals(Guid.Empty) ? _userManager.GetUserById(userId.Value) : null; BaseItem?item = null; if (includeItemTypes.Length != 1 || !(includeItemTypes[0] == BaseItemKind.BoxSet || includeItemTypes[0] == BaseItemKind.Playlist || includeItemTypes[0] == BaseItemKind.Trailer || includeItemTypes[0] == BaseItemKind.Program)) { item = _libraryManager.GetParentItem(parentId, user?.Id); } var query = new InternalItemsQuery { User = user, MediaTypes = mediaTypes, IncludeItemTypes = RequestHelpers.GetItemTypeStrings(includeItemTypes), Recursive = true, EnableTotalRecordCount = false, DtoOptions = new DtoOptions { Fields = new[] { ItemFields.Genres, ItemFields.Tags }, EnableImages = false, EnableUserData = false } }; if (item is not Folder folder) { return(new QueryFiltersLegacy()); } var itemList = folder.GetItemList(query); return(new QueryFiltersLegacy { Years = itemList.Select(i => i.ProductionYear ?? -1) .Where(i => i > 0) .Distinct() .OrderBy(i => i) .ToArray(), Genres = itemList.SelectMany(i => i.Genres) .DistinctNames() .OrderBy(i => i) .ToArray(), Tags = itemList .SelectMany(i => i.Tags) .Distinct(StringComparer.OrdinalIgnoreCase) .OrderBy(i => i) .ToArray(), OfficialRatings = itemList .Select(i => i.OfficialRating) .Where(i => !string.IsNullOrWhiteSpace(i)) .Distinct(StringComparer.OrdinalIgnoreCase) .OrderBy(i => i) .ToArray() }); }
public ActionResult <QueryFilters> GetQueryFilters( [FromQuery] Guid?userId, [FromQuery] Guid?parentId, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind[] includeItemTypes, [FromQuery] bool?isAiring, [FromQuery] bool?isMovie, [FromQuery] bool?isSports, [FromQuery] bool?isKids, [FromQuery] bool?isNews, [FromQuery] bool?isSeries, [FromQuery] bool?recursive) { var user = userId.HasValue && !userId.Equals(Guid.Empty) ? _userManager.GetUserById(userId.Value) : null; BaseItem?parentItem = null; if (includeItemTypes.Length == 1 && (includeItemTypes[0] == BaseItemKind.BoxSet || includeItemTypes[0] == BaseItemKind.Playlist || includeItemTypes[0] == BaseItemKind.Trailer || includeItemTypes[0] == BaseItemKind.Program)) { parentItem = null; } else if (parentId.HasValue) { parentItem = _libraryManager.GetItemById(parentId.Value); } var filters = new QueryFilters(); var genreQuery = new InternalItemsQuery(user) { IncludeItemTypes = RequestHelpers.GetItemTypeStrings(includeItemTypes), DtoOptions = new DtoOptions { Fields = Array.Empty <ItemFields>(), EnableImages = false, EnableUserData = false }, IsAiring = isAiring, IsMovie = isMovie, IsSports = isSports, IsKids = isKids, IsNews = isNews, IsSeries = isSeries }; if ((recursive ?? true) || parentItem is UserView || parentItem is ICollectionFolder) { genreQuery.AncestorIds = parentItem == null?Array.Empty <Guid>() : new[] { parentItem.Id }; } else { genreQuery.Parent = parentItem; } if (includeItemTypes.Length == 1 && (includeItemTypes[0] == BaseItemKind.MusicAlbum || includeItemTypes[0] == BaseItemKind.MusicVideo || includeItemTypes[0] == BaseItemKind.MusicArtist || includeItemTypes[0] == BaseItemKind.Audio)) { filters.Genres = _libraryManager.GetMusicGenres(genreQuery).Items.Select(i => new NameGuidPair { Name = i.Item1.Name, Id = i.Item1.Id }).ToArray(); } else { filters.Genres = _libraryManager.GetGenres(genreQuery).Items.Select(i => new NameGuidPair { Name = i.Item1.Name, Id = i.Item1.Id }).ToArray(); } return(filters); }
public ActionResult <QueryResult <BaseItemDto> > GetYears( [FromQuery] int?startIndex, [FromQuery] int?limit, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] SortOrder[] sortOrder, [FromQuery] Guid?parentId, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind[] excludeItemTypes, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind[] includeItemTypes, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] mediaTypes, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] sortBy, [FromQuery] bool?enableUserData, [FromQuery] int?imageTypeLimit, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ImageType[] enableImageTypes, [FromQuery] Guid?userId, [FromQuery] bool recursive = true, [FromQuery] bool?enableImages = true) { var dtoOptions = new DtoOptions { Fields = fields } .AddClientFields(Request) .AddAdditionalDtoOptions(enableImages, enableUserData, imageTypeLimit, enableImageTypes); User? user = null; BaseItem parentItem = _libraryManager.GetParentItem(parentId, userId); if (userId.HasValue && !userId.Equals(Guid.Empty)) { user = _userManager.GetUserById(userId.Value); } IList <BaseItem> items; var query = new InternalItemsQuery(user) { ExcludeItemTypes = RequestHelpers.GetItemTypeStrings(excludeItemTypes), IncludeItemTypes = RequestHelpers.GetItemTypeStrings(includeItemTypes), MediaTypes = mediaTypes, DtoOptions = dtoOptions }; bool Filter(BaseItem i) => FilterItem(i, excludeItemTypes, includeItemTypes, mediaTypes); if (parentItem.IsFolder) { var folder = (Folder)parentItem; if (!userId.Equals(Guid.Empty)) { items = recursive ? folder.GetRecursiveChildren(user, query).ToList() : folder.GetChildren(user, true).Where(Filter).ToList(); } else { items = recursive ? folder.GetRecursiveChildren(Filter) : folder.Children.Where(Filter).ToList(); } } else { items = new[] { parentItem }.Where(Filter).ToList(); } var extractedItems = GetAllItems(items); var filteredItems = _libraryManager.Sort(extractedItems, user, RequestHelpers.GetOrderBy(sortBy, sortOrder)); var ibnItemsArray = filteredItems.ToList(); IEnumerable <BaseItem> ibnItems = ibnItemsArray; var result = new QueryResult <BaseItemDto> { TotalRecordCount = ibnItemsArray.Count }; if (startIndex.HasValue || limit.HasValue) { if (startIndex.HasValue) { ibnItems = ibnItems.Skip(startIndex.Value); } if (limit.HasValue) { ibnItems = ibnItems.Take(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); }
public ActionResult <QueryResult <BaseItemDto> > GetStudios( [FromQuery] int?startIndex, [FromQuery] int?limit, [FromQuery] string?searchTerm, [FromQuery] Guid?parentId, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ItemFields[] fields, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind[] excludeItemTypes, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] BaseItemKind[] includeItemTypes, [FromQuery] bool?isFavorite, [FromQuery] bool?enableUserData, [FromQuery] int?imageTypeLimit, [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] ImageType[] enableImageTypes, [FromQuery] Guid?userId, [FromQuery] string?nameStartsWithOrGreater, [FromQuery] string?nameStartsWith, [FromQuery] string?nameLessThan, [FromQuery] bool?enableImages = true, [FromQuery] bool enableTotalRecordCount = true) { var dtoOptions = new DtoOptions { Fields = fields } .AddClientFields(Request) .AddAdditionalDtoOptions(enableImages, enableUserData, imageTypeLimit, enableImageTypes); User?user = userId.HasValue && userId != Guid.Empty ? _userManager.GetUserById(userId.Value) : null; var parentItem = _libraryManager.GetParentItem(parentId, userId); var query = new InternalItemsQuery(user) { ExcludeItemTypes = RequestHelpers.GetItemTypeStrings(excludeItemTypes), IncludeItemTypes = RequestHelpers.GetItemTypeStrings(includeItemTypes), StartIndex = startIndex, Limit = limit, IsFavorite = isFavorite, NameLessThan = nameLessThan, NameStartsWith = nameStartsWith, NameStartsWithOrGreater = nameStartsWithOrGreater, DtoOptions = dtoOptions, SearchTerm = searchTerm, EnableTotalRecordCount = enableTotalRecordCount }; if (parentId.HasValue) { if (parentItem is Folder) { query.AncestorIds = new[] { parentId.Value }; } else { query.ItemIds = new[] { parentId.Value }; } } var result = _libraryManager.GetStudios(query); var shouldIncludeItemTypes = includeItemTypes.Length != 0; return(RequestHelpers.CreateQueryResult(result, dtoOptions, _dtoService, shouldIncludeItemTypes, user)); }