aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Controller')
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs420
-rw-r--r--MediaBrowser.Controller/Entities/InternalItemsQuery.cs1
-rw-r--r--MediaBrowser.Controller/Entities/Trailer.cs6
-rw-r--r--MediaBrowser.Controller/Entities/UserRootFolder.cs9
-rw-r--r--MediaBrowser.Controller/Entities/UserViewBuilder.cs40
-rw-r--r--MediaBrowser.Controller/Library/ILibraryManager.cs21
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&lt;BaseItem&gt;.</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&lt;BaseItem&gt;.</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&lt;BaseItem&gt;.</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&lt;BaseItem&gt;.</returns>
- QueryResult<BaseItem> GetItemsResult(InternalItemsQuery query, IEnumerable<string> parentIds);
-
+ QueryResult<BaseItem> GetItemsResult(InternalItemsQuery query);
+
/// <summary>
/// Ignores the file.
/// </summary>