2014-11-09 13:24:57 -05:00
using MediaBrowser.Controller.Collections ;
2014-04-22 13:25:54 -04:00
using MediaBrowser.Controller.Dto ;
2013-04-13 14:02:30 -04:00
using MediaBrowser.Controller.Entities ;
2013-04-24 10:05:47 -04:00
using MediaBrowser.Controller.Entities.Audio ;
2013-04-29 21:29:04 -04:00
using MediaBrowser.Controller.Entities.Movies ;
2013-04-07 16:55:05 -04:00
using MediaBrowser.Controller.Entities.TV ;
2013-02-20 20:33:05 -05:00
using MediaBrowser.Controller.Library ;
2013-04-13 20:17:25 -04:00
using MediaBrowser.Controller.Localization ;
2014-07-02 14:34:08 -04:00
using MediaBrowser.Controller.Net ;
2013-02-20 20:33:05 -05:00
using MediaBrowser.Model.Entities ;
2013-03-10 00:36:39 -05:00
using MediaBrowser.Model.Querying ;
2013-12-07 10:52:38 -05:00
using ServiceStack ;
2013-02-20 20:33:05 -05:00
using System ;
using System.Collections.Generic ;
2013-12-28 18:09:24 -05:00
using System.Globalization ;
2013-02-20 20:33:05 -05:00
using System.Linq ;
2014-10-06 19:58:46 -04:00
using System.Threading.Tasks ;
2013-02-20 20:33:05 -05:00
namespace MediaBrowser.Api.UserLibrary
{
/// <summary>
/// Class GetItems
/// </summary>
2014-03-28 15:58:18 -04:00
[Route("/Items", "GET", Summary = "Gets items based on a query.")]
[Route("/Users/{UserId}/Items", "GET", Summary = "Gets items based on a query.")]
2013-03-11 01:06:55 -04:00
public class GetItems : BaseItemsRequest , IReturn < ItemsResult >
2013-02-20 20:33:05 -05:00
{
2013-04-22 00:38:03 -04:00
/// <summary>
/// Gets or sets the user id.
/// </summary>
/// <value>The user id.</value>
2014-01-22 12:05:23 -05:00
[ApiMember(Name = "UserId", Description = "User Id", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
2015-05-29 19:51:33 -04:00
public string UserId { get ; set ; }
2013-04-22 00:38:03 -04:00
2013-02-20 20:33:05 -05:00
/// <summary>
/// Limit results to items containing a specific person
/// </summary>
/// <value>The person.</value>
2013-03-09 00:15:51 -05:00
[ApiMember(Name = "Person", Description = "Optional. If specified, results will be filtered to include only those containing the specified person.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
2013-02-20 20:33:05 -05:00
public string Person { get ; set ; }
2015-03-18 12:40:16 -04:00
[ApiMember(Name = "PersonIds", Description = "Optional. If specified, results will be filtered to include only those containing the specified person.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public string PersonIds { get ; set ; }
2013-02-20 20:33:05 -05:00
/// <summary>
/// If the Person filter is used, this can also be used to restrict to a specific person type
/// </summary>
/// <value>The type of the person.</value>
2013-04-13 19:43:41 -04:00
[ApiMember(Name = "PersonTypes", Description = "Optional. If specified, along with Person, results will be filtered to include only those containing the specified person and PersonType. Allows multiple, comma-delimited", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public string PersonTypes { get ; set ; }
2013-02-20 20:33:05 -05:00
/// <summary>
/// Limit results to items containing specific studios
/// </summary>
/// <value>The studios.</value>
2014-01-04 22:50:29 -05:00
[ApiMember(Name = "Studios", Description = "Optional. If specified, results will be filtered based on studio. This allows multiple, pipe delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
2013-02-20 20:33:05 -05:00
public string Studios { get ; set ; }
2015-03-13 14:45:03 -04:00
[ApiMember(Name = "StudioIds", Description = "Optional. If specified, results will be filtered based on studio. This allows multiple, pipe delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string StudioIds { get ; set ; }
2015-04-25 23:25:07 -04:00
2013-04-24 10:05:47 -04:00
/// <summary>
/// Gets or sets the studios.
/// </summary>
/// <value>The studios.</value>
2013-08-08 08:19:11 -04:00
[ApiMember(Name = "Artists", Description = "Optional. If specified, results will be filtered based on artist. This allows multiple, pipe delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
2013-04-24 10:05:47 -04:00
public string Artists { get ; set ; }
2015-03-13 13:25:28 -04:00
[ApiMember(Name = "ArtistIds", Description = "Optional. If specified, results will be filtered based on artist. This allows multiple, pipe delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string ArtistIds { get ; set ; }
2015-04-25 23:25:07 -04:00
2013-08-08 08:19:11 -04:00
[ApiMember(Name = "Albums", Description = "Optional. If specified, results will be filtered based on album. This allows multiple, pipe delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string Albums { get ; set ; }
2013-09-06 01:13:43 -04:00
2013-03-15 21:40:34 -04:00
/// <summary>
/// Gets or sets the item ids.
/// </summary>
/// <value>The item ids.</value>
2013-04-24 10:05:47 -04:00
[ApiMember(Name = "Ids", Description = "Optional. If specific items are needed, specify a list of item id's to retrieve. This allows multiple, comma delimited.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
2013-03-15 21:40:34 -04:00
public string Ids { get ; set ; }
2013-04-04 11:22:39 -04:00
/// <summary>
/// Gets or sets the video types.
/// </summary>
/// <value>The video types.</value>
[ApiMember(Name = "VideoTypes", Description = "Optional filter by VideoType (videofile, dvd, bluray, iso). Allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string VideoTypes { get ; set ; }
/// <summary>
/// Gets or sets the video formats.
/// </summary>
/// <value>The video formats.</value>
2013-06-25 14:10:39 -04:00
[ApiMember(Name = "Is3D", Description = "Optional filter by items that are 3D, or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
public bool? Is3D { get ; set ; }
2013-04-07 16:55:05 -04:00
/// <summary>
/// Gets or sets the series status.
/// </summary>
/// <value>The series status.</value>
[ApiMember(Name = "SeriesStatus", Description = "Optional filter by Series Status. Allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string SeriesStatus { get ; set ; }
2013-05-16 23:24:41 -04:00
[ApiMember(Name = "NameStartsWithOrGreater", Description = "Optional filter by items whose name is sorted equally or greater than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public string NameStartsWithOrGreater { get ; set ; }
2014-03-06 13:59:48 +11:00
2014-03-06 08:46:32 +11:00
[ApiMember(Name = "NameStartsWith", Description = "Optional filter by items whose name is sorted equally than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public string NameStartsWith { get ; set ; }
2014-03-18 13:05:57 -04:00
2014-03-06 08:46:32 +11:00
[ApiMember(Name = "NameLessThan", Description = "Optional filter by items whose name is equally or lesser than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public string NameLessThan { get ; set ; }
2013-05-16 15:00:42 -04:00
2013-09-06 15:17:15 -04:00
[ApiMember(Name = "AlbumArtistStartsWithOrGreater", Description = "Optional filter by items whose album artist is sorted equally or greater than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public string AlbumArtistStartsWithOrGreater { get ; set ; }
2013-09-11 13:54:59 -04:00
2013-04-07 16:55:05 -04:00
/// <summary>
/// Gets or sets the air days.
/// </summary>
/// <value>The air days.</value>
[ApiMember(Name = "AirDays", Description = "Optional filter by Series Air Days. Allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string AirDays { get ; set ; }
2013-04-11 23:50:47 -04:00
2013-04-13 20:17:25 -04:00
/// <summary>
/// Gets or sets the min offical rating.
/// </summary>
/// <value>The min offical rating.</value>
2013-04-24 15:52:28 -04:00
[ApiMember(Name = "MinOfficialRating", Description = "Optional filter by minimum official rating (PG, PG-13, TV-MA, etc).", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public string MinOfficialRating { get ; set ; }
2013-04-13 20:17:25 -04:00
/// <summary>
/// Gets or sets the max offical rating.
/// </summary>
/// <value>The max offical rating.</value>
2013-04-24 15:52:28 -04:00
[ApiMember(Name = "MaxOfficialRating", Description = "Optional filter by maximum official rating (PG, PG-13, TV-MA, etc).", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public string MaxOfficialRating { get ; set ; }
2013-04-29 21:29:04 -04:00
[ApiMember(Name = "HasThemeSong", Description = "Optional filter by items with theme songs.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public bool? HasThemeSong { get ; set ; }
[ApiMember(Name = "HasThemeVideo", Description = "Optional filter by items with theme videos.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public bool? HasThemeVideo { get ; set ; }
[ApiMember(Name = "HasSubtitles", Description = "Optional filter by items with subtitles.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public bool? HasSubtitles { get ; set ; }
[ApiMember(Name = "HasSpecialFeature", Description = "Optional filter by items with special features.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public bool? HasSpecialFeature { get ; set ; }
[ApiMember(Name = "HasTrailer", Description = "Optional filter by items with trailers.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public bool? HasTrailer { get ; set ; }
2013-05-16 15:00:42 -04:00
2013-05-19 13:35:00 -04:00
[ApiMember(Name = "AdjacentTo", Description = "Optional. Return items that are siblings of a supplied item.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public string AdjacentTo { get ; set ; }
2013-09-11 13:54:59 -04:00
[ApiMember(Name = "MinIndexNumber", Description = "Optional filter by minimum index number.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
2013-08-30 21:08:32 -04:00
public int? MinIndexNumber { get ; set ; }
2013-09-11 13:54:59 -04:00
2013-09-15 15:33:23 -04:00
[ApiMember(Name = "MinPlayers", Description = "Optional filter by minimum number of game players.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
public int? MinPlayers { get ; set ; }
2013-10-05 23:03:08 -04:00
[ApiMember(Name = "MaxPlayers", Description = "Optional filter by maximum number of game players.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
public int? MaxPlayers { get ; set ; }
2013-09-13 16:45:27 -04:00
[ApiMember(Name = "ParentIndexNumber", Description = "Optional filter by parent index number.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
public int? ParentIndexNumber { get ; set ; }
2013-09-11 13:54:59 -04:00
[ApiMember(Name = "HasParentalRating", Description = "Optional filter by items that have or do not have a parental rating", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
public bool? HasParentalRating { get ; set ; }
[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 ; }
2013-10-15 18:16:39 -04:00
2013-10-16 19:35:11 -04:00
[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 ; }
2013-10-26 18:01:21 -04:00
[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 ; }
2013-10-16 19:35:11 -04:00
2013-10-26 18:01:21 -04:00
[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 ; }
2013-10-16 19:35:11 -04:00
2013-10-26 18:01:21 -04:00
[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 ; }
2013-10-26 18:40:53 -04:00
[ApiMember(Name = "IsVirtualUnaired", Description = "Optional filter by items that are virtual unaired episodes or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
public bool? IsVirtualUnaired { get ; set ; }
2013-11-03 11:19:33 -05:00
[ApiMember(Name = "MinCommunityRating", Description = "Optional filter by minimum community rating.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
public double? MinCommunityRating { get ; set ; }
[ApiMember(Name = "MinCriticRating", Description = "Optional filter by minimum critic rating.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
public double? MinCriticRating { get ; set ; }
2013-11-15 16:31:33 -05:00
[ApiMember(Name = "AiredDuringSeason", Description = "Gets all episodes that aired during a season, including specials.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
public int? AiredDuringSeason { get ; set ; }
2013-11-20 16:08:12 -05:00
2014-01-07 13:39:35 -05:00
[ApiMember(Name = "MinPremiereDate", Description = "Optional. The minimum premiere date. Format = ISO", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
2013-11-19 12:17:14 -05:00
public string MinPremiereDate { get ; set ; }
2014-01-07 13:39:35 -05:00
[ApiMember(Name = "MaxPremiereDate", Description = "Optional. The maximum premiere date. Format = ISO", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
2013-11-19 12:17:14 -05:00
public string MaxPremiereDate { get ; set ; }
2013-12-01 21:24:14 -05:00
[ApiMember(Name = "HasOverview", Description = "Optional filter by items that have an overview or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
public bool? HasOverview { get ; set ; }
[ApiMember(Name = "HasImdbId", Description = "Optional filter by items that have an imdb id or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
public bool? HasImdbId { get ; set ; }
[ApiMember(Name = "HasTmdbId", Description = "Optional filter by items that have a tmdb id or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
public bool? HasTmdbId { get ; set ; }
[ApiMember(Name = "HasTvdbId", Description = "Optional filter by items that have a tvdb id or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
public bool? HasTvdbId { get ; set ; }
2013-12-05 22:39:44 -05:00
2013-12-01 21:24:14 -05:00
[ApiMember(Name = "IsYearMismatched", Description = "Optional filter by items that are potentially misidentified.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
public bool? IsYearMismatched { get ; set ; }
2014-01-19 14:25:29 -05:00
[ApiMember(Name = "IsInBoxSet", Description = "Optional filter by items that are in boxsets, or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
public bool? IsInBoxSet { get ; set ; }
2014-03-03 00:11:03 -05:00
[ApiMember(Name = "IsLocked", Description = "Optional filter by items that are locked.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public bool? IsLocked { get ; set ; }
2014-03-03 23:53:48 -05:00
[ApiMember(Name = "IsUnidentified", Description = "Optional filter by items that are unidentified by internet metadata providers.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
2014-03-03 00:11:03 -05:00
public bool? IsUnidentified { get ; set ; }
2014-03-03 23:53:48 -05:00
[ApiMember(Name = "IsPlaceHolder", Description = "Optional filter by items that are placeholders", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public bool? IsPlaceHolder { get ; set ; }
[ApiMember(Name = "HasOfficialRating", Description = "Optional filter by items that have official ratings", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public bool? HasOfficialRating { get ; set ; }
2014-03-15 00:14:07 -04:00
[ApiMember(Name = "CollapseBoxSetItems", Description = "Whether or not to hide items behind their boxsets.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
2014-03-18 13:05:57 -04:00
public bool? CollapseBoxSetItems { get ; set ; }
2014-10-07 21:37:45 -04:00
public string [ ] GetStudios ( )
{
return ( Studios ? ? string . Empty ) . Split ( new [ ] { '|' } , StringSplitOptions . RemoveEmptyEntries ) ;
}
2015-03-13 14:45:03 -04:00
public string [ ] GetStudioIds ( )
{
return ( StudioIds ? ? string . Empty ) . Split ( new [ ] { '|' } , StringSplitOptions . RemoveEmptyEntries ) ;
}
2014-10-07 21:37:45 -04:00
public string [ ] GetPersonTypes ( )
{
return ( PersonTypes ? ? string . Empty ) . Split ( new [ ] { ',' } , StringSplitOptions . RemoveEmptyEntries ) ;
}
2015-03-18 12:40:16 -04:00
public string [ ] GetPersonIds ( )
{
return ( PersonIds ? ? string . Empty ) . Split ( new [ ] { ',' } , StringSplitOptions . RemoveEmptyEntries ) ;
}
2015-07-14 15:04:16 -04:00
public string [ ] GetItemIds ( )
{
return ( Ids ? ? string . Empty ) . Split ( new [ ] { ',' } , StringSplitOptions . RemoveEmptyEntries ) ;
}
2015-03-14 00:50:23 -04:00
public VideoType [ ] GetVideoTypes ( )
2014-10-07 21:37:45 -04:00
{
var val = VideoTypes ;
if ( string . IsNullOrEmpty ( val ) )
{
return new VideoType [ ] { } ;
}
2015-03-14 00:50:23 -04:00
return val . Split ( new [ ] { ',' } , StringSplitOptions . RemoveEmptyEntries ) . Select ( v = > ( VideoType ) Enum . Parse ( typeof ( VideoType ) , v , true ) ) . ToArray ( ) ;
2014-10-07 21:37:45 -04:00
}
2013-02-20 20:33:05 -05:00
}
/// <summary>
/// Class ItemsService
/// </summary>
2014-07-02 14:34:08 -04:00
[Authenticated]
2013-03-16 01:52:33 -04:00
public class ItemsService : BaseApiService
2013-02-20 20:33:05 -05:00
{
2013-02-27 15:25:45 -05:00
/// <summary>
/// The _user manager
/// </summary>
private readonly IUserManager _userManager ;
2013-10-02 12:08:58 -04:00
private readonly IUserDataManager _userDataRepository ;
2013-02-27 15:25:45 -05:00
2013-02-28 14:32:41 -05:00
/// <summary>
/// The _library manager
/// </summary>
private readonly ILibraryManager _libraryManager ;
2013-06-10 13:46:11 -04:00
private readonly ILocalizationManager _localization ;
2013-03-09 00:15:51 -05:00
2013-09-04 13:02:19 -04:00
private readonly IDtoService _dtoService ;
2014-04-22 13:25:54 -04:00
private readonly ICollectionManager _collectionManager ;
2013-09-04 13:02:19 -04:00
2013-02-27 15:25:45 -05:00
/// <summary>
/// Initializes a new instance of the <see cref="ItemsService" /> class.
/// </summary>
/// <param name="userManager">The user manager.</param>
2013-03-28 18:00:58 -04:00
/// <param name="libraryManager">The library manager.</param>
2013-04-13 14:02:30 -04:00
/// <param name="userDataRepository">The user data repository.</param>
2014-04-22 13:25:54 -04:00
/// <param name="localization">The localization.</param>
/// <param name="dtoService">The dto service.</param>
/// <param name="collectionManager">The collection manager.</param>
public ItemsService ( IUserManager userManager , ILibraryManager libraryManager , IUserDataManager userDataRepository , ILocalizationManager localization , IDtoService dtoService , ICollectionManager collectionManager )
2013-02-27 15:25:45 -05:00
{
_userManager = userManager ;
2013-02-28 14:32:41 -05:00
_libraryManager = libraryManager ;
2013-04-13 14:02:30 -04:00
_userDataRepository = userDataRepository ;
2013-06-13 14:17:59 -04:00
_localization = localization ;
2013-09-04 13:02:19 -04:00
_dtoService = dtoService ;
2014-04-22 13:25:54 -04:00
_collectionManager = collectionManager ;
2013-02-27 15:25:45 -05:00
}
2013-02-20 20:33:05 -05:00
/// <summary>
/// Gets the specified request.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>System.Object.</returns>
2014-10-06 19:58:46 -04:00
public async Task < object > Get ( GetItems request )
2013-02-20 20:33:05 -05:00
{
2014-10-06 19:58:46 -04:00
var result = await GetItems ( request ) . ConfigureAwait ( false ) ;
2013-02-20 20:33:05 -05:00
2014-02-03 23:04:19 -05:00
return ToOptimizedSerializedResultUsingCache ( result ) ;
2013-02-20 20:33:05 -05:00
}
/// <summary>
/// Gets the items.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>Task{ItemsResult}.</returns>
2014-10-06 19:58:46 -04:00
private async Task < ItemsResult > GetItems ( GetItems request )
2013-02-20 20:33:05 -05:00
{
2014-04-26 23:42:05 -04:00
var parentItem = string . IsNullOrEmpty ( request . ParentId ) ? null : _libraryManager . GetItemById ( request . ParentId ) ;
2015-05-29 19:51:33 -04:00
var user = ! string . IsNullOrWhiteSpace ( request . UserId ) ? _userManager . GetUserById ( request . UserId ) : null ;
2013-02-20 20:33:05 -05:00
2014-10-06 19:58:46 -04:00
var result = await GetItemsToSerialize ( request , user , parentItem ) . ConfigureAwait ( false ) ;
2013-02-20 20:33:05 -05:00
2015-01-24 14:03:55 -05:00
var dtoOptions = GetDtoOptions ( request ) ;
2013-04-05 11:58:06 -04:00
2013-02-20 20:33:05 -05:00
return new ItemsResult
{
2015-07-14 15:04:16 -04:00
TotalRecordCount = result . Item1 . TotalRecordCount ,
Items = _dtoService . GetBaseItemDtos ( result . Item1 . Items , dtoOptions , user ) . ToArray ( )
2013-02-20 20:33:05 -05:00
} ;
}
/// <summary>
/// Gets the items to serialize.
/// </summary>
/// <param name="request">The request.</param>
/// <param name="user">The user.</param>
2014-04-26 23:42:05 -04:00
/// <param name="parentItem">The parent item.</param>
2013-02-20 20:33:05 -05:00
/// <returns>IEnumerable{BaseItem}.</returns>
2014-10-06 19:58:46 -04:00
private async Task < Tuple < QueryResult < BaseItem > , bool > > GetItemsToSerialize ( GetItems request , User user , BaseItem parentItem )
2013-02-20 20:33:05 -05:00
{
2014-01-22 12:05:23 -05:00
var item = string . IsNullOrEmpty ( request . ParentId ) ?
2014-03-02 21:17:12 -05:00
user = = null ? _libraryManager . RootFolder : user . RootFolder :
2014-04-26 23:42:05 -04:00
parentItem ;
2013-02-20 20:33:05 -05:00
// Default list type = children
2013-03-15 21:40:34 -04:00
if ( ! string . IsNullOrEmpty ( request . Ids ) )
{
2015-07-14 15:04:16 -04:00
request . Recursive = true ;
var result = await ( ( Folder ) item ) . GetItems ( GetItemsQuery ( request , user ) ) . ConfigureAwait ( false ) ;
2013-03-15 21:40:34 -04:00
2015-07-14 15:04:16 -04:00
return new Tuple < QueryResult < BaseItem > , bool > ( result , true ) ;
2013-10-15 18:16:39 -04:00
}
2015-07-14 15:04:16 -04:00
if ( request . Recursive )
2013-10-15 18:16:39 -04:00
{
2015-02-06 22:25:23 -05:00
var result = await ( ( Folder ) item ) . GetItems ( GetItemsQuery ( request , user ) ) . ConfigureAwait ( false ) ;
2014-10-06 19:58:46 -04:00
2015-02-06 22:25:23 -05:00
return new Tuple < QueryResult < BaseItem > , bool > ( result , true ) ;
2013-10-15 18:16:39 -04:00
}
2015-07-14 15:04:16 -04:00
if ( user = = null )
2013-10-15 18:16:39 -04:00
{
2015-07-14 15:04:16 -04:00
var result = await ( ( Folder ) item ) . GetItems ( GetItemsQuery ( request , null ) ) . ConfigureAwait ( false ) ;
2014-10-06 19:58:46 -04:00
2015-07-14 15:04:16 -04:00
return new Tuple < QueryResult < BaseItem > , bool > ( result , true ) ;
}
2014-10-06 19:58:46 -04:00
2015-07-14 15:04:16 -04:00
var userRoot = item as UserRootFolder ;
2014-10-06 19:58:46 -04:00
2015-07-14 15:04:16 -04:00
if ( userRoot = = null )
{
var result = await ( ( Folder ) item ) . GetItems ( GetItemsQuery ( request , user ) ) . ConfigureAwait ( false ) ;
2013-10-15 18:16:39 -04:00
2015-07-14 15:04:16 -04:00
return new Tuple < QueryResult < BaseItem > , bool > ( result , true ) ;
2013-02-20 20:33:05 -05:00
}
2015-07-14 15:04:16 -04:00
IEnumerable < BaseItem > items = ( ( Folder ) item ) . GetChildren ( user , true ) ;
var itemsArray = items . ToArray ( ) ;
2014-10-06 19:58:46 -04:00
return new Tuple < QueryResult < BaseItem > , bool > ( new QueryResult < BaseItem >
{
2015-07-14 15:04:16 -04:00
Items = itemsArray ,
TotalRecordCount = itemsArray . Length
2014-10-06 19:58:46 -04:00
} , false ) ;
2013-02-20 20:33:05 -05:00
}
2014-10-06 19:58:46 -04:00
private InternalItemsQuery GetItemsQuery ( GetItems request , User user )
2013-02-20 20:33:05 -05:00
{
2014-10-06 19:58:46 -04:00
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 ,
2015-07-14 15:04:16 -04:00
Filter = i = > ApplyAdditionalFilters ( request , i , user , _libraryManager ) ,
2014-10-06 19:58:46 -04:00
Limit = request . Limit ,
2014-10-07 21:37:45 -04:00
StartIndex = request . StartIndex ,
IsMissing = request . IsMissing ,
IsVirtualUnaired = request . IsVirtualUnaired ,
IsUnaired = request . IsUnaired ,
CollapseBoxSetItems = request . CollapseBoxSetItems ,
NameLessThan = request . NameLessThan ,
NameStartsWith = request . NameStartsWith ,
NameStartsWithOrGreater = request . NameStartsWithOrGreater ,
HasImdbId = request . HasImdbId ,
IsYearMismatched = request . IsYearMismatched ,
IsUnidentified = request . IsUnidentified ,
IsPlaceHolder = request . IsPlaceHolder ,
IsLocked = request . IsLocked ,
IsInBoxSet = request . IsInBoxSet ,
IsHD = request . IsHD ,
Is3D = request . Is3D ,
HasTvdbId = request . HasTvdbId ,
HasTmdbId = request . HasTmdbId ,
HasOverview = request . HasOverview ,
HasOfficialRating = request . HasOfficialRating ,
HasParentalRating = request . HasParentalRating ,
HasSpecialFeature = request . HasSpecialFeature ,
HasSubtitles = request . HasSubtitles ,
HasThemeSong = request . HasThemeSong ,
HasThemeVideo = request . HasThemeVideo ,
HasTrailer = request . HasTrailer ,
2014-11-09 23:20:11 -05:00
Tags = request . GetTags ( ) ,
OfficialRatings = request . GetOfficialRatings ( ) ,
2014-10-07 21:37:45 -04:00
Genres = request . GetGenres ( ) ,
Studios = request . GetStudios ( ) ,
2015-03-13 14:45:03 -04:00
StudioIds = request . GetStudioIds ( ) ,
2014-10-07 21:37:45 -04:00
Person = request . Person ,
2015-03-18 12:40:16 -04:00
PersonIds = request . GetPersonIds ( ) ,
2014-10-07 21:37:45 -04:00
PersonTypes = request . GetPersonTypes ( ) ,
Years = request . GetYears ( ) ,
ImageTypes = request . GetImageTypes ( ) . ToArray ( ) ,
VideoTypes = request . GetVideoTypes ( ) . ToArray ( ) ,
2015-07-14 15:04:16 -04:00
AdjacentTo = request . AdjacentTo ,
ItemIds = request . GetItemIds ( ) ,
MinPlayers = request . MinPlayers ,
MaxPlayers = request . MaxPlayers ,
MinCommunityRating = request . MinCommunityRating ,
MinCriticRating = request . MinCriticRating
2014-10-06 19:58:46 -04:00
} ;
2014-10-07 21:37:45 -04:00
if ( ! string . IsNullOrWhiteSpace ( request . Ids ) )
{
query . CollapseBoxSetItems = false ;
}
2014-10-06 19:58:46 -04:00
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 ;
}
}
2013-02-20 20:33:05 -05:00
2014-10-06 19:58:46 -04:00
return query ;
2013-02-20 20:33:05 -05:00
}
/// <summary>
/// Applies filtering
/// </summary>
/// <param name="items">The items.</param>
/// <param name="filter">The filter.</param>
/// <param name="user">The user.</param>
2013-04-13 14:02:30 -04:00
/// <param name="repository">The repository.</param>
2013-02-20 20:33:05 -05:00
/// <returns>IEnumerable{BaseItem}.</returns>
2013-10-02 12:08:58 -04:00
internal static IEnumerable < BaseItem > ApplyFilter ( IEnumerable < BaseItem > items , ItemFilter filter , User user , IUserDataManager repository )
2013-02-20 20:33:05 -05:00
{
2014-01-15 17:19:37 -05:00
// Avoid implicitly captured closure
var currentUser = user ;
2013-02-20 20:33:05 -05:00
switch ( filter )
{
2013-07-30 16:31:25 -04:00
case ItemFilter . IsFavoriteOrLikes :
return items . Where ( item = >
{
var userdata = repository . GetUserData ( user . Id , item . GetUserDataKey ( ) ) ;
if ( userdata = = null )
{
return false ;
}
var likes = userdata . Likes ? ? false ;
var favorite = userdata . IsFavorite ;
return likes | | favorite ;
} ) ;
2013-03-30 10:57:30 -04:00
case ItemFilter . Likes :
return items . Where ( item = >
{
2013-06-17 16:35:43 -04:00
var userdata = repository . GetUserData ( user . Id , item . GetUserDataKey ( ) ) ;
2013-03-30 10:57:30 -04:00
return userdata ! = null & & userdata . Likes . HasValue & & userdata . Likes . Value ;
} ) ;
case ItemFilter . Dislikes :
return items . Where ( item = >
{
2013-06-17 16:35:43 -04:00
var userdata = repository . GetUserData ( user . Id , item . GetUserDataKey ( ) ) ;
2013-03-30 10:57:30 -04:00
return userdata ! = null & & userdata . Likes . HasValue & & ! userdata . Likes . Value ;
} ) ;
2013-02-20 20:33:05 -05:00
case ItemFilter . IsFavorite :
return items . Where ( item = >
{
2013-06-17 16:35:43 -04:00
var userdata = repository . GetUserData ( user . Id , item . GetUserDataKey ( ) ) ;
2013-02-20 20:33:05 -05:00
return userdata ! = null & & userdata . IsFavorite ;
} ) ;
case ItemFilter . IsResumable :
return items . Where ( item = >
{
2013-06-17 16:35:43 -04:00
var userdata = repository . GetUserData ( user . Id , item . GetUserDataKey ( ) ) ;
2013-02-20 20:33:05 -05:00
return userdata ! = null & & userdata . PlaybackPositionTicks > 0 ;
} ) ;
case ItemFilter . IsPlayed :
2014-01-15 17:19:37 -05:00
return items . Where ( item = > item . IsPlayed ( currentUser ) ) ;
2013-02-20 20:33:05 -05:00
case ItemFilter . IsUnplayed :
2014-01-18 00:55:21 -05:00
return items . Where ( item = > item . IsUnplayed ( currentUser ) ) ;
2013-02-20 20:33:05 -05:00
case ItemFilter . IsFolder :
return items . Where ( item = > item . IsFolder ) ;
case ItemFilter . IsNotFolder :
return items . Where ( item = > ! item . IsFolder ) ;
2014-05-06 22:28:19 -04:00
case ItemFilter . IsRecentlyAdded :
return items . Where ( item = > ( DateTime . UtcNow - item . DateCreated ) . TotalDays < = 10 ) ;
2013-02-20 20:33:05 -05:00
}
return items ;
}
2015-07-14 15:04:16 -04:00
private bool ApplyAdditionalFilters ( GetItems request , BaseItem i , User user , ILibraryManager libraryManager )
2013-02-20 20:33:05 -05:00
{
2015-03-13 13:25:28 -04:00
// Artists
if ( ! string . IsNullOrEmpty ( request . ArtistIds ) )
{
2015-04-25 23:25:07 -04:00
var artistIds = request . ArtistIds . Split ( new [ ] { '|' , ',' } ) ;
2015-03-13 13:25:28 -04:00
var audio = i as IHasArtist ;
if ( ! ( audio ! = null & & artistIds . Any ( id = >
{
2015-03-13 14:45:03 -04:00
var artistItem = libraryManager . GetItemById ( id ) ;
return artistItem ! = null & & audio . HasAnyArtist ( artistItem . Name ) ;
2015-03-13 13:25:28 -04:00
} ) ) )
{
return false ;
}
}
2014-10-07 21:37:45 -04:00
// Artists
if ( ! string . IsNullOrEmpty ( request . Artists ) )
2013-10-05 23:03:08 -04:00
{
2014-10-07 21:37:45 -04:00
var artists = request . Artists . Split ( '|' ) ;
2013-10-05 23:03:08 -04:00
2014-10-07 21:37:45 -04:00
var audio = i as IHasArtist ;
2013-10-05 23:03:08 -04:00
2015-03-13 13:25:28 -04:00
if ( ! ( audio ! = null & & artists . Any ( audio . HasAnyArtist ) ) )
2014-10-06 19:58:46 -04:00
{
2013-10-05 23:03:08 -04:00
return false ;
2014-10-06 19:58:46 -04:00
}
2013-10-05 23:03:08 -04:00
}
2014-10-07 21:37:45 -04:00
// Albums
if ( ! string . IsNullOrEmpty ( request . Albums ) )
2013-04-29 21:29:04 -04:00
{
2014-10-07 21:37:45 -04:00
var albums = request . Albums . Split ( '|' ) ;
2013-09-13 14:43:27 -04:00
2014-10-07 21:37:45 -04:00
var audio = i as Audio ;
2014-10-06 19:58:46 -04:00
2014-10-07 21:37:45 -04:00
if ( audio ! = null )
2013-09-13 14:43:27 -04:00
{
2014-10-07 21:37:45 -04:00
if ( ! albums . Any ( a = > string . Equals ( a , audio . Album , StringComparison . OrdinalIgnoreCase ) ) )
2013-09-13 14:43:27 -04:00
{
2014-10-06 19:58:46 -04:00
return false ;
2013-09-13 14:43:27 -04:00
}
2014-10-06 19:58:46 -04:00
}
2013-04-29 21:29:04 -04:00
2014-10-07 21:37:45 -04:00
var album = i as MusicAlbum ;
2013-09-11 13:54:59 -04:00
2014-10-07 21:37:45 -04:00
if ( album ! = null )
2014-10-06 19:58:46 -04:00
{
2014-10-07 21:37:45 -04:00
if ( ! albums . Any ( a = > string . Equals ( a , album . Name , StringComparison . OrdinalIgnoreCase ) ) )
2013-09-11 13:54:59 -04:00
{
2014-10-06 19:58:46 -04:00
return false ;
2013-09-11 13:54:59 -04:00
}
2014-10-06 19:58:46 -04:00
}
2014-10-07 21:37:45 -04:00
var musicVideo = i as MusicVideo ;
if ( musicVideo ! = null )
2014-10-06 19:58:46 -04:00
{
2014-10-07 21:37:45 -04:00
if ( ! albums . Any ( a = > string . Equals ( a , musicVideo . Album , StringComparison . OrdinalIgnoreCase ) ) )
2013-09-11 13:54:59 -04:00
{
2014-10-06 19:58:46 -04:00
return false ;
2013-09-11 13:54:59 -04:00
}
2014-10-06 19:58:46 -04:00
}
2014-10-07 21:37:45 -04:00
return false ;
2013-09-11 13:54:59 -04:00
}
2014-10-07 21:37:45 -04:00
// Min index number
if ( request . MinIndexNumber . HasValue )
2014-01-19 14:25:29 -05:00
{
2014-10-07 21:37:45 -04:00
if ( ! ( i . IndexNumber . HasValue & & i . IndexNumber . Value > = request . MinIndexNumber . Value ) )
2014-10-06 19:58:46 -04:00
{
return false ;
}
2014-01-19 14:25:29 -05:00
}
2014-10-07 21:37:45 -04:00
// Min official rating
if ( ! string . IsNullOrEmpty ( request . MinOfficialRating ) )
2014-03-03 00:11:03 -05:00
{
2014-10-07 21:37:45 -04:00
var level = _localization . GetRatingLevel ( request . MinOfficialRating ) ;
2014-03-03 00:11:03 -05:00
2014-10-07 21:37:45 -04:00
if ( level . HasValue )
2014-10-06 19:58:46 -04:00
{
2014-10-07 21:37:45 -04:00
var rating = i . CustomRating ;
2013-09-13 16:45:27 -04:00
2014-10-07 21:37:45 -04:00
if ( string . IsNullOrEmpty ( rating ) )
2013-09-13 16:45:27 -04:00
{
2014-10-07 21:37:45 -04:00
rating = i . OfficialRating ;
2013-09-13 16:45:27 -04:00
}
2014-10-07 21:37:45 -04:00
if ( ! string . IsNullOrEmpty ( rating ) )
2013-09-13 16:45:27 -04:00
{
2014-10-07 21:37:45 -04:00
var itemLevel = _localization . GetRatingLevel ( rating ) ;
if ( ! ( ! itemLevel . HasValue | | itemLevel . Value > = level . Value ) )
{
return false ;
}
2013-09-13 16:45:27 -04:00
}
2014-10-06 19:58:46 -04:00
}
2013-09-13 16:45:27 -04:00
}
2014-10-07 21:37:45 -04:00
// Max official rating
if ( ! string . IsNullOrEmpty ( request . MaxOfficialRating ) )
2013-11-15 16:31:33 -05:00
{
2014-10-07 21:37:45 -04:00
var level = _localization . GetRatingLevel ( request . MaxOfficialRating ) ;
2014-10-06 19:58:46 -04:00
2014-10-07 21:37:45 -04:00
if ( level . HasValue )
2014-10-06 19:58:46 -04:00
{
2014-10-07 21:37:45 -04:00
var rating = i . CustomRating ;
2014-10-06 19:58:46 -04:00
2014-10-07 21:37:45 -04:00
if ( string . IsNullOrEmpty ( rating ) )
{
rating = i . OfficialRating ;
}
if ( ! string . IsNullOrEmpty ( rating ) )
{
var itemLevel = _localization . GetRatingLevel ( rating ) ;
if ( ! ( ! itemLevel . HasValue | | itemLevel . Value < = level . Value ) )
{
return false ;
}
}
2014-10-06 19:58:46 -04:00
}
2013-11-15 16:31:33 -05:00
}
2014-10-07 21:37:45 -04:00
// LocationTypes
if ( ! string . IsNullOrEmpty ( request . LocationTypes ) )
2013-11-19 12:17:14 -05:00
{
2014-10-07 21:37:45 -04:00
var vals = request . LocationTypes . Split ( ',' ) ;
if ( ! vals . Contains ( i . LocationType . ToString ( ) , StringComparer . OrdinalIgnoreCase ) )
2014-10-06 19:58:46 -04:00
{
return false ;
}
2013-11-19 12:17:14 -05:00
}
2014-10-07 21:37:45 -04:00
// ExcludeLocationTypes
if ( ! string . IsNullOrEmpty ( request . ExcludeLocationTypes ) )
2013-11-19 12:17:14 -05:00
{
2014-10-07 21:37:45 -04:00
var vals = request . ExcludeLocationTypes . Split ( ',' ) ;
if ( vals . Contains ( i . LocationType . ToString ( ) , StringComparer . OrdinalIgnoreCase ) )
2014-10-06 19:58:46 -04:00
{
return false ;
}
2013-11-19 12:17:14 -05:00
}
2014-10-07 21:37:45 -04:00
if ( ! string . IsNullOrEmpty ( request . AlbumArtistStartsWithOrGreater ) )
2013-12-01 21:24:14 -05:00
{
2014-10-07 21:37:45 -04:00
var ok = new [ ] { i } . OfType < IHasAlbumArtist > ( )
. Any ( p = > string . Compare ( request . AlbumArtistStartsWithOrGreater , p . AlbumArtists . FirstOrDefault ( ) , StringComparison . CurrentCultureIgnoreCase ) < 1 ) ;
2013-12-01 21:24:14 -05:00
2014-10-07 21:37:45 -04:00
if ( ! ok )
2014-10-06 19:58:46 -04:00
{
return false ;
}
2013-12-01 21:24:14 -05:00
}
2014-10-07 21:37:45 -04:00
// Filter by Series Status
if ( ! string . IsNullOrEmpty ( request . SeriesStatus ) )
2013-12-01 21:24:14 -05:00
{
2014-10-07 21:37:45 -04:00
var vals = request . SeriesStatus . Split ( ',' ) ;
2013-12-01 21:24:14 -05:00
2014-10-07 21:37:45 -04:00
var ok = new [ ] { i } . OfType < Series > ( ) . Any ( p = > p . Status . HasValue & & vals . Contains ( p . Status . Value . ToString ( ) , StringComparer . OrdinalIgnoreCase ) ) ;
2013-12-01 21:24:14 -05:00
2014-10-07 21:37:45 -04:00
if ( ! ok )
2014-10-06 19:58:46 -04:00
{
return false ;
}
2013-12-01 21:24:14 -05:00
}
2014-10-07 21:37:45 -04:00
// Filter by Series AirDays
if ( ! string . IsNullOrEmpty ( request . AirDays ) )
2013-12-01 21:24:14 -05:00
{
2014-10-07 21:37:45 -04:00
var days = request . AirDays . Split ( ',' ) . Select ( d = > ( DayOfWeek ) Enum . Parse ( typeof ( DayOfWeek ) , d , true ) ) ;
2013-12-01 21:24:14 -05:00
2014-10-07 21:37:45 -04:00
var ok = new [ ] { i } . OfType < Series > ( ) . Any ( p = > p . AirDays ! = null & & days . Any ( d = > p . AirDays . Contains ( d ) ) ) ;
2013-12-01 21:24:14 -05:00
2014-10-07 21:37:45 -04:00
if ( ! ok )
2014-10-06 19:58:46 -04:00
{
return false ;
}
2013-12-01 21:24:14 -05:00
}
2014-10-07 21:37:45 -04:00
if ( request . ParentIndexNumber . HasValue )
2014-06-03 22:53:22 -04:00
{
2014-10-07 21:37:45 -04:00
var filterValue = request . ParentIndexNumber . Value ;
2014-10-06 19:58:46 -04:00
2014-10-07 21:37:45 -04:00
var episode = i as Episode ;
2013-12-01 21:24:14 -05:00
2014-10-07 21:37:45 -04:00
if ( episode ! = null )
2013-12-01 21:24:14 -05:00
{
2014-10-07 21:37:45 -04:00
if ( episode . ParentIndexNumber . HasValue & & episode . ParentIndexNumber . Value ! = filterValue )
2013-12-01 21:24:14 -05:00
{
2014-10-07 21:37:45 -04:00
return false ;
2013-12-01 21:24:14 -05:00
}
2014-10-07 21:37:45 -04:00
}
2013-12-01 21:24:14 -05:00
2014-10-07 21:37:45 -04:00
var song = i as Audio ;
if ( song ! = null )
{
if ( song . ParentIndexNumber . HasValue & & song . ParentIndexNumber . Value ! = filterValue )
2013-12-01 21:24:14 -05:00
{
2014-10-07 21:37:45 -04:00
return false ;
2013-12-01 21:24:14 -05:00
}
}
}
2014-10-07 21:37:45 -04:00
if ( request . AiredDuringSeason . HasValue )
2014-04-22 13:25:54 -04:00
{
2014-10-07 21:37:45 -04:00
var episode = i as Episode ;
2014-04-22 13:25:54 -04:00
2014-10-07 21:37:45 -04:00
if ( episode = = null )
{
return false ;
}
2014-04-22 13:25:54 -04:00
2014-10-07 21:37:45 -04:00
if ( ! Series . FilterEpisodesBySeason ( new [ ] { episode } , request . AiredDuringSeason . Value , true ) . Any ( ) )
{
return false ;
}
2014-04-22 13:25:54 -04:00
}
2014-10-07 21:37:45 -04:00
if ( ! string . IsNullOrEmpty ( request . MinPremiereDate ) )
2014-04-22 13:25:54 -04:00
{
2014-10-07 21:37:45 -04:00
var date = DateTime . Parse ( request . MinPremiereDate , null , DateTimeStyles . RoundtripKind ) . ToUniversalTime ( ) ;
2014-04-22 13:25:54 -04:00
2014-10-07 21:37:45 -04:00
if ( ! ( i . PremiereDate . HasValue & & i . PremiereDate . Value > = date ) )
{
return false ;
}
2014-04-22 13:25:54 -04:00
}
2014-10-07 21:37:45 -04:00
if ( ! string . IsNullOrEmpty ( request . MaxPremiereDate ) )
2014-04-22 13:25:54 -04:00
{
2014-10-07 21:37:45 -04:00
var date = DateTime . Parse ( request . MaxPremiereDate , null , DateTimeStyles . RoundtripKind ) . ToUniversalTime ( ) ;
2014-04-22 13:25:54 -04:00
2014-10-07 21:37:45 -04:00
if ( ! ( i . PremiereDate . HasValue & & i . PremiereDate . Value < = date ) )
{
return false ;
}
2014-04-22 13:25:54 -04:00
}
2014-04-26 23:42:05 -04:00
2014-03-15 00:14:07 -04:00
return true ;
}
2013-02-20 20:33:05 -05:00
}
/// <summary>
/// Class DateCreatedComparer
/// </summary>
public class DateCreatedComparer : IComparer < BaseItem >
{
/// <summary>
/// Compares the specified x.
/// </summary>
/// <param name="x">The x.</param>
/// <param name="y">The y.</param>
/// <returns>System.Int32.</returns>
public int Compare ( BaseItem x , BaseItem y )
{
return x . DateCreated . CompareTo ( y . DateCreated ) ;
}
}
}