diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-11-22 10:33:14 -0500 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-11-22 10:33:14 -0500 |
| commit | 16203c52b4855b8474d5393ceebe1b7d85ce37fc (patch) | |
| tree | cc8c059fd0aee1d9f13a24d8cb0bedcbcc7e8d06 /MediaBrowser.Api | |
| parent | ae63a3c2f79599bae9c82cf5f755a5641a5921ae (diff) | |
Added specialized episodes endpoint, updated nuget.
Diffstat (limited to 'MediaBrowser.Api')
| -rw-r--r-- | MediaBrowser.Api/IHasItemFields.cs | 52 | ||||
| -rw-r--r-- | MediaBrowser.Api/MediaBrowser.Api.csproj | 1 | ||||
| -rw-r--r-- | MediaBrowser.Api/SimilarItemsHelper.cs | 28 | ||||
| -rw-r--r-- | MediaBrowser.Api/TvShowsService.cs | 137 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs | 28 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/ItemsService.cs | 39 |
6 files changed, 167 insertions, 118 deletions
diff --git a/MediaBrowser.Api/IHasItemFields.cs b/MediaBrowser.Api/IHasItemFields.cs new file mode 100644 index 0000000000..36303c889d --- /dev/null +++ b/MediaBrowser.Api/IHasItemFields.cs @@ -0,0 +1,52 @@ +using MediaBrowser.Model.Querying; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MediaBrowser.Api +{ + /// <summary> + /// Interface IHasItemFields + /// </summary> + public interface IHasItemFields + { + /// <summary> + /// Gets or sets the fields. + /// </summary> + /// <value>The fields.</value> + string Fields { get; set; } + } + + /// <summary> + /// Class ItemFieldsExtensions. + /// </summary> + public static class ItemFieldsExtensions + { + /// <summary> + /// Gets the item fields. + /// </summary> + /// <param name="request">The request.</param> + /// <returns>IEnumerable{ItemFields}.</returns> + public static IEnumerable<ItemFields> GetItemFields(this IHasItemFields request) + { + var val = request.Fields; + + if (string.IsNullOrEmpty(val)) + { + return new ItemFields[] { }; + } + + return val.Split(',').Select(v => + { + ItemFields value; + + if (Enum.TryParse(v, true, out value)) + { + return (ItemFields?)value; + } + return null; + + }).Where(i => i.HasValue).Select(i => i.Value); + } + } +} diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj index 7a9c6c8ac2..a5720dfad1 100644 --- a/MediaBrowser.Api/MediaBrowser.Api.csproj +++ b/MediaBrowser.Api/MediaBrowser.Api.csproj @@ -70,6 +70,7 @@ <Compile Include="EnvironmentService.cs" /> <Compile Include="AuthorizationRequestFilterAttribute.cs" /> <Compile Include="GamesService.cs" /> + <Compile Include="IHasItemFields.cs" /> <Compile Include="Images\ImageByNameService.cs" /> <Compile Include="Images\ImageRequest.cs" /> <Compile Include="Images\ImageService.cs" /> diff --git a/MediaBrowser.Api/SimilarItemsHelper.cs b/MediaBrowser.Api/SimilarItemsHelper.cs index 587965b3f8..a160ce6665 100644 --- a/MediaBrowser.Api/SimilarItemsHelper.cs +++ b/MediaBrowser.Api/SimilarItemsHelper.cs @@ -25,7 +25,7 @@ namespace MediaBrowser.Api public string Id { get; set; } } - public class BaseGetSimilarItems : IReturn<ItemsResult> + public class BaseGetSimilarItems : IReturn<ItemsResult>, IHasItemFields { /// <summary> /// Gets or sets the user id. @@ -47,32 +47,6 @@ namespace MediaBrowser.Api /// <value>The fields.</value> [ApiMember(Name = "Fields", Description = "Optional. Specify additional fields of information to return in the output. This allows multiple, comma delimeted. Options: Budget, Chapters, CriticRatingSummary, DateCreated, Genres, HomePageUrl, IndexOptions, MediaStreams, Overview, OverviewHtml, ParentId, Path, People, ProviderIds, PrimaryImageAspectRatio, Revenue, SortName, Studios, Taglines, TrailerUrls", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)] public string Fields { get; set; } - - /// <summary> - /// Gets the item fields. - /// </summary> - /// <returns>IEnumerable{ItemFields}.</returns> - public IEnumerable<ItemFields> GetItemFields() - { - var val = Fields; - - if (string.IsNullOrEmpty(val)) - { - return new ItemFields[] { }; - } - - return val.Split(',').Select(v => - { - ItemFields value; - - if (Enum.TryParse(v, true, out value)) - { - return (ItemFields?)value; - } - return null; - - }).Where(i => i.HasValue).Select(i => i.Value); - } } /// <summary> diff --git a/MediaBrowser.Api/TvShowsService.cs b/MediaBrowser.Api/TvShowsService.cs index 6cae379d2a..1774f1a8ed 100644 --- a/MediaBrowser.Api/TvShowsService.cs +++ b/MediaBrowser.Api/TvShowsService.cs @@ -17,7 +17,7 @@ namespace MediaBrowser.Api /// </summary> [Route("/Shows/NextUp", "GET")] [Api(("Gets a list of currently installed plugins"))] - public class GetNextUpEpisodes : IReturn<ItemsResult> + public class GetNextUpEpisodes : IReturn<ItemsResult>, IHasItemFields { /// <summary> /// Gets or sets the user id. @@ -49,38 +49,40 @@ namespace MediaBrowser.Api [ApiMember(Name = "SeriesId", Description = "Optional. Filter by series id", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] public string SeriesId { get; set; } + } + + [Route("/Shows/{Id}/Similar", "GET")] + [Api(Description = "Finds tv shows similar to a given one.")] + public class GetSimilarShows : BaseGetSimilarItemsFromItem + { + } + [Route("/Shows/{Id}/Episodes", "GET")] + [Api(Description = "Finds tv shows similar to a given one.")] + public class GetEpisodes : IReturn<ItemsResult>, IHasItemFields + { /// <summary> - /// Gets the item fields. + /// Gets or sets the user id. /// </summary> - /// <returns>IEnumerable{ItemFields}.</returns> - public IEnumerable<ItemFields> GetItemFields() - { - var val = Fields; - - if (string.IsNullOrEmpty(val)) - { - return new ItemFields[] { }; - } + /// <value>The user id.</value> + [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")] + public Guid UserId { get; set; } - return val.Split(',').Select(v => - { - ItemFields value; + /// <summary> + /// Fields to return within the items, in addition to basic information + /// </summary> + /// <value>The fields.</value> + [ApiMember(Name = "Fields", Description = "Optional. Specify additional fields of information to return in the output. This allows multiple, comma delimeted. Options: Budget, Chapters, CriticRatingSummary, DateCreated, Genres, HomePageUrl, IndexOptions, MediaStreams, Overview, OverviewHtml, ParentId, Path, People, ProviderIds, PrimaryImageAspectRatio, Revenue, SortName, Studios, Taglines, TrailerUrls", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)] + public string Fields { get; set; } - if (Enum.TryParse(v, true, out value)) - { - return (ItemFields?)value; - } - return null; + [ApiMember(Name = "Id", Description = "The series id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")] + public Guid Id { get; set; } - }).Where(i => i.HasValue).Select(i => i.Value); - } - } + [ApiMember(Name = "Season", Description = "Optional filter by season number.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] + public int? Season { get; set; } - [Route("/Shows/{Id}/Similar", "GET")] - [Api(Description = "Finds tv shows similar to a given one.")] - public class GetSimilarShows : BaseGetSimilarItemsFromItem - { + [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; } } /// <summary> @@ -311,5 +313,88 @@ namespace MediaBrowser.Api return items; } + + public object Get(GetEpisodes request) + { + var user = _userManager.GetUserById(request.UserId); + + var series = _libraryManager.GetItemById(request.Id) as Series; + + var fields = request.GetItemFields().ToList(); + + var episodes = series.GetRecursiveChildren(user) + .OfType<Episode>(); + + var sortOrder = ItemSortBy.SortName; + + if (request.Season.HasValue) + { + episodes = FilterEpisodesBySeason(episodes, request.Season.Value, true); + + sortOrder = ItemSortBy.AiredEpisodeOrder; + } + + var config = user.Configuration; + + if (!config.DisplayMissingEpisodes) + { + episodes = episodes.Where(i => !i.IsMissingEpisode); + } + if (!config.DisplayUnairedEpisodes) + { + episodes = episodes.Where(i => !i.IsVirtualUnaired); + } + + // ExcludeLocationTypes + if (!string.IsNullOrEmpty(request.ExcludeLocationTypes)) + { + var vals = request.ExcludeLocationTypes.Split(','); + episodes = episodes.Where(f => !vals.Contains(f.LocationType.ToString(), StringComparer.OrdinalIgnoreCase)); + } + + episodes = _libraryManager.Sort(episodes, user, new[] { sortOrder }, SortOrder.Ascending) + .Cast<Episode>(); + + var returnItems = episodes.Select(i => _dtoService.GetBaseItemDto(i, fields, user)) + .ToArray(); + + return new ItemsResult + { + TotalRecordCount = returnItems.Length, + Items = returnItems + }; + } + + internal static IEnumerable<Episode> FilterEpisodesBySeason(IEnumerable<Episode> episodes, int seasonNumber, bool includeSpecials) + { + if (!includeSpecials || seasonNumber < 1) + { + return episodes.Where(i => (i.PhysicalSeasonNumber ?? -1) == seasonNumber); + } + + var episodeList = episodes.ToList(); + + // We can only enforce the air date requirement if the episodes have air dates + var enforceAirDate = episodeList.Any(i => i.PremiereDate.HasValue); + + return episodeList.Where(i => + { + var episode = i; + + if (episode != null) + { + if (enforceAirDate && !episode.PremiereDate.HasValue) + { + return false; + } + + var currentSeasonNumber = episode.AiredSeasonNumber; + + return currentSeasonNumber.HasValue && currentSeasonNumber.Value == seasonNumber; + } + + return false; + }); + } } } diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs b/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs index eba36d8568..6aa87e499d 100644 --- a/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs +++ b/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs @@ -7,7 +7,7 @@ using System; namespace MediaBrowser.Api.UserLibrary { - public abstract class BaseItemsRequest + public abstract class BaseItemsRequest : IHasItemFields { /// <summary> /// Skips over a given number of items within the results. Use for paging. @@ -110,32 +110,6 @@ namespace MediaBrowser.Api.UserLibrary } /// <summary> - /// Gets the item fields. - /// </summary> - /// <returns>IEnumerable{ItemFields}.</returns> - public IEnumerable<ItemFields> GetItemFields() - { - var val = Fields; - - if (string.IsNullOrEmpty(val)) - { - return new ItemFields[] { }; - } - - return val.Split(',').Select(v => - { - ItemFields value; - - if (Enum.TryParse(v, true, out value)) - { - return (ItemFields?)value; - } - return null; - - }).Where(i => i.HasValue).Select(i => i.Value); - } - - /// <summary> /// Gets the image types. /// </summary> /// <returns>IEnumerable{ImageType}.</returns> diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index 3936014c5c..cae74cc2f4 100644 --- a/MediaBrowser.Api/UserLibrary/ItemsService.cs +++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs @@ -1012,7 +1012,7 @@ namespace MediaBrowser.Api.UserLibrary if (request.AiredDuringSeason.HasValue) { - items = FilterByAiredDuringSeason(items, request.AiredDuringSeason.Value); + items = TvShowsService.FilterEpisodesBySeason(items.OfType<Episode>(), request.AiredDuringSeason.Value, true); } if (!string.IsNullOrEmpty(request.MinPremiereDate)) @@ -1032,43 +1032,6 @@ namespace MediaBrowser.Api.UserLibrary return items; } - private IEnumerable<BaseItem> FilterByAiredDuringSeason(IEnumerable<BaseItem> items, int seasonNumber) - { - var episodes = items.OfType<Episode>().ToList(); - - // We can only enforce the air date requirement if the episodes have air dates - var enforceAirDate = episodes.Any(i => i.PremiereDate.HasValue); - - return episodes.Where(i => - { - var episode = i; - - if (episode != null) - { - var currentSeasonNumber = episode.AirsAfterSeasonNumber ?? episode.AirsBeforeSeasonNumber ?? episode.ParentIndexNumber; - - // If this produced nothing, try and get it from the parent folder - if (!currentSeasonNumber.HasValue) - { - var season = episode.Parent as Season; - if (season != null) - { - currentSeasonNumber = season.IndexNumber; - } - } - - if (enforceAirDate && !episode.PremiereDate.HasValue) - { - return false; - } - - return currentSeasonNumber.HasValue && currentSeasonNumber.Value == seasonNumber; - } - - return false; - }); - } - /// <summary> /// Determines whether the specified item has image. /// </summary> |
