Browse Source

Stub out new filtering api

Luke Pulverenti 7 years ago
parent
commit
175c085d90

+ 7 - 1
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);

+ 2 - 1
Emby.Server.Implementations/LiveTv/LiveTvManager.cs

@@ -125,7 +125,7 @@ namespace Emby.Server.Implementations.LiveTv
         public void AddParts(IEnumerable<ILiveTvService> services, IEnumerable<ITunerHost> tunerHosts, IEnumerable<IListingsProvider> 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,

+ 120 - 4
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,6 +12,36 @@ using MediaBrowser.Model.Services;
 namespace MediaBrowser.Api
 {
     [Route("/Items/Filters", "GET", Summary = "Gets branding configuration")]
+    public class GetQueryFiltersLegacy : IReturn<QueryFiltersLegacy>
+    {
+        /// <summary>
+        /// Gets or sets the user id.
+        /// </summary>
+        /// <value>The user id.</value>
+        [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);
+        }
+    }
+
+    [Route("/Items/Filters2", "GET", Summary = "Gets branding configuration")]
     public class GetQueryFilters : IReturn<QueryFilters>
     {
         /// <summary>
@@ -38,6 +69,13 @@ namespace MediaBrowser.Api
         {
             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]
@@ -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
             {

+ 4 - 0
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))
             {

+ 2 - 0
MediaBrowser.Model/LiveTv/ProgramQuery.cs

@@ -14,6 +14,7 @@ namespace MediaBrowser.Model.LiveTv
             ChannelIds = new string[] { };
             OrderBy = new Tuple<string, SortOrder>[] { };
             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
         /// </summary>
         /// <value>The genres.</value>
+        public string[] GenreIds { get; set; }
         public string[] Genres { get; set; }
     }
 }

+ 15 - 3
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[] { };
+        }
+    }
 }