diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-10-06 19:58:46 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-10-06 19:58:46 -0400 |
| commit | f02f3222085311b2a2cacab6642ad987a4176e65 (patch) | |
| tree | 9f317e5a3f087d4b4c5e523a8d8552d7d248567e /MediaBrowser.Api | |
| parent | a9eed234ba2a366fe014f0cc6f462c3764528948 (diff) | |
remove mono compiler directives
Diffstat (limited to 'MediaBrowser.Api')
| -rw-r--r-- | MediaBrowser.Api/ApiEntryPoint.cs | 23 | ||||
| -rw-r--r-- | MediaBrowser.Api/Movies/MoviesService.cs | 29 | ||||
| -rw-r--r-- | MediaBrowser.Api/Playback/BaseStreamingService.cs | 11 | ||||
| -rw-r--r-- | MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs | 15 | ||||
| -rw-r--r-- | MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs | 4 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs | 3 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs | 17 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/ItemsService.cs | 710 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/PersonsService.cs | 11 |
9 files changed, 528 insertions, 295 deletions
diff --git a/MediaBrowser.Api/ApiEntryPoint.cs b/MediaBrowser.Api/ApiEntryPoint.cs index 435bca0b8c..2e9323e034 100644 --- a/MediaBrowser.Api/ApiEntryPoint.cs +++ b/MediaBrowser.Api/ApiEntryPoint.cs @@ -316,14 +316,14 @@ namespace MediaBrowser.Api /// <param name="deleteFiles">The delete files.</param> /// <returns>Task.</returns> /// <exception cref="ArgumentNullException">deviceId</exception> - internal Task KillTranscodingJobs(string deviceId, Func<string, bool> deleteFiles) + internal void KillTranscodingJobs(string deviceId, Func<string, bool> deleteFiles) { if (string.IsNullOrEmpty(deviceId)) { throw new ArgumentNullException("deviceId"); } - return KillTranscodingJobs(j => string.Equals(deviceId, j.DeviceId, StringComparison.OrdinalIgnoreCase), deleteFiles); + KillTranscodingJobs(j => string.Equals(deviceId, j.DeviceId, StringComparison.OrdinalIgnoreCase), deleteFiles); } /// <summary> @@ -332,7 +332,7 @@ namespace MediaBrowser.Api /// <param name="killJob">The kill job.</param> /// <param name="deleteFiles">The delete files.</param> /// <returns>Task.</returns> - internal async Task KillTranscodingJobs(Func<TranscodingJob, bool> killJob, Func<string, bool> deleteFiles) + internal void KillTranscodingJobs(Func<TranscodingJob, bool> killJob, Func<string, bool> deleteFiles) { var jobs = new List<TranscodingJob>(); @@ -348,18 +348,9 @@ namespace MediaBrowser.Api return; } - await TranscodingStartLock.WaitAsync(CancellationToken.None).ConfigureAwait(false); - - try - { - foreach (var job in jobs) - { - KillTranscodingJob(job, deleteFiles); - } - } - finally + foreach (var job in jobs) { - TranscodingStartLock.Release(); + KillTranscodingJob(job, deleteFiles); } } @@ -501,7 +492,7 @@ namespace MediaBrowser.Api } catch (FileNotFoundException) { - + } catch (IOException ex) { @@ -563,7 +554,7 @@ namespace MediaBrowser.Api public long? BytesDownloaded { get; set; } public long? BytesTranscoded { get; set; } - + public long? TranscodingPositionTicks { get; set; } public long? DownloadPositionTicks { get; set; } diff --git a/MediaBrowser.Api/Movies/MoviesService.cs b/MediaBrowser.Api/Movies/MoviesService.cs index 46b4c06722..ef86a46e8a 100644 --- a/MediaBrowser.Api/Movies/MoviesService.cs +++ b/MediaBrowser.Api/Movies/MoviesService.cs @@ -126,8 +126,14 @@ namespace MediaBrowser.Api.Movies movies = _libraryManager.ReplaceVideosWithPrimaryVersions(movies); + var listEligibleForCategories = new List<BaseItem>(); + var listEligibleForSuggestion = new List<BaseItem> (); + var list = movies.ToList(); + listEligibleForCategories.AddRange(list); + listEligibleForSuggestion.AddRange(list); + if (user.Configuration.IncludeTrailersInSuggestions) { var trailerResult = await _channelManager.GetAllMediaInternal(new AllChannelMediaQuery @@ -138,17 +144,20 @@ namespace MediaBrowser.Api.Movies }, CancellationToken.None).ConfigureAwait(false); - var newTrailers = trailerResult.Items; + listEligibleForSuggestion.AddRange(trailerResult.Items); + } - list.AddRange(newTrailers); + listEligibleForCategories = listEligibleForCategories + .DistinctBy(i => i.Name, StringComparer.OrdinalIgnoreCase) + .DistinctBy(i => i.GetProviderId(MetadataProviders.Imdb) ?? Guid.NewGuid().ToString(), StringComparer.OrdinalIgnoreCase) + .ToList(); - list = list - .DistinctBy(i => i.Name, StringComparer.OrdinalIgnoreCase) - .DistinctBy(i => i.GetProviderId(MetadataProviders.Imdb) ?? Guid.NewGuid().ToString(), StringComparer.OrdinalIgnoreCase) - .ToList(); - } + listEligibleForSuggestion = listEligibleForSuggestion + .DistinctBy(i => i.Name, StringComparer.OrdinalIgnoreCase) + .DistinctBy(i => i.GetProviderId(MetadataProviders.Imdb) ?? Guid.NewGuid().ToString(), StringComparer.OrdinalIgnoreCase) + .ToList(); - var result = GetRecommendationCategories(user, list, request.CategoryLimit, request.ItemLimit, request.GetItemFields().ToList()); + var result = GetRecommendationCategories(user, listEligibleForCategories, listEligibleForSuggestion, request.CategoryLimit, request.ItemLimit, request.GetItemFields().ToList()); return ToOptimizedResult(result); } @@ -210,11 +219,11 @@ namespace MediaBrowser.Api.Movies return result; } - private IEnumerable<RecommendationDto> GetRecommendationCategories(User user, List<BaseItem> allMovies, int categoryLimit, int itemLimit, List<ItemFields> fields) + private IEnumerable<RecommendationDto> GetRecommendationCategories(User user, List<BaseItem> allMoviesForCategories, List<BaseItem> allMovies, int categoryLimit, int itemLimit, List<ItemFields> fields) { var categories = new List<RecommendationDto>(); - var recentlyPlayedMovies = allMovies + var recentlyPlayedMovies = allMoviesForCategories .Select(i => { var userdata = _userDataRepository.GetUserData(user.Id, i.GetUserDataKey()); diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index cb95049ce1..734b6a9394 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -1645,6 +1645,17 @@ namespace MediaBrowser.Api.Playback { state.OutputVideoCodec = GetVideoCodec(videoRequest); state.OutputVideoBitrate = GetVideoBitrateParamValue(state.VideoRequest, state.VideoStream); + + if (state.OutputVideoBitrate.HasValue) + { + var resolution = ResolutionNormalizer.Normalize(state.OutputVideoBitrate.Value, + state.OutputVideoCodec, + videoRequest.MaxWidth, + videoRequest.MaxHeight); + + videoRequest.MaxWidth = resolution.MaxWidth; + videoRequest.MaxHeight = resolution.MaxHeight; + } } ApplyDeviceProfileSettings(state); diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs index 2035aff164..b99657c30f 100644 --- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs @@ -139,7 +139,7 @@ namespace MediaBrowser.Api.Playback.Hls // If the playlist doesn't already exist, startup ffmpeg try { - await ApiEntryPoint.Instance.KillTranscodingJobs(j => j.Type == TranscodingJobType.Hls && string.Equals(j.DeviceId, request.DeviceId, StringComparison.OrdinalIgnoreCase), p => !string.Equals(p, playlistPath, StringComparison.OrdinalIgnoreCase)).ConfigureAwait(false); + ApiEntryPoint.Instance.KillTranscodingJobs(j => j.Type == TranscodingJobType.Hls && string.Equals(j.DeviceId, request.DeviceId, StringComparison.OrdinalIgnoreCase), p => !string.Equals(p, playlistPath, StringComparison.OrdinalIgnoreCase)); if (currentTranscodingIndex.HasValue) { @@ -157,7 +157,7 @@ namespace MediaBrowser.Api.Playback.Hls throw; } - await WaitForMinimumSegmentCount(playlistPath, 1, cancellationTokenSource.Token).ConfigureAwait(false); + await WaitForMinimumSegmentCount(playlistPath, 2, cancellationTokenSource.Token).ConfigureAwait(false); } } } @@ -402,8 +402,10 @@ namespace MediaBrowser.Api.Playback.Hls var queryStringIndex = Request.RawUrl.IndexOf('?'); var queryString = queryStringIndex == -1 ? string.Empty : Request.RawUrl.Substring(queryStringIndex); + var isLiveStream = (state.RunTimeTicks ?? 0) == 0; + // Main stream - var playlistUrl = (state.RunTimeTicks ?? 0) > 0 ? "main.m3u8" : "live.m3u8"; + var playlistUrl = isLiveStream ? "live.m3u8" : "main.m3u8"; playlistUrl += queryString; var request = (GetMasterHlsVideoStream)state.Request; @@ -418,7 +420,7 @@ namespace MediaBrowser.Api.Playback.Hls AppendPlaylist(builder, playlistUrl, totalBitrate, subtitleGroup); - if (EnableAdaptiveBitrateStreaming(state)) + if (EnableAdaptiveBitrateStreaming(state, isLiveStream)) { var requestedVideoBitrate = state.VideoRequest.VideoBitRate.Value; @@ -482,7 +484,7 @@ namespace MediaBrowser.Api.Playback.Hls } } - private bool EnableAdaptiveBitrateStreaming(StreamState state) + private bool EnableAdaptiveBitrateStreaming(StreamState state, bool isLiveStream) { // Within the local network this will likely do more harm than good. if (Request.IsLocal || NetworkManager.IsInLocalNetwork(Request.RemoteIp)) @@ -491,13 +493,12 @@ namespace MediaBrowser.Api.Playback.Hls } var request = state.Request as GetMasterHlsVideoStream; - if (request != null && !request.EnableAdaptiveBitrateStreaming) { return false; } - if (string.IsNullOrWhiteSpace(state.MediaPath)) + if (isLiveStream || string.IsNullOrWhiteSpace(state.MediaPath)) { // Opening live streams is so slow it's not even worth it return false; diff --git a/MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs b/MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs index a8d4c6b86f..2263a2b371 100644 --- a/MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs +++ b/MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs @@ -72,9 +72,7 @@ namespace MediaBrowser.Api.Playback.Hls public void Delete(StopEncodingProcess request) { - var task = ApiEntryPoint.Instance.KillTranscodingJobs(request.DeviceId, path => true); - - Task.WaitAll(task); + ApiEntryPoint.Instance.KillTranscodingJobs(request.DeviceId, path => true); } /// <summary> diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs index c2b8069cb2..15a2d5c337 100644 --- a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs +++ b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs @@ -3,6 +3,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Dto; +using MediaBrowser.Model.Entities; using MediaBrowser.Model.Querying; using ServiceStack; using System; @@ -101,7 +102,7 @@ namespace MediaBrowser.Api.UserLibrary filteredItems = FilterByLibraryItems(request, filteredItems, user, libraryItems); - filteredItems = ItemsService.ApplySortOrder(request, filteredItems, user, LibraryManager).Cast<TItemType>(); + filteredItems = LibraryManager.Sort(filteredItems, user, request.GetOrderBy(), request.SortOrder ?? SortOrder.Ascending).Cast<TItemType>(); var ibnItemsArray = filteredItems.ToList(); diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs b/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs index f236100147..3dcd4efbda 100644 --- a/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs +++ b/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs @@ -96,6 +96,21 @@ namespace MediaBrowser.Api.UserLibrary [ApiMember(Name = "IsPlayed", Description = "Optional filter by items that are played, or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")] public bool? IsPlayed { 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 string[] GetExcludeItemTypes() + { + return (ExcludeItemTypes ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + } + /// <summary> /// Gets the filters. /// </summary> @@ -132,7 +147,7 @@ namespace MediaBrowser.Api.UserLibrary /// Gets the order by. /// </summary> /// <returns>IEnumerable{ItemSortBy}.</returns> - public IEnumerable<string> GetOrderBy() + public string[] GetOrderBy() { var val = SortBy; diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index 2ac4f5e636..011864d35e 100644 --- a/MediaBrowser.Api/UserLibrary/ItemsService.cs +++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs @@ -16,6 +16,7 @@ using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; +using System.Threading.Tasks; namespace MediaBrowser.Api.UserLibrary { @@ -289,9 +290,9 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <param name="request">The request.</param> /// <returns>System.Object.</returns> - public object Get(GetItems request) + public async Task<object> Get(GetItems request) { - var result = GetItems(request); + var result = await GetItems(request).ConfigureAwait(false); return ToOptimizedSerializedResultUsingCache(result); } @@ -301,16 +302,27 @@ namespace MediaBrowser.Api.UserLibrary /// </summary> /// <param name="request">The request.</param> /// <returns>Task{ItemsResult}.</returns> - private ItemsResult GetItems(GetItems request) + private async Task<ItemsResult> GetItems(GetItems request) { var parentItem = string.IsNullOrEmpty(request.ParentId) ? null : _libraryManager.GetItemById(request.ParentId); var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null; - var items = GetItemsToSerialize(request, user, parentItem); + var result = await GetItemsToSerialize(request, user, parentItem).ConfigureAwait(false); - items = items.AsParallel(); + var isFiltered = result.Item2; - items = ApplyAdditionalFilters(request, items, user); + if (isFiltered) + { + var currentFields = request.GetItemFields().ToList(); + + return new ItemsResult + { + TotalRecordCount = result.Item1.TotalRecordCount, + Items = result.Item1.Items.Select(i => _dtoService.GetBaseItemDto(i, currentFields, user)).ToArray() + }; + } + + var items = result.Item1.Items.Where(i => ApplyAdditionalFilters(request, i, user, false)); // Apply filters // Run them starting with the ones that are likely to reduce the list the most @@ -321,16 +333,14 @@ namespace MediaBrowser.Api.UserLibrary items = FilterVirtualEpisodes(request, items, user); - items = items.AsEnumerable(); - if (CollapseBoxSetItems(request, parentItem, user)) { items = _collectionManager.CollapseItemsWithinBoxSets(items, user); } items = ApplyPostCollectionCollapseFilters(request, items, user); - - items = ApplySortOrder(request, items, user, _libraryManager); + + items = _libraryManager.Sort(items, user, request.GetOrderBy(), request.SortOrder ?? SortOrder.Ascending); // This must be the last filter if (!string.IsNullOrEmpty(request.AdjacentTo)) @@ -387,8 +397,7 @@ namespace MediaBrowser.Api.UserLibrary /// <param name="user">The user.</param> /// <param name="parentItem">The parent item.</param> /// <returns>IEnumerable{BaseItem}.</returns> - /// <exception cref="System.InvalidOperationException"></exception> - private IEnumerable<BaseItem> GetItemsToSerialize(GetItems request, User user, BaseItem parentItem) + private async Task<Tuple<QueryResult<BaseItem>, bool>> GetItemsToSerialize(GetItems request, User user, BaseItem parentItem) { var item = string.IsNullOrEmpty(request.ParentId) ? user == null ? _libraryManager.RootFolder : user.RootFolder : @@ -406,19 +415,40 @@ namespace MediaBrowser.Api.UserLibrary else if (request.Recursive) { - items = user == null ? - ((Folder)item).RecursiveChildren : - ((Folder)item).GetRecursiveChildren(user); + if (user == null) + { + items = ((Folder)item).RecursiveChildren; + + items = _libraryManager.ReplaceVideosWithPrimaryVersions(items); + } + else + { + var result = await ((Folder)item).GetItems(GetItemsQuery(request, user)); - items = _libraryManager.ReplaceVideosWithPrimaryVersions(items); + return new Tuple<QueryResult<BaseItem>, bool>(result, true); + } } else { - items = user == null ? - ((Folder)item).Children : - ((Folder)item).GetChildren(user, true); + if (user == null) + { + items = ((Folder)item).Children; + + items = _libraryManager.ReplaceVideosWithPrimaryVersions(items); + } + else + { + var userRoot = item as UserRootFolder; + + if (userRoot == null) + { + var result = await ((Folder)item).GetItems(GetItemsQuery(request, user)); + + return new Tuple<QueryResult<BaseItem>, bool>(result, true); + } - items = _libraryManager.ReplaceVideosWithPrimaryVersions(items); + items = ((Folder)item).GetChildren(user, true); + } } if (request.IncludeIndexContainers) @@ -430,25 +460,72 @@ namespace MediaBrowser.Api.UserLibrary list.AddRange(containers); - return list.Distinct(); + items = list.Distinct(); } - return items; + return new Tuple<QueryResult<BaseItem>, bool>(new QueryResult<BaseItem> + { + Items = items.ToArray() + + }, false); } - /// <summary> - /// Applies sort order - /// </summary> - /// <param name="request">The request.</param> - /// <param name="items">The items.</param> - /// <param name="user">The user.</param> - /// <param name="libraryManager">The library manager.</param> - /// <returns>IEnumerable{BaseItem}.</returns> - internal static IEnumerable<BaseItem> ApplySortOrder(BaseItemsRequest request, IEnumerable<BaseItem> items, User user, ILibraryManager libraryManager) + private InternalItemsQuery GetItemsQuery(GetItems request, User user) { - var orderBy = request.GetOrderBy().ToList(); + var query = new InternalItemsQuery + { + User = user, + IsPlayed = request.IsPlayed, + MediaTypes = request.GetMediaTypes(), + IncludeItemTypes = request.GetIncludeItemTypes(), + ExcludeItemTypes = request.GetExcludeItemTypes(), + Recursive = request.Recursive, + SortBy = request.GetOrderBy(), + SortOrder = request.SortOrder ?? SortOrder.Ascending, + + Filter = (i, u) => ApplyAdditionalFilters(request, i, u, true), + + Limit = request.Limit, + StartIndex = request.StartIndex + }; + + 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.IsRecentlyAdded: + break; + case ItemFilter.IsResumable: + query.IsResumable = true; + break; + case ItemFilter.IsUnplayed: + query.IsPlayed = false; + break; + case ItemFilter.Likes: + query.IsLiked = true; + break; + } + } - return orderBy.Count == 0 ? items : libraryManager.Sort(items, user, orderBy, request.SortOrder ?? SortOrder.Ascending); + return query; } /// <summary> @@ -648,36 +725,70 @@ namespace MediaBrowser.Api.UserLibrary return items; } - /// <summary> - /// Applies the additional filters. - /// </summary> - /// <param name="request">The request.</param> - /// <param name="items">The items.</param> - /// <returns>IEnumerable{BaseItem}.</returns> - private IEnumerable<BaseItem> ApplyAdditionalFilters(GetItems request, IEnumerable<BaseItem> items, User user) + private bool ApplyAdditionalFilters(GetItems request, BaseItem i, User user, bool isPreFiltered) { + if (!isPreFiltered) + { + var mediaTypes = request.GetMediaTypes(); + if (mediaTypes.Length > 0) + { + if (!(!string.IsNullOrEmpty(i.MediaType) && mediaTypes.Contains(i.MediaType, StringComparer.OrdinalIgnoreCase))) + { + return false; + } + } + + if (request.IsPlayed.HasValue) + { + var val = request.IsPlayed.Value; + if (i.IsPlayed(user) != val) + { + return false; + } + } + + // Exclude item types + var excluteItemTypes = request.GetExcludeItemTypes(); + if (excluteItemTypes.Length > 0 && excluteItemTypes.Contains(i.GetType().Name, StringComparer.OrdinalIgnoreCase)) + { + return false; + } + + // Include item types + var includeItemTypes = request.GetIncludeItemTypes(); + if (includeItemTypes.Length > 0 && !includeItemTypes.Contains(i.GetType().Name, StringComparer.OrdinalIgnoreCase)) + { + return false; + } + } + if (request.MinCommunityRating.HasValue) { var val = request.MinCommunityRating.Value; - items = items.Where(i => i.CommunityRating.HasValue && i.CommunityRating >= val); + if (!(i.CommunityRating.HasValue && i.CommunityRating >= val)) + { + return false; + } } if (request.MinCriticRating.HasValue) { var val = request.MinCriticRating.Value; - items = items.Where(i => - { - var hasCriticRating = i as IHasCriticRating; + var hasCriticRating = i as IHasCriticRating; - if (hasCriticRating != null) + if (hasCriticRating != null) + { + if (!(hasCriticRating.CriticRating.HasValue && hasCriticRating.CriticRating >= val)) { - return hasCriticRating.CriticRating.HasValue && hasCriticRating.CriticRating >= val; + return false; } - + } + else + { return false; - }); + } } // Artists @@ -685,12 +796,12 @@ namespace MediaBrowser.Api.UserLibrary { var artists = request.Artists.Split('|'); - items = items.Where(i => - { - var audio = i as IHasArtist; + var audio = i as IHasArtist; - return audio != null && artists.Any(audio.HasArtist); - }); + if (!(audio != null && artists.Any(audio.HasArtist))) + { + return false; + } } // Albums @@ -698,37 +809,46 @@ namespace MediaBrowser.Api.UserLibrary { var albums = request.Albums.Split('|'); - items = items.Where(i => - { - var audio = i as Audio; + var audio = i as Audio; - if (audio != null) + if (audio != null) + { + if (!albums.Any(a => string.Equals(a, audio.Album, StringComparison.OrdinalIgnoreCase))) { - return albums.Any(a => string.Equals(a, audio.Album, StringComparison.OrdinalIgnoreCase)); + return false; } + } - var album = i as MusicAlbum; + var album = i as MusicAlbum; - if (album != null) + if (album != null) + { + if (!albums.Any(a => string.Equals(a, album.Name, StringComparison.OrdinalIgnoreCase))) { - return albums.Any(a => string.Equals(a, album.Name, StringComparison.OrdinalIgnoreCase)); + return false; } + } - var musicVideo = i as MusicVideo; + var musicVideo = i as MusicVideo; - if (musicVideo != null) + if (musicVideo != null) + { + if (!albums.Any(a => string.Equals(a, musicVideo.Album, StringComparison.OrdinalIgnoreCase))) { - return albums.Any(a => string.Equals(a, musicVideo.Album, StringComparison.OrdinalIgnoreCase)); + return false; } + } - return false; - }); + return false; } // Min index number if (request.MinIndexNumber.HasValue) { - items = items.Where(i => i.IndexNumber.HasValue && i.IndexNumber.Value >= request.MinIndexNumber.Value); + if (!(i.IndexNumber.HasValue && i.IndexNumber.Value >= request.MinIndexNumber.Value)) + { + return false; + } } // Min official rating @@ -738,24 +858,22 @@ namespace MediaBrowser.Api.UserLibrary if (level.HasValue) { - items = items.Where(i => + var rating = i.CustomRating; + + if (string.IsNullOrEmpty(rating)) { - var rating = i.CustomRating; + rating = i.OfficialRating; + } - if (string.IsNullOrEmpty(rating)) - { - rating = i.OfficialRating; - } + if (!string.IsNullOrEmpty(rating)) + { + var itemLevel = _localization.GetRatingLevel(rating); - if (string.IsNullOrEmpty(rating)) + if (!(!itemLevel.HasValue || itemLevel.Value >= level.Value)) { - return true; + return false; } - - var itemLevel = _localization.GetRatingLevel(rating); - - return !itemLevel.HasValue || itemLevel.Value >= level.Value; - }); + } } } @@ -766,60 +884,54 @@ namespace MediaBrowser.Api.UserLibrary if (level.HasValue) { - items = items.Where(i => + var rating = i.CustomRating; + + if (string.IsNullOrEmpty(rating)) { - var rating = i.CustomRating; + rating = i.OfficialRating; + } - if (string.IsNullOrEmpty(rating)) - { - rating = i.OfficialRating; - } + if (!string.IsNullOrEmpty(rating)) + { + var itemLevel = _localization.GetRatingLevel(rating); - if (string.IsNullOrEmpty(rating)) + if (!(!itemLevel.HasValue || itemLevel.Value <= level.Value)) { - return true; + return false; } - - var itemLevel = _localization.GetRatingLevel(rating); - - return !itemLevel.HasValue || itemLevel.Value <= level.Value; - }); + } } } - // Exclude item types - if (!string.IsNullOrEmpty(request.ExcludeItemTypes)) - { - var vals = request.ExcludeItemTypes.Split(','); - items = items.Where(f => !vals.Contains(f.GetType().Name, StringComparer.OrdinalIgnoreCase)); - } - - // Include item types - if (!string.IsNullOrEmpty(request.IncludeItemTypes)) - { - var vals = request.IncludeItemTypes.Split(','); - items = items.Where(f => vals.Contains(f.GetType().Name, StringComparer.OrdinalIgnoreCase)); - } - // LocationTypes if (!string.IsNullOrEmpty(request.LocationTypes)) { var vals = request.LocationTypes.Split(','); - items = items.Where(f => vals.Contains(f.LocationType.ToString(), StringComparer.OrdinalIgnoreCase)); + if (!vals.Contains(i.LocationType.ToString(), StringComparer.OrdinalIgnoreCase)) + { + return false; + } } // ExcludeLocationTypes if (!string.IsNullOrEmpty(request.ExcludeLocationTypes)) { var vals = request.ExcludeLocationTypes.Split(','); - items = items.Where(f => !vals.Contains(f.LocationType.ToString(), StringComparer.OrdinalIgnoreCase)); + if (vals.Contains(i.LocationType.ToString(), StringComparer.OrdinalIgnoreCase)) + { + return false; + } } if (!string.IsNullOrEmpty(request.AlbumArtistStartsWithOrGreater)) { - items = items.OfType<IHasAlbumArtist>() - .Where(i => string.Compare(request.AlbumArtistStartsWithOrGreater, i.AlbumArtists.FirstOrDefault(), StringComparison.CurrentCultureIgnoreCase) < 1) - .Cast<BaseItem>(); + var ok = new[] { i }.OfType<IHasAlbumArtist>() + .Any(p => string.Compare(request.AlbumArtistStartsWithOrGreater, p.AlbumArtists.FirstOrDefault(), StringComparison.CurrentCultureIgnoreCase) < 1); + + if (!ok) + { + return false; + } } // Filter by Series Status @@ -827,7 +939,12 @@ namespace MediaBrowser.Api.UserLibrary { var vals = request.SeriesStatus.Split(','); - items = items.OfType<Series>().Where(i => i.Status.HasValue && vals.Contains(i.Status.Value.ToString(), StringComparer.OrdinalIgnoreCase)); + var ok = new[] { i }.OfType<Series>().Any(p => p.Status.HasValue && vals.Contains(p.Status.Value.ToString(), StringComparer.OrdinalIgnoreCase)); + + if (!ok) + { + return false; + } } // Filter by Series AirDays @@ -835,13 +952,24 @@ namespace MediaBrowser.Api.UserLibrary { var days = request.AirDays.Split(',').Select(d => (DayOfWeek)Enum.Parse(typeof(DayOfWeek), d, true)); - items = items.OfType<Series>().Where(i => i.AirDays != null && days.Any(d => i.AirDays.Contains(d))); + var ok = new[] { i }.OfType<Series>().Any(p => p.AirDays != null && days.Any(d => p.AirDays.Contains(d))); + + if (!ok) + { + return false; + } } // Filter by Video3DFormat if (request.Is3D.HasValue) { - items = items.OfType<Video>().Where(i => request.Is3D.Value == i.Video3DFormat.HasValue); + var val = request.Is3D.Value; + var video = i as Video; + + if (video == null || val != video.Video3DFormat.HasValue) + { + return false; + } } // Filter by VideoType @@ -849,48 +977,60 @@ namespace MediaBrowser.Api.UserLibrary { var types = request.VideoTypes.Split(','); - items = items.OfType<Video>().Where(i => types.Contains(i.VideoType.ToString(), StringComparer.OrdinalIgnoreCase)); - } - - if (!string.IsNullOrEmpty(request.MediaTypes)) - { - var types = request.MediaTypes.Split(','); - - items = items.Where(i => !string.IsNullOrEmpty(i.MediaType) && types.Contains(i.MediaType, StringComparer.OrdinalIgnoreCase)); + var video = i as Video; + if (video == null || !types.Contains(video.VideoType.ToString(), StringComparer.OrdinalIgnoreCase)) + { + return false; + } } var imageTypes = request.GetImageTypes().ToList(); if (imageTypes.Count > 0) { - items = items.Where(item => imageTypes.Any(imageType => HasImage(item, imageType))); + if (!(imageTypes.Any(imageType => HasImage(i, imageType)))) + { + return false; + } } // Apply genre filter if (!string.IsNullOrEmpty(request.Genres)) { var vals = request.Genres.Split('|'); - items = items.Where(f => vals.Any(v => f.Genres.Contains(v, StringComparer.OrdinalIgnoreCase))); + if (!(vals.Any(v => i.Genres.Contains(v, StringComparer.OrdinalIgnoreCase)))) + { + return false; + } } // Apply genre filter if (!string.IsNullOrEmpty(request.AllGenres)) { var vals = request.AllGenres.Split('|'); - items = items.Where(f => vals.All(v => f.Genres.Contains(v, StringComparer.OrdinalIgnoreCase))); + if (!vals.All(v => i.Genres.Contains(v, StringComparer.OrdinalIgnoreCase))) + { + return false; + } } // Apply studio filter if (!string.IsNullOrEmpty(request.Studios)) { var vals = request.Studios.Split('|'); - items = items.Where(f => vals.Any(v => f.Studios.Contains(v, StringComparer.OrdinalIgnoreCase))); + if (!vals.Any(v => i.Studios.Contains(v, StringComparer.OrdinalIgnoreCase))) + { + return false; + } } // Apply year filter if (!string.IsNullOrEmpty(request.Years)) { var vals = request.Years.Split(',').Select(int.Parse).ToList(); - items = items.Where(f => f.ProductionYear.HasValue && vals.Contains(f.ProductionYear.Value)); + if (!(i.ProductionYear.HasValue && vals.Contains(i.ProductionYear.Value))) + { + return false; + } } // Apply person filter @@ -900,316 +1040,380 @@ namespace MediaBrowser.Api.UserLibrary if (string.IsNullOrEmpty(personTypes)) { - items = items.Where(item => item.People.Any(p => string.Equals(p.Name, request.Person, StringComparison.OrdinalIgnoreCase))); + if (!(i.People.Any(p => string.Equals(p.Name, request.Person, StringComparison.OrdinalIgnoreCase)))) + { + return false; + } } else { var types = personTypes.Split(','); - items = items.Where(item => + var ok = new[] { i }.Any(item => item.People != null && item.People.Any(p => p.Name.Equals(request.Person, StringComparison.OrdinalIgnoreCase) && (types.Contains(p.Type, StringComparer.OrdinalIgnoreCase) || types.Contains(p.Role, StringComparer.OrdinalIgnoreCase)))); + + if (!ok) + { + return false; + } } } if (request.HasTrailer.HasValue) { var val = request.HasTrailer.Value; - items = items.Where(i => + var trailerCount = 0; + + var hasTrailers = i as IHasTrailers; + if (hasTrailers != null) { - var trailerCount = 0; + trailerCount = hasTrailers.LocalTrailerIds.Count; + } - var hasTrailers = i as IHasTrailers; - if (hasTrailers != null) - { - trailerCount = hasTrailers.LocalTrailerIds.Count; - } + var ok = val ? trailerCount > 0 : trailerCount == 0; - return val ? trailerCount > 0 : trailerCount == 0; - }); + if (!ok) + { + return false; + } } if (request.HasThemeSong.HasValue) { var filterValue = request.HasThemeSong.Value; - items = items.Where(i => + var themeCount = 0; + var iHasThemeMedia = i as IHasThemeMedia; + + if (iHasThemeMedia != null) { - var themeCount = 0; - var iHasThemeMedia = i as IHasThemeMedia; + themeCount = iHasThemeMedia.ThemeSongIds.Count; + } + var ok = filterValue ? themeCount > 0 : themeCount == 0; - if (iHasThemeMedia != null) - { - themeCount = iHasThemeMedia.ThemeSongIds.Count; - } - return filterValue ? themeCount > 0 : themeCount == 0; - }); + if (!ok) + { + return false; + } } if (request.HasThemeVideo.HasValue) { var filterValue = request.HasThemeVideo.Value; - items = items.Where(i => + var themeCount = 0; + var iHasThemeMedia = i as IHasThemeMedia; + + if (iHasThemeMedia != null) { - var themeCount = 0; - var iHasThemeMedia = i as IHasThemeMedia; + themeCount = iHasThemeMedia.ThemeVideoIds.Count; + } + var ok = filterValue ? themeCount > 0 : themeCount == 0; - if (iHasThemeMedia != null) - { - themeCount = iHasThemeMedia.ThemeVideoIds.Count; - } - return filterValue ? themeCount > 0 : themeCount == 0; - }); + if (!ok) + { + return false; + } } if (request.MinPlayers.HasValue) { var filterValue = request.MinPlayers.Value; - items = items.Where(i => + var game = i as Game; + + if (game != null) { - var game = i as Game; + var players = game.PlayersSupported ?? 1; - if (game != null) - { - var players = game.PlayersSupported ?? 1; + var ok = players >= filterValue; - return players >= filterValue; + if (!ok) + { + return false; } - + } + else + { return false; - }); + } } if (request.MaxPlayers.HasValue) { var filterValue = request.MaxPlayers.Value; - items = items.Where(i => + var game = i as Game; + + if (game != null) { - var game = i as Game; + var players = game.PlayersSupported ?? 1; - if (game != null) - { - var players = game.PlayersSupported ?? 1; + var ok = players <= filterValue; - return players <= filterValue; + if (!ok) + { + return false; } - + } + else + { return false; - }); + } } if (request.HasSpecialFeature.HasValue) { var filterValue = request.HasSpecialFeature.Value; - items = items.Where(i => + var movie = i as IHasSpecialFeatures; + + if (movie != null) { - var movie = i as IHasSpecialFeatures; + var ok = filterValue + ? movie.SpecialFeatureIds.Count > 0 + : movie.SpecialFeatureIds.Count == 0; - if (movie != null) + if (!ok) { - return filterValue - ? movie.SpecialFeatureIds.Count > 0 - : movie.SpecialFeatureIds.Count == 0; + return false; } - + } + else + { return false; - }); + } } if (request.HasSubtitles.HasValue) { var val = request.HasSubtitles.Value; - items = items.OfType<Video>().Where(i => val == i.HasSubtitles); + var video = i as Video; + + if (video == null || val != video.HasSubtitles) + { + return false; + } } if (request.HasParentalRating.HasValue) { var val = request.HasParentalRating.Value; - items = items.Where(i => + var rating = i.CustomRating; + + if (string.IsNullOrEmpty(rating)) { - var rating = i.CustomRating; + rating = i.OfficialRating; + } + if (val) + { if (string.IsNullOrEmpty(rating)) { - rating = i.OfficialRating; + return false; } - - if (val) + } + else + { + if (!string.IsNullOrEmpty(rating)) { - return !string.IsNullOrEmpty(rating); + return false; } - - return string.IsNullOrEmpty(rating); - }); + } } if (request.IsHD.HasValue) { var val = request.IsHD.Value; - items = items.OfType<Video>().Where(i => i.IsHD == val); + var video = i as Video; + + if (video == null || val != video.IsHD) + { + return false; + } } if (request.IsInBoxSet.HasValue) { var val = request.IsHD.Value; - items = items.Where(i => i.Parents.OfType<BoxSet>().Any() == val); - } - - if (request.IsPlayed.HasValue) - { - var val = request.IsPlayed.Value; - items = items.Where(i => i.IsPlayed(user) == val); + if (i.Parents.OfType<BoxSet>().Any() != val) + { + return false; + } } if (request.IsUnidentified.HasValue) { var val = request.IsUnidentified.Value; - items = items.Where(i => i.IsUnidentified == val); + if (i.IsUnidentified != val) + { + return false; + } } if (request.IsLocked.HasValue) { var val = request.IsLocked.Value; - items = items.Where(i => i.IsLocked == val); + if (i.IsLocked != val) + { + return false; + } } if (request.ParentIndexNumber.HasValue) { var filterValue = request.ParentIndexNumber.Value; - items = items.Where(i => - { - var episode = i as Episode; + var episode = i as Episode; - if (episode != null) + if (episode != null) + { + if (episode.ParentIndexNumber.HasValue && episode.ParentIndexNumber.Value != filterValue) { - return episode.ParentIndexNumber.HasValue && episode.ParentIndexNumber.Value == filterValue; + return false; } + } - var song = i as Audio; + var song = i as Audio; - if (song != null) + if (song != null) + { + if (song.ParentIndexNumber.HasValue && song.ParentIndexNumber.Value != filterValue) { - return song.ParentIndexNumber.HasValue && song.ParentIndexNumber.Value == filterValue; + return false; } - - return true; - }); + } } if (request.AiredDuringSeason.HasValue) { - items = Series.FilterEpisodesBySeason(items.OfType<Episode>(), request.AiredDuringSeason.Value, true); + var episode = i as Episode; + + if (episode == null) + { + return false; + } + + if (!Series.FilterEpisodesBySeason(new[] { episode }, request.AiredDuringSeason.Value, true).Any()) + { + return false; + } } if (!string.IsNullOrEmpty(request.MinPremiereDate)) { var date = DateTime.Parse(request.MinPremiereDate, null, DateTimeStyles.RoundtripKind).ToUniversalTime(); - items = items.Where(i => i.PremiereDate.HasValue && i.PremiereDate.Value >= date); + if (!(i.PremiereDate.HasValue && i.PremiereDate.Value >= date)) + { + return false; + } } if (!string.IsNullOrEmpty(request.MaxPremiereDate)) { var date = DateTime.Parse(request.MaxPremiereDate, null, DateTimeStyles.RoundtripKind).ToUniversalTime(); - items = items.Where(i => i.PremiereDate.HasValue && i.PremiereDate.Value <= date); + if (!(i.PremiereDate.HasValue && i.PremiereDate.Value <= date)) + { + return false; + } } if (request.HasOverview.HasValue) { var filterValue = request.HasOverview.Value; - items = items.Where(i => - { - var hasValue = !string.IsNullOrEmpty(i.Overview); + var hasValue = !string.IsNullOrEmpty(i.Overview); - return hasValue == filterValue; - }); + if (hasValue != filterValue) + { + return false; + } } if (request.HasImdbId.HasValue) { var filterValue = request.HasImdbId.Value; - items = items.Where(i => - { - var hasValue = !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Imdb)); + var hasValue = !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Imdb)); - return hasValue == filterValue; - }); + if (hasValue != filterValue) + { + return false; + } } if (request.HasTmdbId.HasValue) { var filterValue = request.HasTmdbId.Value; - items = items.Where(i => - { - var hasValue = !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Tmdb)); + var hasValue = !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Tmdb)); - return hasValue == filterValue; - }); + if (hasValue != filterValue) + { + return false; + } } if (request.HasTvdbId.HasValue) { var filterValue = request.HasTvdbId.Value; - items = items.Where(i => - { - var hasValue = !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Tvdb)); + var hasValue = !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Tvdb)); - return hasValue == filterValue; - }); + if (hasValue != filterValue) + { + return false; + } } if (request.IsYearMismatched.HasValue) { var filterValue = request.IsYearMismatched.Value; - items = items.Where(i => IsYearMismatched(i) == filterValue); + if (IsYearMismatched(i) != filterValue) + { + return false; + } } if (request.HasOfficialRating.HasValue) { var filterValue = request.HasOfficialRating.Value; - items = items.Where(i => - { - var hasValue = !string.IsNullOrEmpty(i.OfficialRating); + var hasValue = !string.IsNullOrEmpty(i.OfficialRating); - return hasValue == filterValue; - }); + if (hasValue != filterValue) + { + return false; + } } if (request.IsPlaceHolder.HasValue) { var filterValue = request.IsPlaceHolder.Value; - items = items.Where(i => - { - var isPlaceHolder = false; + var isPlaceHolder = false; - var hasPlaceHolder = i as ISupportsPlaceHolders; + var hasPlaceHolder = i as ISupportsPlaceHolders; - if (hasPlaceHolder != null) - { - isPlaceHolder = hasPlaceHolder.IsPlaceHolder; - } + if (hasPlaceHolder != null) + { + isPlaceHolder = hasPlaceHolder.IsPlaceHolder; + } - return isPlaceHolder == filterValue; - }); + if (isPlaceHolder != filterValue) + { + return false; + } } - return items; + return true; } private IEnumerable<BaseItem> ApplyPostCollectionCollapseFilters(GetItems request, IEnumerable<BaseItem> items, User user) @@ -1230,7 +1434,7 @@ namespace MediaBrowser.Api.UserLibrary return items; } - + private bool IsYearMismatched(BaseItem item) { if (item.ProductionYear.HasValue) diff --git a/MediaBrowser.Api/UserLibrary/PersonsService.cs b/MediaBrowser.Api/UserLibrary/PersonsService.cs index cf9959e535..5651f2c73f 100644 --- a/MediaBrowser.Api/UserLibrary/PersonsService.cs +++ b/MediaBrowser.Api/UserLibrary/PersonsService.cs @@ -159,11 +159,14 @@ namespace MediaBrowser.Api.UserLibrary { var people = itemsList.SelectMany(i => i.People.OrderBy(p => p.SortOrder ?? int.MaxValue).ThenBy(p => p.Type)); - return personTypes.Length == 0 ? - - people : + if (personTypes.Length > 0) + { + people = people.Where(p => + personTypes.Contains(p.Type ?? string.Empty, StringComparer.OrdinalIgnoreCase) || + personTypes.Contains(p.Role ?? string.Empty, StringComparer.OrdinalIgnoreCase)); + } - people.Where(p => personTypes.Contains(p.Type ?? string.Empty, StringComparer.OrdinalIgnoreCase) || personTypes.Contains(p.Role ?? string.Empty, StringComparer.OrdinalIgnoreCase)); + return people; } } } |
