diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-11-09 13:24:57 -0500 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-11-09 13:24:57 -0500 |
| commit | 1a80362a0f04c3cc571456af64f9de19c0c30d2a (patch) | |
| tree | 31916eea422d8ac861aa36a47cae832eee168ad8 /MediaBrowser.Api/FilterService.cs | |
| parent | 40897bac1494791e1ec6abcfe85cda27d4664a32 (diff) | |
created common startup project for mono & windows
Diffstat (limited to 'MediaBrowser.Api/FilterService.cs')
| -rw-r--r-- | MediaBrowser.Api/FilterService.cs | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/MediaBrowser.Api/FilterService.cs b/MediaBrowser.Api/FilterService.cs new file mode 100644 index 000000000..fb51b2bdd --- /dev/null +++ b/MediaBrowser.Api/FilterService.cs @@ -0,0 +1,112 @@ +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Net; +using MediaBrowser.Model.Querying; +using ServiceStack; +using System; +using System.Linq; +using System.Threading.Tasks; + +namespace MediaBrowser.Api +{ + [Route("/Items/Filters", "GET", Summary = "Gets branding configuration")] + public class GetQueryFilters : IReturn<QueryFilters> + { + /// <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); + } + } + + [Authenticated] + public class FilterService : BaseApiService + { + private readonly ILibraryManager _libraryManager; + private readonly IUserManager _userManager; + + public FilterService(ILibraryManager libraryManager, IUserManager userManager) + { + _libraryManager = libraryManager; + _userManager = userManager; + } + + public async Task<object> Get(GetQueryFilters request) + { + var parentItem = string.IsNullOrEmpty(request.ParentId) ? null : _libraryManager.GetItemById(request.ParentId); + var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null; + + var item = string.IsNullOrEmpty(request.ParentId) ? + user == null ? _libraryManager.RootFolder : user.RootFolder : + parentItem; + + var result = await ((Folder)item).GetItems(GetItemsQuery(request, user)); + + return ToOptimizedResult(GetFilters(result.Items)); + } + + private QueryFilters GetFilters(BaseItem[] items) + { + var result = new QueryFilters(); + + result.Years = items.Select(i => i.ProductionYear ?? -1) + .Where(i => i > 0) + .Distinct() + .OrderBy(i => i) + .ToArray(); + + result.Genres = items.SelectMany(i => i.Genres) + .Distinct(StringComparer.OrdinalIgnoreCase) + .OrderBy(i => i) + .ToArray(); + + result.Tags = items.OfType<IHasTags>() + .SelectMany(i => i.Tags) + .Distinct(StringComparer.OrdinalIgnoreCase) + .OrderBy(i => i) + .ToArray(); + + result.OfficialRatings = items + .Select(i => i.OfficialRating) + .Where(i => !string.IsNullOrWhiteSpace(i)) + .Distinct(StringComparer.OrdinalIgnoreCase) + .OrderBy(i => i) + .ToArray(); + + return result; + } + + private InternalItemsQuery GetItemsQuery(GetQueryFilters request, User user) + { + var query = new InternalItemsQuery + { + User = user, + MediaTypes = request.GetMediaTypes(), + IncludeItemTypes = request.GetIncludeItemTypes(), + Recursive = true + }; + + return query; + } + } +} |
