diff options
Diffstat (limited to 'MediaBrowser.Controller')
| -rw-r--r-- | MediaBrowser.Controller/Entities/Folder.cs | 420 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/InternalItemsQuery.cs | 1 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/Trailer.cs | 6 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/UserRootFolder.cs | 9 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/UserViewBuilder.cs | 40 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Library/ILibraryManager.cs | 21 |
6 files changed, 470 insertions, 27 deletions
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index e6db695aa..efb784153 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -15,6 +15,8 @@ using System.Threading; using System.Threading.Tasks; using CommonIO; using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.Playlists; using MediaBrowser.Model.Channels; namespace MediaBrowser.Controller.Entities @@ -795,6 +797,417 @@ namespace MediaBrowser.Controller.Entities return item; } + public QueryResult<BaseItem> QueryRecursive(InternalItemsQuery query) + { + var user = query.User; + + if (RequiresPostFiltering(query)) + { + IEnumerable<BaseItem> items; + Func<BaseItem, bool> filter = i => UserViewBuilder.Filter(i, user, query, UserDataManager, LibraryManager); + + if (query.User == null) + { + items = GetRecursiveChildren(filter); + } + else + { + items = GetRecursiveChildren(user, filter); + } + + return PostFilterAndSort(items, query); + } + + if (!(this is UserRootFolder) && !(this is AggregateFolder)) + { + query.ParentId = query.ParentId ?? Id; + } + + return LibraryManager.GetItemsResult(query); + } + + private bool RequiresPostFiltering(InternalItemsQuery query) + { + if (LinkedChildren.Count > 0) + { + if (!(this is ICollectionFolder)) + { + Logger.Debug("Query requires post-filtering due to LinkedChildren"); + return true; + } + } + + if (query.SortBy != null && query.SortBy.Length > 0) + { + if (query.SortBy.Contains(ItemSortBy.DatePlayed, StringComparer.OrdinalIgnoreCase)) + { + Logger.Debug("Query requires post-filtering due to ItemSortBy.DatePlayed"); + return true; + } + if (query.SortBy.Contains(ItemSortBy.IsFavoriteOrLiked, StringComparer.OrdinalIgnoreCase)) + { + Logger.Debug("Query requires post-filtering due to ItemSortBy.IsFavoriteOrLiked"); + return true; + } + if (query.SortBy.Contains(ItemSortBy.IsPlayed, StringComparer.OrdinalIgnoreCase)) + { + Logger.Debug("Query requires post-filtering due to ItemSortBy.IsPlayed"); + return true; + } + if (query.SortBy.Contains(ItemSortBy.IsUnplayed, StringComparer.OrdinalIgnoreCase)) + { + Logger.Debug("Query requires post-filtering due to ItemSortBy.IsUnplayed"); + return true; + } + if (query.SortBy.Contains(ItemSortBy.AiredEpisodeOrder, StringComparer.OrdinalIgnoreCase)) + { + Logger.Debug("Query requires post-filtering due to ItemSortBy.AiredEpisodeOrder"); + return true; + } + if (query.SortBy.Contains(ItemSortBy.Album, StringComparer.OrdinalIgnoreCase)) + { + Logger.Debug("Query requires post-filtering due to ItemSortBy.Album"); + return true; + } + if (query.SortBy.Contains(ItemSortBy.AlbumArtist, StringComparer.OrdinalIgnoreCase)) + { + Logger.Debug("Query requires post-filtering due to ItemSortBy.AlbumArtist"); + return true; + } + if (query.SortBy.Contains(ItemSortBy.Artist, StringComparer.OrdinalIgnoreCase)) + { + Logger.Debug("Query requires post-filtering due to ItemSortBy.Artist"); + return true; + } + if (query.SortBy.Contains(ItemSortBy.Budget, StringComparer.OrdinalIgnoreCase)) + { + Logger.Debug("Query requires post-filtering due to ItemSortBy.Budget"); + return true; + } + if (query.SortBy.Contains(ItemSortBy.CriticRating, StringComparer.OrdinalIgnoreCase)) + { + Logger.Debug("Query requires post-filtering due to ItemSortBy.CriticRating"); + return true; + } + if (query.SortBy.Contains(ItemSortBy.DateLastContentAdded, StringComparer.OrdinalIgnoreCase)) + { + Logger.Debug("Query requires post-filtering due to ItemSortBy.DateLastContentAdded"); + return true; + } + if (query.SortBy.Contains(ItemSortBy.GameSystem, StringComparer.OrdinalIgnoreCase)) + { + Logger.Debug("Query requires post-filtering due to ItemSortBy.GameSystem"); + return true; + } + if (query.SortBy.Contains(ItemSortBy.Metascore, StringComparer.OrdinalIgnoreCase)) + { + Logger.Debug("Query requires post-filtering due to ItemSortBy.Metascore"); + return true; + } + if (query.SortBy.Contains(ItemSortBy.OfficialRating, StringComparer.OrdinalIgnoreCase)) + { + Logger.Debug("Query requires post-filtering due to ItemSortBy.OfficialRating"); + return true; + } + if (query.SortBy.Contains(ItemSortBy.PlayCount, StringComparer.OrdinalIgnoreCase)) + { + Logger.Debug("Query requires post-filtering due to ItemSortBy.PlayCount"); + return true; + } + if (query.SortBy.Contains(ItemSortBy.Players, StringComparer.OrdinalIgnoreCase)) + { + Logger.Debug("Query requires post-filtering due to ItemSortBy.Players"); + return true; + } + if (query.SortBy.Contains(ItemSortBy.Revenue, StringComparer.OrdinalIgnoreCase)) + { + Logger.Debug("Query requires post-filtering due to ItemSortBy.Revenue"); + return true; + } + if (query.SortBy.Contains(ItemSortBy.SeriesSortName, StringComparer.OrdinalIgnoreCase)) + { + Logger.Debug("Query requires post-filtering due to ItemSortBy.SeriesSortName"); + return true; + } + if (query.SortBy.Contains(ItemSortBy.StartDate, StringComparer.OrdinalIgnoreCase)) + { + Logger.Debug("Query requires post-filtering due to ItemSortBy.StartDate"); + return true; + } + if (query.SortBy.Contains(ItemSortBy.Studio, StringComparer.OrdinalIgnoreCase)) + { + Logger.Debug("Query requires post-filtering due to ItemSortBy.Studio"); + return true; + } + if (query.SortBy.Contains(ItemSortBy.VideoBitRate, StringComparer.OrdinalIgnoreCase)) + { + Logger.Debug("Query requires post-filtering due to ItemSortBy.VideoBitRate"); + return true; + } + } + + if (query.PersonIds.Length > 0) + { + Logger.Debug("Query requires post-filtering due to PersonIds"); + return true; + } + + if (query.IsLiked.HasValue) + { + Logger.Debug("Query requires post-filtering due to IsLiked"); + return true; + } + + if (query.IsFavoriteOrLiked.HasValue) + { + Logger.Debug("Query requires post-filtering due to IsFavoriteOrLiked"); + return true; + } + + if (query.IsFavorite.HasValue) + { + Logger.Debug("Query requires post-filtering due to IsFavorite"); + return true; + } + + if (query.IsResumable.HasValue) + { + Logger.Debug("Query requires post-filtering due to IsResumable"); + return true; + } + + if (query.IsPlayed.HasValue) + { + Logger.Debug("Query requires post-filtering due to IsPlayed"); + return true; + } + + if (query.IsInBoxSet.HasValue) + { + Logger.Debug("Query requires post-filtering due to IsInBoxSet"); + return true; + } + + // Filter by Video3DFormat + if (query.Is3D.HasValue) + { + Logger.Debug("Query requires post-filtering due to Is3D"); + return true; + } + + if (query.HasOverview.HasValue) + { + Logger.Debug("Query requires post-filtering due to HasOverview"); + return true; + } + + if (query.HasImdbId.HasValue) + { + Logger.Debug("Query requires post-filtering due to HasImdbId"); + return true; + } + + if (query.HasTmdbId.HasValue) + { + Logger.Debug("Query requires post-filtering due to HasTmdbId"); + return true; + } + + if (query.HasTvdbId.HasValue) + { + Logger.Debug("Query requires post-filtering due to HasTvdbId"); + return true; + } + + if (query.IsYearMismatched.HasValue) + { + Logger.Debug("Query requires post-filtering due to IsYearMismatched"); + return true; + } + + if (query.HasOfficialRating.HasValue) + { + Logger.Debug("Query requires post-filtering due to HasOfficialRating"); + return true; + } + + if (query.IsPlaceHolder.HasValue) + { + Logger.Debug("Query requires post-filtering due to IsPlaceHolder"); + return true; + } + + if (query.HasSpecialFeature.HasValue) + { + Logger.Debug("Query requires post-filtering due to HasSpecialFeature"); + return true; + } + + if (query.HasSubtitles.HasValue) + { + Logger.Debug("Query requires post-filtering due to HasSubtitles"); + return true; + } + + if (query.HasTrailer.HasValue) + { + Logger.Debug("Query requires post-filtering due to HasTrailer"); + return true; + } + + if (query.HasThemeSong.HasValue) + { + Logger.Debug("Query requires post-filtering due to HasThemeSong"); + return true; + } + + if (query.HasThemeVideo.HasValue) + { + Logger.Debug("Query requires post-filtering due to HasThemeVideo"); + return true; + } + + // Filter by VideoType + if (query.VideoTypes.Length > 0) + { + Logger.Debug("Query requires post-filtering due to VideoTypes"); + return true; + } + + if (query.ImageTypes.Length > 0) + { + Logger.Debug("Query requires post-filtering due to ImageTypes"); + return true; + } + + // Apply studio filter + if (query.StudioIds.Length > 0) + { + Logger.Debug("Query requires post-filtering due to StudioIds"); + return true; + } + + // Apply genre filter + if (query.GenreIds.Length > 0) + { + Logger.Debug("Query requires post-filtering due to GenreIds"); + return true; + } + + // Apply year filter + if (query.Years.Length > 0) + { + Logger.Debug("Query requires post-filtering due to Years"); + return true; + } + + // Apply official rating filter + if (query.OfficialRatings.Length > 0) + { + Logger.Debug("Query requires post-filtering due to OfficialRatings"); + return true; + } + + // Apply person filter + if (query.ItemIdsFromPersonFilters != null) + { + Logger.Debug("Query requires post-filtering due to ItemIdsFromPersonFilters"); + return true; + } + + if (query.MinPlayers.HasValue) + { + Logger.Debug("Query requires post-filtering due to MinPlayers"); + return true; + } + + if (query.MaxPlayers.HasValue) + { + Logger.Debug("Query requires post-filtering due to MaxPlayers"); + return true; + } + + if (query.MinCommunityRating.HasValue) + { + Logger.Debug("Query requires post-filtering due to MinCommunityRating"); + return true; + } + + if (query.MinIndexNumber.HasValue) + { + Logger.Debug("Query requires post-filtering due to MinIndexNumber"); + return true; + } + + if (query.Years.Length > 0) + { + Logger.Debug("Query requires post-filtering due to Years"); + return true; + } + + if (query.OfficialRatings.Length > 0) + { + Logger.Debug("Query requires post-filtering due to OfficialRatings"); + return true; + } + + if (query.IsMissing.HasValue) + { + Logger.Debug("Query requires post-filtering due to IsMissing"); + return true; + } + + if (query.IsUnaired.HasValue) + { + Logger.Debug("Query requires post-filtering due to IsUnaired"); + return true; + } + + if (query.IsVirtualUnaired.HasValue) + { + Logger.Debug("Query requires post-filtering due to IsVirtualUnaired"); + return true; + } + + if (UserViewBuilder.CollapseBoxSetItems(query, this, query.User)) + { + Logger.Debug("Query requires post-filtering due to CollapseBoxSetItems"); + return true; + } + + if (!string.IsNullOrWhiteSpace(query.AdjacentTo)) + { + Logger.Debug("Query requires post-filtering due to AdjacentTo"); + return true; + } + + if (!string.IsNullOrWhiteSpace(query.NameContains)) + { + Logger.Debug("Query requires post-filtering due to NameContains"); + return true; + } + + if (!string.IsNullOrWhiteSpace(query.NameLessThan)) + { + Logger.Debug("Query requires post-filtering due to NameLessThan"); + return true; + } + + if (!string.IsNullOrWhiteSpace(query.NameStartsWith)) + { + Logger.Debug("Query requires post-filtering due to NameStartsWith"); + return true; + } + + if (!string.IsNullOrWhiteSpace(query.NameStartsWithOrGreater)) + { + Logger.Debug("Query requires post-filtering due to NameStartsWithOrGreater"); + return true; + } + + return false; + } + public virtual async Task<QueryResult<BaseItem>> GetItems(InternalItemsQuery query) { if (SourceType == SourceType.Channel) @@ -823,7 +1236,12 @@ namespace MediaBrowser.Controller.Entities }; } } - + + if (query.Recursive) + { + return QueryRecursive(query); + } + var user = query.User; Func<BaseItem, bool> filter = i => UserViewBuilder.Filter(i, user, query, UserDataManager, LibraryManager); diff --git a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs index 7b3e51cad..05031691c 100644 --- a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs +++ b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs @@ -83,6 +83,7 @@ namespace MediaBrowser.Controller.Entities public string[] OfficialRatings { get; set; } public DateTime? MinPremiereDate { get; set; } + public DateTime? MaxPremiereDate { get; set; } public DateTime? MinStartDate { get; set; } public DateTime? MaxStartDate { get; set; } public DateTime? MinEndDate { get; set; } diff --git a/MediaBrowser.Controller/Entities/Trailer.cs b/MediaBrowser.Controller/Entities/Trailer.cs index a4ac34545..43d95a8d3 100644 --- a/MediaBrowser.Controller/Entities/Trailer.cs +++ b/MediaBrowser.Controller/Entities/Trailer.cs @@ -35,6 +35,12 @@ namespace MediaBrowser.Controller.Entities public List<string> Keywords { get; set; } + [IgnoreDataMember] + public bool IsLocalTrailer + { + get { return TrailerTypes.Contains(TrailerType.LocalTrailer); } + } + /// <summary> /// Gets or sets the taglines. /// </summary> diff --git a/MediaBrowser.Controller/Entities/UserRootFolder.cs b/MediaBrowser.Controller/Entities/UserRootFolder.cs index daf590871..104408860 100644 --- a/MediaBrowser.Controller/Entities/UserRootFolder.cs +++ b/MediaBrowser.Controller/Entities/UserRootFolder.cs @@ -19,13 +19,9 @@ namespace MediaBrowser.Controller.Entities { public override async Task<QueryResult<BaseItem>> GetItems(InternalItemsQuery query) { - var user = query.User; - Func<BaseItem, bool> filter = i => UserViewBuilder.Filter(i, user, query, UserDataManager, LibraryManager); - if (query.Recursive) { - var items = query.User.RootFolder.GetRecursiveChildren(query.User, filter); - return PostFilterAndSort(items, query); + return QueryRecursive(query); } var result = await UserViewManager.GetUserViews(new UserViewQuery @@ -35,6 +31,9 @@ namespace MediaBrowser.Controller.Entities }, CancellationToken.None).ConfigureAwait(false); + var user = query.User; + Func<BaseItem, bool> filter = i => UserViewBuilder.Filter(i, user, query, UserDataManager, LibraryManager); + return PostFilterAndSort(result.Where(filter), query); } diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs index 721ec3f1b..4439b9c6d 100644 --- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs +++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs @@ -50,15 +50,15 @@ namespace MediaBrowser.Controller.Entities { var user = query.User; - if (query.IncludeItemTypes != null && - query.IncludeItemTypes.Length == 1 && - string.Equals(query.IncludeItemTypes[0], "Playlist", StringComparison.OrdinalIgnoreCase)) - { - if (!string.Equals(viewType, CollectionType.Playlists, StringComparison.OrdinalIgnoreCase)) - { - return await FindPlaylists(queryParent, user, query).ConfigureAwait(false); - } - } + //if (query.IncludeItemTypes != null && + // query.IncludeItemTypes.Length == 1 && + // string.Equals(query.IncludeItemTypes[0], "Playlist", StringComparison.OrdinalIgnoreCase)) + //{ + // if (!string.Equals(viewType, CollectionType.Playlists, StringComparison.OrdinalIgnoreCase)) + // { + // return await FindPlaylists(queryParent, user, query).ConfigureAwait(false); + // } + //} switch (viewType) { @@ -766,7 +766,7 @@ namespace MediaBrowser.Controller.Entities return items; } - private static bool CollapseBoxSetItems(InternalItemsQuery query, + public static bool CollapseBoxSetItems(InternalItemsQuery query, BaseItem queryParent, User user) { @@ -1689,6 +1689,26 @@ namespace MediaBrowser.Controller.Entities } } + if (query.MinPremiereDate.HasValue) + { + var val = query.MinPremiereDate.Value; + + if (!(item.PremiereDate.HasValue && item.PremiereDate.Value >= val)) + { + return false; + } + } + + if (query.MaxPremiereDate.HasValue) + { + var val = query.MaxPremiereDate.Value; + + if (!(item.PremiereDate.HasValue && item.PremiereDate.Value <= val)) + { + return false; + } + } + return true; } diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs index ff44953ef..752ac2dad 100644 --- a/MediaBrowser.Controller/Library/ILibraryManager.cs +++ b/MediaBrowser.Controller/Library/ILibraryManager.cs @@ -153,13 +153,6 @@ namespace MediaBrowser.Controller.Library BaseItem GetItemById(Guid id); /// <summary> - /// Gets the items. - /// </summary> - /// <param name="query">The query.</param> - /// <returns>QueryResult<BaseItem>.</returns> - QueryResult<BaseItem> GetItems(InternalItemsQuery query); - - /// <summary> /// Gets the memory item by identifier. /// </summary> /// <param name="id">The identifier.</param> @@ -551,18 +544,24 @@ namespace MediaBrowser.Controller.Library /// Gets the items. /// </summary> /// <param name="query">The query.</param> + /// <returns>QueryResult<BaseItem>.</returns> + IEnumerable<BaseItem> GetItemList(InternalItemsQuery query); + + /// <summary> + /// Gets the items. + /// </summary> + /// <param name="query">The query.</param> /// <param name="parentIds">The parent ids.</param> /// <returns>List<BaseItem>.</returns> - IEnumerable<BaseItem> GetItems(InternalItemsQuery query, IEnumerable<string> parentIds); + IEnumerable<BaseItem> GetItemList(InternalItemsQuery query, IEnumerable<string> parentIds); /// <summary> /// Gets the items result. /// </summary> /// <param name="query">The query.</param> - /// <param name="parentIds">The parent ids.</param> /// <returns>QueryResult<BaseItem>.</returns> - QueryResult<BaseItem> GetItemsResult(InternalItemsQuery query, IEnumerable<string> parentIds); - + QueryResult<BaseItem> GetItemsResult(InternalItemsQuery query); + /// <summary> /// Ignores the file. /// </summary> |
