From 175c085d90316b5ec978313c46ab96f779465304 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 3 Dec 2017 17:15:21 -0500 Subject: [PATCH] Stub out new filtering api --- .../Data/SqliteItemRepository.cs | 8 +- .../LiveTv/LiveTvManager.cs | 3 +- MediaBrowser.Api/FilterService.cs | 126 +++++++++++++++++- MediaBrowser.Api/LiveTv/LiveTvService.cs | 4 + MediaBrowser.Model/LiveTv/ProgramQuery.cs | 2 + MediaBrowser.Model/Querying/QueryFilters.cs | 18 ++- 6 files changed, 151 insertions(+), 10 deletions(-) diff --git a/Emby.Server.Implementations/Data/SqliteItemRepository.cs b/Emby.Server.Implementations/Data/SqliteItemRepository.cs index ddead897eb..830d6447ec 100644 --- a/Emby.Server.Implementations/Data/SqliteItemRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteItemRepository.cs @@ -5264,7 +5264,13 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type ItemIds = query.ItemIds, TopParentIds = query.TopParentIds, ParentId = query.ParentId, - IsPlayed = query.IsPlayed + IsPlayed = query.IsPlayed, + IsAiring = query.IsAiring, + IsMovie = query.IsMovie, + IsSports = query.IsSports, + IsKids = query.IsKids, + IsNews = query.IsNews, + IsSeries = query.IsSeries }; var innerWhereClauses = GetWhereClauses(innerQuery, null); diff --git a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs index 7e27877e7c..66eabf523a 100644 --- a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs +++ b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs @@ -125,7 +125,7 @@ namespace Emby.Server.Implementations.LiveTv public void AddParts(IEnumerable services, IEnumerable tunerHosts, IEnumerable listingProviders) { _services = services.ToArray(); - _tunerHosts.AddRange(tunerHosts); + _tunerHosts.AddRange(tunerHosts.Where(i => i.IsSupported)); _listingProviders.AddRange(listingProviders); foreach (var service in _services) @@ -947,6 +947,7 @@ namespace Emby.Server.Implementations.LiveTv IsKids = query.IsKids, IsNews = query.IsNews, Genres = query.Genres, + GenreIds = query.GenreIds, StartIndex = query.StartIndex, Limit = query.Limit, OrderBy = query.OrderBy, diff --git a/MediaBrowser.Api/FilterService.cs b/MediaBrowser.Api/FilterService.cs index 52b274653b..585e9c49bc 100644 --- a/MediaBrowser.Api/FilterService.cs +++ b/MediaBrowser.Api/FilterService.cs @@ -2,6 +2,7 @@ using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Net; using MediaBrowser.Model.Querying; +using MediaBrowser.Model.Dto; using System; using System.Collections.Generic; using System.Linq; @@ -11,7 +12,7 @@ using MediaBrowser.Model.Services; namespace MediaBrowser.Api { [Route("/Items/Filters", "GET", Summary = "Gets branding configuration")] - public class GetQueryFilters : IReturn + public class GetQueryFiltersLegacy : IReturn { /// /// Gets or sets the user id. @@ -40,6 +41,43 @@ namespace MediaBrowser.Api } } + [Route("/Items/Filters2", "GET", Summary = "Gets branding configuration")] + public class GetQueryFilters : IReturn + { + /// + /// Gets or sets the user id. + /// + /// The user id. + [ApiMember(Name = "UserId", Description = "User Id", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] + public string UserId { get; set; } + + [ApiMember(Name = "ParentId", Description = "Specify this to localize the search to a specific item or folder. Omit to use the root", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] + public string ParentId { get; set; } + + [ApiMember(Name = "IncludeItemTypes", Description = "Optional. If specified, results will be filtered based on item type. This allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)] + public string IncludeItemTypes { get; set; } + + [ApiMember(Name = "MediaTypes", Description = "Optional filter by MediaType. Allows multiple, comma delimited.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)] + public string MediaTypes { get; set; } + + public string[] GetMediaTypes() + { + return (MediaTypes ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + } + + public string[] GetIncludeItemTypes() + { + return (IncludeItemTypes ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + } + + public bool? IsAiring { get; set; } + public bool? IsMovie { get; set; } + public bool? IsSports { get; set; } + public bool? IsKids { get; set; } + public bool? IsNews { get; set; } + public bool? IsSeries { get; set; } + } + [Authenticated] public class FilterService : BaseApiService { @@ -57,18 +95,96 @@ namespace MediaBrowser.Api var parentItem = string.IsNullOrEmpty(request.ParentId) ? null : _libraryManager.GetItemById(request.ParentId); var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; + if (string.Equals(request.IncludeItemTypes, "BoxSet", StringComparison.OrdinalIgnoreCase) || + string.Equals(request.IncludeItemTypes, "Playlist", StringComparison.OrdinalIgnoreCase) || + string.Equals(request.IncludeItemTypes, typeof(Trailer).Name, StringComparison.OrdinalIgnoreCase) || + string.Equals(request.IncludeItemTypes, "Program", StringComparison.OrdinalIgnoreCase)) + { + parentItem = null; + } + + var filters = new QueryFilters(); + + var genreQuery = new InternalItemsQuery(user) + { + AncestorIds = parentItem == null ? new string[] { } : new string[] { parentItem.Id.ToString("N") }, + IncludeItemTypes = request.GetIncludeItemTypes(), + DtoOptions = new Controller.Dto.DtoOptions + { + Fields = new ItemFields[] { }, + EnableImages = false, + EnableUserData = false + }, + IsAiring = request.IsAiring, + IsMovie = request.IsMovie, + IsSports = request.IsSports, + IsKids = request.IsKids, + IsNews = request.IsNews, + IsSeries = request.IsSeries + }; + + if (string.Equals(request.IncludeItemTypes, "MusicAlbum", StringComparison.OrdinalIgnoreCase) || + string.Equals(request.IncludeItemTypes, "MusicVideo", StringComparison.OrdinalIgnoreCase) || + string.Equals(request.IncludeItemTypes, "MusicArtist", StringComparison.OrdinalIgnoreCase) || + string.Equals(request.IncludeItemTypes, "Audio", StringComparison.OrdinalIgnoreCase)) + { + filters.Genres = _libraryManager.GetMusicGenres(genreQuery).Items.Select(i => new NameIdPair + { + Name = i.Item1.Name, + Id = i.Item1.Id.ToString("N") + + }).ToArray(); + } + else if (string.Equals(request.IncludeItemTypes, "Game", StringComparison.OrdinalIgnoreCase) || + string.Equals(request.IncludeItemTypes, "GameSystem", StringComparison.OrdinalIgnoreCase)) + { + filters.Genres = _libraryManager.GetGameGenres(genreQuery).Items.Select(i => new NameIdPair + { + Name = i.Item1.Name, + Id = i.Item1.Id.ToString("N") + + }).ToArray(); + } + else + { + filters.Genres = _libraryManager.GetGenres(genreQuery).Items.Select(i => new NameIdPair + { + Name = i.Item1.Name, + Id = i.Item1.Id.ToString("N") + + }).ToArray(); + } + + return ToOptimizedResult(filters); + } + + public object Get(GetQueryFiltersLegacy request) + { + var parentItem = string.IsNullOrEmpty(request.ParentId) ? null : _libraryManager.GetItemById(request.ParentId); + var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; + + if (string.Equals(request.IncludeItemTypes, "BoxSet", StringComparison.OrdinalIgnoreCase) || + string.Equals(request.IncludeItemTypes, "Playlist", StringComparison.OrdinalIgnoreCase) || + string.Equals(request.IncludeItemTypes, typeof(Trailer).Name, StringComparison.OrdinalIgnoreCase) || + string.Equals(request.IncludeItemTypes, "Program", StringComparison.OrdinalIgnoreCase)) + { + parentItem = null; + } + var item = string.IsNullOrEmpty(request.ParentId) ? user == null ? _libraryManager.RootFolder : user.RootFolder : parentItem; var result = ((Folder)item).GetItemList(GetItemsQuery(request, user)); - return ToOptimizedResult(GetFilters(result)); + var filters = GetFilters(result); + + return ToOptimizedResult(filters); } - private QueryFilters GetFilters(BaseItem[] items) + private QueryFiltersLegacy GetFilters(BaseItem[] items) { - var result = new QueryFilters(); + var result = new QueryFiltersLegacy(); result.Years = items.Select(i => i.ProductionYear ?? -1) .Where(i => i > 0) @@ -97,7 +213,7 @@ namespace MediaBrowser.Api return result; } - private InternalItemsQuery GetItemsQuery(GetQueryFilters request, User user) + private InternalItemsQuery GetItemsQuery(GetQueryFiltersLegacy request, User user) { var query = new InternalItemsQuery { diff --git a/MediaBrowser.Api/LiveTv/LiveTvService.cs b/MediaBrowser.Api/LiveTv/LiveTvService.cs index 703c96e0c6..c137620481 100644 --- a/MediaBrowser.Api/LiveTv/LiveTvService.cs +++ b/MediaBrowser.Api/LiveTv/LiveTvService.cs @@ -379,6 +379,9 @@ namespace MediaBrowser.Api.LiveTv [ApiMember(Name = "Genres", Description = "The genres to return guide information for.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET,POST")] public string Genres { get; set; } + [ApiMember(Name = "GenreIds", Description = "The genres to return guide information for.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET,POST")] + public string GenreIds { get; set; } + [ApiMember(Name = "EnableImages", Description = "Optional, include image information in output", IsRequired = false, DataType = "boolean", ParameterType = "query", Verb = "GET")] public bool? EnableImages { get; set; } @@ -1003,6 +1006,7 @@ namespace MediaBrowser.Api.LiveTv query.IsSports = request.IsSports; query.SeriesTimerId = request.SeriesTimerId; query.Genres = (request.Genres ?? String.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + query.GenreIds = (request.GenreIds ?? String.Empty).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries); if (!string.IsNullOrWhiteSpace(request.LibrarySeriesId)) { diff --git a/MediaBrowser.Model/LiveTv/ProgramQuery.cs b/MediaBrowser.Model/LiveTv/ProgramQuery.cs index c0959635f3..ec3f8ad672 100644 --- a/MediaBrowser.Model/LiveTv/ProgramQuery.cs +++ b/MediaBrowser.Model/LiveTv/ProgramQuery.cs @@ -14,6 +14,7 @@ namespace MediaBrowser.Model.LiveTv ChannelIds = new string[] { }; OrderBy = new Tuple[] { }; Genres = new string[] { }; + GenreIds = new string[] { }; EnableTotalRecordCount = true; EnableUserData = true; } @@ -110,6 +111,7 @@ namespace MediaBrowser.Model.LiveTv /// Limit results to items containing specific genres /// /// The genres. + public string[] GenreIds { get; set; } public string[] Genres { get; set; } } } \ No newline at end of file diff --git a/MediaBrowser.Model/Querying/QueryFilters.cs b/MediaBrowser.Model/Querying/QueryFilters.cs index dd575c2a88..3a261857bd 100644 --- a/MediaBrowser.Model/Querying/QueryFilters.cs +++ b/MediaBrowser.Model/Querying/QueryFilters.cs @@ -1,14 +1,15 @@ - +using MediaBrowser.Model.Dto; + namespace MediaBrowser.Model.Querying { - public class QueryFilters + public class QueryFiltersLegacy { public string[] Genres { get; set; } public string[] Tags { get; set; } public string[] OfficialRatings { get; set; } public int[] Years { get; set; } - public QueryFilters() + public QueryFiltersLegacy() { Genres = new string[] { }; Tags = new string[] { }; @@ -16,4 +17,15 @@ namespace MediaBrowser.Model.Querying Years = new int[] { }; } } + public class QueryFilters + { + public NameIdPair[] Genres { get; set; } + public string[] Tags { get; set; } + + public QueryFilters() + { + Tags = new string[] { }; + Genres = new NameIdPair[] { }; + } + } }