|
@@ -406,7 +406,9 @@ namespace MediaBrowser.Controller.Entities
|
|
|
query.SortBy = new[] { ItemSortBy.DateCreated, ItemSortBy.SortName };
|
|
|
query.SortOrder = SortOrder.Descending;
|
|
|
|
|
|
- return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos }).Where(i => i is MusicVideo || i is Audio.Audio), parent, GetSpecialItemsLimit(), query);
|
|
|
+ var items = GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos }, i => i is MusicVideo || i is Audio.Audio && FilterItem(i, query));
|
|
|
+
|
|
|
+ return PostFilterAndSort(items, parent, GetSpecialItemsLimit(), query);
|
|
|
}
|
|
|
|
|
|
private async Task<QueryResult<BaseItem>> GetMovieFolders(Folder parent, User user, InternalItemsQuery query)
|
|
@@ -414,7 +416,7 @@ namespace MediaBrowser.Controller.Entities
|
|
|
if (query.Recursive)
|
|
|
{
|
|
|
var recursiveItems = GetRecursiveChildren(parent, user,
|
|
|
- new[] {CollectionType.Movies, CollectionType.BoxSets, string.Empty})
|
|
|
+ new[] { CollectionType.Movies, CollectionType.BoxSets, string.Empty })
|
|
|
.Where(i => i is Movie || i is BoxSet);
|
|
|
|
|
|
//var collections = _collectionManager.CollapseItemsWithinBoxSets(recursiveItems, user).ToList();
|
|
@@ -490,7 +492,9 @@ namespace MediaBrowser.Controller.Entities
|
|
|
query.SortBy = new[] { ItemSortBy.DateCreated, ItemSortBy.SortName };
|
|
|
query.SortOrder = SortOrder.Descending;
|
|
|
|
|
|
- return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Movies, CollectionType.BoxSets, string.Empty }).Where(i => i is Movie), parent, GetSpecialItemsLimit(), query);
|
|
|
+ var items = GetRecursiveChildren(parent, user, new[] { CollectionType.Movies, CollectionType.BoxSets, string.Empty }, i => i is Movie && FilterItem(i, query));
|
|
|
+
|
|
|
+ return PostFilterAndSort(items, parent, GetSpecialItemsLimit(), query);
|
|
|
}
|
|
|
|
|
|
private QueryResult<BaseItem> GetMovieResume(Folder parent, User user, InternalItemsQuery query)
|
|
@@ -499,7 +503,9 @@ namespace MediaBrowser.Controller.Entities
|
|
|
query.SortOrder = SortOrder.Descending;
|
|
|
query.IsResumable = true;
|
|
|
|
|
|
- return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Movies, CollectionType.BoxSets, string.Empty }).Where(i => i is Movie), parent, GetSpecialItemsLimit(), query);
|
|
|
+ var items = GetRecursiveChildren(parent, user, new[] { CollectionType.Movies, CollectionType.BoxSets, string.Empty }, i => i is Movie && FilterItem(i, query));
|
|
|
+
|
|
|
+ return PostFilterAndSort(items, parent, GetSpecialItemsLimit(), query);
|
|
|
}
|
|
|
|
|
|
private async Task<QueryResult<BaseItem>> GetMovieGenres(Folder parent, User user, InternalItemsQuery query)
|
|
@@ -544,15 +550,16 @@ namespace MediaBrowser.Controller.Entities
|
|
|
return GetResult(GetMediaFolders(user).SelectMany(i =>
|
|
|
{
|
|
|
var hasCollectionType = i as ICollectionFolder;
|
|
|
+ Func<BaseItem, bool> filter = b => b is BoxSet;
|
|
|
|
|
|
if (hasCollectionType != null && string.Equals(hasCollectionType.CollectionType, CollectionType.BoxSets, StringComparison.OrdinalIgnoreCase))
|
|
|
{
|
|
|
- return i.GetChildren(user, true);
|
|
|
+ return i.GetChildren(user, true).Where(filter);
|
|
|
}
|
|
|
|
|
|
- return i.GetRecursiveChildren(user);
|
|
|
+ return i.GetRecursiveChildren(user, filter);
|
|
|
|
|
|
- }).OfType<BoxSet>(), parent, query);
|
|
|
+ }), parent, query);
|
|
|
}
|
|
|
|
|
|
private async Task<QueryResult<BaseItem>> GetTvView(Folder parent, User user, InternalItemsQuery query)
|
|
@@ -598,7 +605,9 @@ namespace MediaBrowser.Controller.Entities
|
|
|
query.SortBy = new[] { ItemSortBy.DateCreated, ItemSortBy.SortName };
|
|
|
query.SortOrder = SortOrder.Descending;
|
|
|
|
|
|
- return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Games }).OfType<Game>(), parent, GetSpecialItemsLimit(), query);
|
|
|
+ var items = GetRecursiveChildren(parent, user, new[] { CollectionType.Games }, i => i is Game && FilterItem(i, query));
|
|
|
+
|
|
|
+ return PostFilterAndSort(items, parent, GetSpecialItemsLimit(), query);
|
|
|
}
|
|
|
|
|
|
private QueryResult<BaseItem> GetRecentlyPlayedGames(Folder parent, User user, InternalItemsQuery query)
|
|
@@ -607,7 +616,9 @@ namespace MediaBrowser.Controller.Entities
|
|
|
query.SortBy = new[] { ItemSortBy.DatePlayed, ItemSortBy.SortName };
|
|
|
query.SortOrder = SortOrder.Descending;
|
|
|
|
|
|
- return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Games }).OfType<Game>(), parent, GetSpecialItemsLimit(), query);
|
|
|
+ var items = GetRecursiveChildren(parent, user, new[] { CollectionType.Games }, i => i is Game && FilterItem(i, query));
|
|
|
+
|
|
|
+ return PostFilterAndSort(items, parent, GetSpecialItemsLimit(), query);
|
|
|
}
|
|
|
|
|
|
private QueryResult<BaseItem> GetFavoriteGames(Folder parent, User user, InternalItemsQuery query)
|
|
@@ -622,7 +633,9 @@ namespace MediaBrowser.Controller.Entities
|
|
|
query.SortBy = new[] { ItemSortBy.DateCreated, ItemSortBy.SortName };
|
|
|
query.SortOrder = SortOrder.Descending;
|
|
|
|
|
|
- return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.TvShows, string.Empty }).OfType<Episode>(), parent, GetSpecialItemsLimit(), query);
|
|
|
+ var items = GetRecursiveChildren(parent, user, new[] { CollectionType.TvShows, string.Empty }, i => i is Episode && FilterItem(i, query));
|
|
|
+
|
|
|
+ return PostFilterAndSort(items, parent, GetSpecialItemsLimit(), query);
|
|
|
}
|
|
|
|
|
|
private QueryResult<BaseItem> GetTvNextUp(Folder parent, InternalItemsQuery query)
|
|
@@ -646,7 +659,9 @@ namespace MediaBrowser.Controller.Entities
|
|
|
query.SortOrder = SortOrder.Descending;
|
|
|
query.IsResumable = true;
|
|
|
|
|
|
- return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.TvShows, string.Empty }).OfType<Episode>(), parent, GetSpecialItemsLimit(), query);
|
|
|
+ var items = GetRecursiveChildren(parent, user, new[] { CollectionType.TvShows, string.Empty }, i => i is Episode && FilterItem(i, query));
|
|
|
+
|
|
|
+ return PostFilterAndSort(items, parent, GetSpecialItemsLimit(), query);
|
|
|
}
|
|
|
|
|
|
private QueryResult<BaseItem> GetTvSeries(Folder parent, User user, InternalItemsQuery query)
|
|
@@ -748,29 +763,32 @@ namespace MediaBrowser.Controller.Entities
|
|
|
InternalItemsQuery query)
|
|
|
where T : BaseItem
|
|
|
{
|
|
|
- return GetResult(items, queryParent, null, query);
|
|
|
+ items = items.Where(i => Filter(i, query.User, query, _userDataManager, _libraryManager));
|
|
|
+
|
|
|
+ return PostFilterAndSort(items, queryParent, null, query, _libraryManager);
|
|
|
}
|
|
|
|
|
|
- private QueryResult<BaseItem> GetResult<T>(IEnumerable<T> items,
|
|
|
+ public bool FilterItem(BaseItem item, InternalItemsQuery query)
|
|
|
+ {
|
|
|
+ return Filter(item, query.User, query, _userDataManager, _libraryManager);
|
|
|
+ }
|
|
|
+
|
|
|
+ private QueryResult<BaseItem> PostFilterAndSort(IEnumerable<BaseItem> items,
|
|
|
BaseItem queryParent,
|
|
|
int? totalRecordLimit,
|
|
|
InternalItemsQuery query)
|
|
|
- where T : BaseItem
|
|
|
{
|
|
|
- return FilterAndSort(items, queryParent, totalRecordLimit, query, _libraryManager, _userDataManager);
|
|
|
+ return PostFilterAndSort(items, queryParent, totalRecordLimit, query, _libraryManager);
|
|
|
}
|
|
|
|
|
|
- public static QueryResult<BaseItem> FilterAndSort(IEnumerable<BaseItem> items,
|
|
|
+ public static QueryResult<BaseItem> PostFilterAndSort(IEnumerable<BaseItem> items,
|
|
|
BaseItem queryParent,
|
|
|
int? totalRecordLimit,
|
|
|
InternalItemsQuery query,
|
|
|
- ILibraryManager libraryManager,
|
|
|
- IUserDataManager userDataManager)
|
|
|
+ ILibraryManager libraryManager)
|
|
|
{
|
|
|
var user = query.User;
|
|
|
|
|
|
- items = items.Where(i => Filter(i, user, query, userDataManager, libraryManager));
|
|
|
-
|
|
|
items = FilterVirtualEpisodes(items,
|
|
|
query.IsMissing,
|
|
|
query.IsVirtualUnaired,
|
|
@@ -1169,7 +1187,7 @@ namespace MediaBrowser.Controller.Entities
|
|
|
};
|
|
|
}
|
|
|
|
|
|
- private static bool Filter(BaseItem item, User user, InternalItemsQuery query, IUserDataManager userDataManager, ILibraryManager libraryManager)
|
|
|
+ public static bool Filter(BaseItem item, User user, InternalItemsQuery query, IUserDataManager userDataManager, ILibraryManager libraryManager)
|
|
|
{
|
|
|
if (query.MediaTypes.Length > 0 && !query.MediaTypes.Contains(item.MediaType ?? string.Empty, StringComparer.OrdinalIgnoreCase))
|
|
|
{
|
|
@@ -1191,7 +1209,7 @@ namespace MediaBrowser.Controller.Entities
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- if (query.Filter != null && !query.Filter(item, user))
|
|
|
+ if (query.Filter != null && !query.Filter(item))
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
@@ -1641,6 +1659,16 @@ namespace MediaBrowser.Controller.Entities
|
|
|
return parent.GetRecursiveChildren(user);
|
|
|
}
|
|
|
|
|
|
+ private IEnumerable<BaseItem> GetRecursiveChildren(Folder parent, User user, IEnumerable<string> viewTypes, Func<BaseItem,bool> filter)
|
|
|
+ {
|
|
|
+ if (parent == null || parent is UserView)
|
|
|
+ {
|
|
|
+ return GetMediaFolders(user, viewTypes).SelectMany(i => i.GetRecursiveChildren(user, filter));
|
|
|
+ }
|
|
|
+
|
|
|
+ return parent.GetRecursiveChildren(user, filter);
|
|
|
+ }
|
|
|
+
|
|
|
private async Task<IEnumerable<BaseItem>> GetLiveTvFolders(User user)
|
|
|
{
|
|
|
var list = new List<BaseItem>();
|