diff --git a/MediaBrowser.Api/ApiService.cs b/MediaBrowser.Api/ApiService.cs index b3c6237399..46303ddc45 100644 --- a/MediaBrowser.Api/ApiService.cs +++ b/MediaBrowser.Api/ApiService.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Linq; using System.Net; using System.Threading.Tasks; +using MediaBrowser.Model.Entities.Movies; namespace MediaBrowser.Api { @@ -237,6 +238,19 @@ namespace MediaBrowser.Api Status = series.Status }; } + + // Add MovieInfo + Movie movie = item as Movie; + + if (movie != null) + { + int specialFeatureCount = movie.SpecialFeatures == null ? 0 : movie.SpecialFeatures.Count(); + + dto.MovieInfo = new MovieInfo() + { + SpecialFeatureCount = specialFeatureCount + }; + } } /// diff --git a/MediaBrowser.Api/HttpHandlers/MovieSpecialFeaturesHandler.cs b/MediaBrowser.Api/HttpHandlers/MovieSpecialFeaturesHandler.cs new file mode 100644 index 0000000000..5b528b3feb --- /dev/null +++ b/MediaBrowser.Api/HttpHandlers/MovieSpecialFeaturesHandler.cs @@ -0,0 +1,49 @@ +using MediaBrowser.Common.Net.Handlers; +using MediaBrowser.Model.DTO; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Entities.Movies; +using System.ComponentModel.Composition; +using System.Linq; +using System.Net; +using System.Threading.Tasks; + +namespace MediaBrowser.Api.HttpHandlers +{ + /// + /// This handler retrieves special features for movies + /// + [Export(typeof(BaseHandler))] + public class MovieSpecialFeaturesHandler : BaseSerializationHandler + { + public override bool HandlesRequest(HttpListenerRequest request) + { + return ApiService.IsApiUrlMatch("MovieSpecialFeatures", request); + } + + protected override Task GetObjectToSerialize() + { + User user = ApiService.GetUserById(QueryString["userid"], true); + + Movie movie = ApiService.GetItemById(ItemId) as Movie; + + // If none + if (movie.SpecialFeatures == null) + { + return Task.FromResult(new DTOBaseItem[] { }); + } + + return Task.WhenAll(movie.SpecialFeatures.Select(i => + { + return ApiService.GetDTOBaseItem(i, user, includeChildren: false, includePeople: true); + })); + } + + protected string ItemId + { + get + { + return QueryString["id"]; + } + } + } +} diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj index bedb8d62e1..9c9e32359c 100644 --- a/MediaBrowser.Api/MediaBrowser.Api.csproj +++ b/MediaBrowser.Api/MediaBrowser.Api.csproj @@ -61,6 +61,7 @@ + diff --git a/MediaBrowser.ApiInteraction.Portable/ApiClient.cs b/MediaBrowser.ApiInteraction.Portable/ApiClient.cs index 5c79a04ed0..a49c0f7cf4 100644 --- a/MediaBrowser.ApiInteraction.Portable/ApiClient.cs +++ b/MediaBrowser.ApiInteraction.Portable/ApiClient.cs @@ -367,6 +367,17 @@ namespace MediaBrowser.ApiInteraction.Portable GetDataAsync(url, callback); } + /// + /// Gets special features for a Movie + /// + public void GetMovieSpecialFeaturesAsync(Guid itemId, Guid userId, Action callback) + { + string url = ApiUrl + "/MovieSpecialFeatures?id=" + itemId; + url += "&userid=" + userId; + + GetDataAsync(url, callback); + } + /// /// Authenticates a user and returns the result /// diff --git a/MediaBrowser.ApiInteraction/BaseHttpApiClient.cs b/MediaBrowser.ApiInteraction/BaseHttpApiClient.cs index 0fa9465e1b..ca29f8ff47 100644 --- a/MediaBrowser.ApiInteraction/BaseHttpApiClient.cs +++ b/MediaBrowser.ApiInteraction/BaseHttpApiClient.cs @@ -450,6 +450,20 @@ namespace MediaBrowser.ApiInteraction } } + /// + /// Gets special features for a Movie + /// + public async Task GetMovieSpecialFeaturesAsync(Guid itemId, Guid userId) + { + string url = ApiUrl + "/MovieSpecialFeatures?id=" + itemId; + url += "&userid=" + userId; + + using (Stream stream = await GetSerializedStreamAsync(url).ConfigureAwait(false)) + { + return DeserializeFromStream(stream); + } + } + /// /// Updates a user's favorite status for an item and returns the updated UserItemData object. /// diff --git a/MediaBrowser.Model/DTO/DTOBaseItem.cs b/MediaBrowser.Model/DTO/DTOBaseItem.cs index c841335242..8d2cadd872 100644 --- a/MediaBrowser.Model/DTO/DTOBaseItem.cs +++ b/MediaBrowser.Model/DTO/DTOBaseItem.cs @@ -160,6 +160,9 @@ namespace MediaBrowser.Model.DTO public SeriesInfo SeriesInfo { get; set; } [ProtoMember(45)] + public MovieInfo MovieInfo { get; set; } + + [ProtoMember(46)] public bool IsNew { get; set; } public bool IsType(Type type) diff --git a/MediaBrowser.Model/DTO/MovieInfo.cs b/MediaBrowser.Model/DTO/MovieInfo.cs new file mode 100644 index 0000000000..192c805658 --- /dev/null +++ b/MediaBrowser.Model/DTO/MovieInfo.cs @@ -0,0 +1,11 @@ +using ProtoBuf; + +namespace MediaBrowser.Model.DTO +{ + [ProtoContract] + public class MovieInfo + { + [ProtoMember(1)] + public int SpecialFeatureCount { get; set; } + } +} diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj index b6fc3c981e..e39f59cf5e 100644 --- a/MediaBrowser.Model/MediaBrowser.Model.csproj +++ b/MediaBrowser.Model/MediaBrowser.Model.csproj @@ -37,6 +37,7 @@ +