|
@@ -1,5 +1,4 @@
|
|
|
-using System.Globalization;
|
|
|
-using MediaBrowser.Controller.Dto;
|
|
|
+using MediaBrowser.Controller.Dto;
|
|
|
using MediaBrowser.Controller.Entities;
|
|
|
using MediaBrowser.Controller.Entities.Audio;
|
|
|
using MediaBrowser.Controller.Entities.Movies;
|
|
@@ -181,22 +180,19 @@ namespace MediaBrowser.Api.UserLibrary
|
|
|
[ApiMember(Name = "IsHD", Description = "Optional filter by items that are HD or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
|
|
|
public bool? IsHD { get; set; }
|
|
|
|
|
|
- [ApiMember(Name = "ExcludeLocationTypes", Description = "Optional. If specified, results will be filtered based on LocationType. This allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
|
|
|
- public string ExcludeLocationTypes { get; set; }
|
|
|
-
|
|
|
[ApiMember(Name = "LocationTypes", Description = "Optional. If specified, results will be filtered based on LocationType. This allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
|
|
|
public string LocationTypes { get; set; }
|
|
|
|
|
|
- [ApiMember(Name = "MinPremiereDate", Description = "Optional. The minimum premiere date. Format = yyyyMMddHHmmss", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
|
|
|
- public string MinPremiereDate { get; set; }
|
|
|
+ [ApiMember(Name = "ExcludeLocationTypes", Description = "Optional. If specified, results will be filtered based on LocationType. This allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
|
|
|
+ public string ExcludeLocationTypes { get; set; }
|
|
|
|
|
|
- [ApiMember(Name = "MaxPremiereDate", Description = "Optional. The maximum premiere date. Format = yyyyMMddHHmmss", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
|
|
|
- public string MaxPremiereDate { get; set; }
|
|
|
+ public bool IncludeIndexContainers { get; set; }
|
|
|
|
|
|
- [ApiMember(Name = "HasPremiereDate", Description = "Optional filter by items with premiere dates.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
|
|
|
- public bool? HasPremiereDate { get; set; }
|
|
|
+ [ApiMember(Name = "IsMissing", Description = "Optional filter by items that are missing episodes or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
|
|
|
+ public bool? IsMissing { get; set; }
|
|
|
|
|
|
- public bool IncludeIndexContainers { get; set; }
|
|
|
+ [ApiMember(Name = "IsUnaired", Description = "Optional filter by items that are unaired episodes or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
|
|
|
+ public bool? IsUnaired { get; set; }
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -270,6 +266,8 @@ namespace MediaBrowser.Api.UserLibrary
|
|
|
items = ApplyFilter(items, filter, user, _userDataRepository);
|
|
|
}
|
|
|
|
|
|
+ items = FilterVirtualEpisodes(request, items, user);
|
|
|
+
|
|
|
items = items.AsEnumerable();
|
|
|
|
|
|
items = ApplySearchTerm(request, items);
|
|
@@ -440,6 +438,93 @@ namespace MediaBrowser.Api.UserLibrary
|
|
|
return items;
|
|
|
}
|
|
|
|
|
|
+ private IEnumerable<BaseItem> FilterVirtualEpisodes(GetItems request, IEnumerable<BaseItem> items, User user)
|
|
|
+ {
|
|
|
+ items = FilterVirtualSeasons(request, items, user);
|
|
|
+
|
|
|
+ if (request.IsMissing.HasValue)
|
|
|
+ {
|
|
|
+ var val = request.IsMissing.Value;
|
|
|
+ items = items.Where(i =>
|
|
|
+ {
|
|
|
+ var e = i as Episode;
|
|
|
+ if (e != null)
|
|
|
+ {
|
|
|
+ return e.IsMissingEpisode == val;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ if (request.IsUnaired.HasValue)
|
|
|
+ {
|
|
|
+ var val = request.IsUnaired.Value;
|
|
|
+ items = items.Where(i =>
|
|
|
+ {
|
|
|
+ var e = i as Episode;
|
|
|
+ if (e != null)
|
|
|
+ {
|
|
|
+ return e.IsUnaired == val;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ return items;
|
|
|
+ }
|
|
|
+
|
|
|
+ private IEnumerable<BaseItem> FilterVirtualSeasons(GetItems request, IEnumerable<BaseItem> items, User user)
|
|
|
+ {
|
|
|
+ if (request.IsMissing.HasValue && request.IsUnaired.HasValue)
|
|
|
+ {
|
|
|
+ var isMissing = request.IsMissing.Value;
|
|
|
+ var isUnaired = request.IsUnaired.Value;
|
|
|
+
|
|
|
+ if (!isMissing && !isUnaired)
|
|
|
+ {
|
|
|
+ return items.Where(i =>
|
|
|
+ {
|
|
|
+ var e = i as Season;
|
|
|
+ if (e != null)
|
|
|
+ {
|
|
|
+ return !e.IsMissingOrUnaired;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (request.IsMissing.HasValue)
|
|
|
+ {
|
|
|
+ var val = request.IsMissing.Value;
|
|
|
+ items = items.Where(i =>
|
|
|
+ {
|
|
|
+ var e = i as Season;
|
|
|
+ if (e != null)
|
|
|
+ {
|
|
|
+ return e.IsMissingSeason == val;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ if (request.IsUnaired.HasValue)
|
|
|
+ {
|
|
|
+ var val = request.IsUnaired.Value;
|
|
|
+ items = items.Where(i =>
|
|
|
+ {
|
|
|
+ var e = i as Season;
|
|
|
+ if (e != null)
|
|
|
+ {
|
|
|
+ return e.IsUnaired == val;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ return items;
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// Applies the additional filters.
|
|
|
/// </summary>
|
|
@@ -593,13 +678,6 @@ namespace MediaBrowser.Api.UserLibrary
|
|
|
items = items.Where(f => vals.Contains(f.GetType().Name, StringComparer.OrdinalIgnoreCase));
|
|
|
}
|
|
|
|
|
|
- // ExcludeLocationTypes
|
|
|
- if (!string.IsNullOrEmpty(request.ExcludeLocationTypes))
|
|
|
- {
|
|
|
- var vals = request.ExcludeLocationTypes.Split(',');
|
|
|
- items = items.Where(f => !vals.Contains(f.LocationType.ToString(), StringComparer.OrdinalIgnoreCase));
|
|
|
- }
|
|
|
-
|
|
|
// LocationTypes
|
|
|
if (!string.IsNullOrEmpty(request.LocationTypes))
|
|
|
{
|
|
@@ -607,6 +685,13 @@ namespace MediaBrowser.Api.UserLibrary
|
|
|
items = items.Where(f => vals.Contains(f.LocationType.ToString(), StringComparer.OrdinalIgnoreCase));
|
|
|
}
|
|
|
|
|
|
+ // ExcludeLocationTypes
|
|
|
+ if (!string.IsNullOrEmpty(request.ExcludeLocationTypes))
|
|
|
+ {
|
|
|
+ var vals = request.ExcludeLocationTypes.Split(',');
|
|
|
+ items = items.Where(f => !vals.Contains(f.LocationType.ToString(), StringComparer.OrdinalIgnoreCase));
|
|
|
+ }
|
|
|
+
|
|
|
if (!string.IsNullOrEmpty(request.NameStartsWithOrGreater))
|
|
|
{
|
|
|
items = items.Where(i => string.Compare(request.NameStartsWithOrGreater, i.SortName, StringComparison.CurrentCultureIgnoreCase) < 1);
|
|
@@ -826,7 +911,8 @@ namespace MediaBrowser.Api.UserLibrary
|
|
|
|
|
|
if (request.IsHD.HasValue)
|
|
|
{
|
|
|
- items = items.OfType<Video>().Where(i => i.IsHD == request.IsHD.Value);
|
|
|
+ var val = request.IsHD.Value;
|
|
|
+ items = items.OfType<Video>().Where(i => i.IsHD == val);
|
|
|
}
|
|
|
|
|
|
if (request.ParentIndexNumber.HasValue)
|
|
@@ -853,27 +939,6 @@ namespace MediaBrowser.Api.UserLibrary
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- if (!string.IsNullOrEmpty(request.MinPremiereDate))
|
|
|
- {
|
|
|
- var date = DateTime.ParseExact(request.MinPremiereDate, "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
|
|
|
-
|
|
|
- items = items.Where(i => !i.PremiereDate.HasValue || i.PremiereDate.Value >= date);
|
|
|
- }
|
|
|
-
|
|
|
- if (!string.IsNullOrEmpty(request.MaxPremiereDate))
|
|
|
- {
|
|
|
- var date = DateTime.ParseExact(request.MaxPremiereDate, "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
|
|
|
-
|
|
|
- items = items.Where(i => !i.PremiereDate.HasValue || i.PremiereDate.Value <= date);
|
|
|
- }
|
|
|
-
|
|
|
- if (request.HasPremiereDate.HasValue)
|
|
|
- {
|
|
|
- var val = request.HasPremiereDate.Value;
|
|
|
-
|
|
|
- items = items.Where(i => i.PremiereDate.HasValue == val);
|
|
|
- }
|
|
|
-
|
|
|
return items;
|
|
|
}
|
|
|
|