diff --git a/MediaBrowser.Api/ApiService.cs b/MediaBrowser.Api/ApiService.cs index e90755f5f5..8c30f688eb 100644 --- a/MediaBrowser.Api/ApiService.cs +++ b/MediaBrowser.Api/ApiService.cs @@ -58,7 +58,12 @@ namespace MediaBrowser.Api dto.BackdropCount = item.BackdropImagePaths == null ? 0 : item.BackdropImagePaths.Count(); dto.DateCreated = item.DateCreated; dto.DisplayMediaType = item.DisplayMediaType; - dto.Genres = item.Genres; + + if (item.Genres != null) + { + dto.Genres = item.Genres.ToArray(); + } + dto.HasArt = !string.IsNullOrEmpty(item.ArtImagePath); dto.HasBanner = !string.IsNullOrEmpty(item.BannerImagePath); dto.HasLogo = !string.IsNullOrEmpty(item.LogoImagePath); @@ -102,7 +107,12 @@ namespace MediaBrowser.Api dto.ProviderIds = item.ProviderIds; dto.RunTimeTicks = item.RunTimeTicks; dto.SortName = item.SortName; - dto.Taglines = item.Taglines; + + if (item.Taglines != null) + { + dto.Taglines = item.Taglines.ToArray(); + } + dto.TrailerUrl = item.TrailerUrl; dto.Type = item.GetType().Name; dto.UserRating = item.UserRating; @@ -143,10 +153,18 @@ namespace MediaBrowser.Api Width = video.Width, Codec = video.Codec, VideoType = video.VideoType, - AudioStreams = video.AudioStreams, - Subtitles = video.Subtitles, ScanType = video.ScanType }; + + if (video.AudioStreams != null) + { + dto.VideoInfo.AudioStreams = video.AudioStreams.ToArray(); + } + + if (video.Subtitles != null) + { + dto.VideoInfo.Subtitles = video.Subtitles.ToArray(); + } } } @@ -155,23 +173,21 @@ namespace MediaBrowser.Api // Attach Studios by transforming them into BaseItemStudio (DTO) if (item.Studios != null) { - IEnumerable entities = await Task.WhenAll(item.Studios.Select(c => Kernel.Instance.ItemController.GetStudio(c))).ConfigureAwait(false); + Studio[] entities = await Task.WhenAll(item.Studios.Select(c => Kernel.Instance.ItemController.GetStudio(c))).ConfigureAwait(false); - dto.Studios = item.Studios.Select(s => + dto.Studios = new BaseItemStudio[entities.Length]; + + for (int i = 0; i < entities.Length; i++) { + Studio entity = entities[i]; BaseItemStudio baseItemStudio = new BaseItemStudio(); - baseItemStudio.Name = s; - - Studio ibnObject = entities.First(i => i.Name.Equals(s, StringComparison.OrdinalIgnoreCase)); + baseItemStudio.Name = entity.Name; - if (ibnObject != null) - { - baseItemStudio.HasImage = !string.IsNullOrEmpty(ibnObject.PrimaryImagePath); - } + baseItemStudio.HasImage = !string.IsNullOrEmpty(entity.PrimaryImagePath); - return baseItemStudio; - }).ToArray(); + dto.Studios[i] = baseItemStudio; + } } } diff --git a/MediaBrowser.Api/HttpHandlers/GenresHandler.cs b/MediaBrowser.Api/HttpHandlers/GenresHandler.cs index 3280c3e32d..b5608c0a3d 100644 --- a/MediaBrowser.Api/HttpHandlers/GenresHandler.cs +++ b/MediaBrowser.Api/HttpHandlers/GenresHandler.cs @@ -9,9 +9,9 @@ using MediaBrowser.Model.Entities; namespace MediaBrowser.Api.HttpHandlers { - public class GenresHandler : BaseJsonHandler> + public class GenresHandler : BaseJsonHandler { - protected override Task> GetObjectToSerialize() + protected override Task GetObjectToSerialize() { Folder parent = ApiService.GetItemById(QueryString["id"]) as Folder; Guid userId = Guid.Parse(QueryString["userid"]); @@ -24,7 +24,7 @@ namespace MediaBrowser.Api.HttpHandlers /// Gets all genres from all recursive children of a folder /// The CategoryInfo class is used to keep track of the number of times each genres appears /// - private async Task> GetAllGenres(Folder parent, User user) + private async Task GetAllGenres(Folder parent, User user) { Dictionary data = new Dictionary(); @@ -53,9 +53,20 @@ namespace MediaBrowser.Api.HttpHandlers } } - IEnumerable entities = await Task.WhenAll(data.Keys.Select(key => { return Kernel.Instance.ItemController.GetGenre(key); })).ConfigureAwait(false); + // Get the Genre objects + Genre[] entities = await Task.WhenAll(data.Keys.Select(key => { return Kernel.Instance.ItemController.GetGenre(key); })).ConfigureAwait(false); - return entities.Select(e => ApiService.GetIBNItem(e, data[e.Name])); + // Convert to an array of IBNItem + IBNItem[] items = new IBNItem[entities.Length]; + + for (int i = 0; i < entities.Length; i++) + { + Genre e = entities[i]; + + items[i] = ApiService.GetIBNItem(e, data[e.Name]); + } + + return items; } } } diff --git a/MediaBrowser.Api/HttpHandlers/StudiosHandler.cs b/MediaBrowser.Api/HttpHandlers/StudiosHandler.cs index 64348ac896..486aa762b9 100644 --- a/MediaBrowser.Api/HttpHandlers/StudiosHandler.cs +++ b/MediaBrowser.Api/HttpHandlers/StudiosHandler.cs @@ -9,9 +9,9 @@ using MediaBrowser.Model.Entities; namespace MediaBrowser.Api.HttpHandlers { - public class StudiosHandler : BaseJsonHandler> + public class StudiosHandler : BaseJsonHandler { - protected override Task> GetObjectToSerialize() + protected override Task GetObjectToSerialize() { Folder parent = ApiService.GetItemById(QueryString["id"]) as Folder; Guid userId = Guid.Parse(QueryString["userid"]); @@ -24,7 +24,7 @@ namespace MediaBrowser.Api.HttpHandlers /// Gets all studios from all recursive children of a folder /// The CategoryInfo class is used to keep track of the number of times each studio appears /// - private async Task> GetAllStudios(Folder parent, User user) + private async Task GetAllStudios(Folder parent, User user) { Dictionary data = new Dictionary(); @@ -53,9 +53,20 @@ namespace MediaBrowser.Api.HttpHandlers } } - IEnumerable entities = await Task.WhenAll(data.Keys.Select(key => { return Kernel.Instance.ItemController.GetStudio(key); })).ConfigureAwait(false); + // Get the Studio objects + Studio[] entities = await Task.WhenAll(data.Keys.Select(key => { return Kernel.Instance.ItemController.GetStudio(key); })).ConfigureAwait(false); - return entities.Select(e => ApiService.GetIBNItem(e, data[e.Name])); + // Convert to an array of IBNItem + IBNItem[] items = new IBNItem[entities.Length]; + + for (int i = 0; i < entities.Length; i++) + { + Studio e = entities[i]; + + items[i] = ApiService.GetIBNItem(e, data[e.Name]); + } + + return items; } } } diff --git a/MediaBrowser.Api/HttpHandlers/YearsHandler.cs b/MediaBrowser.Api/HttpHandlers/YearsHandler.cs index ee07ac8b0b..ff05120a04 100644 --- a/MediaBrowser.Api/HttpHandlers/YearsHandler.cs +++ b/MediaBrowser.Api/HttpHandlers/YearsHandler.cs @@ -9,9 +9,9 @@ using MediaBrowser.Model.Entities; namespace MediaBrowser.Api.HttpHandlers { - public class YearsHandler : BaseJsonHandler> + public class YearsHandler : BaseJsonHandler { - protected override Task> GetObjectToSerialize() + protected override Task GetObjectToSerialize() { Folder parent = ApiService.GetItemById(QueryString["id"]) as Folder; Guid userId = Guid.Parse(QueryString["userid"]); @@ -24,7 +24,7 @@ namespace MediaBrowser.Api.HttpHandlers /// Gets all years from all recursive children of a folder /// The CategoryInfo class is used to keep track of the number of times each year appears /// - private async Task> GetAllYears(Folder parent, User user) + private async Task GetAllYears(Folder parent, User user) { Dictionary data = new Dictionary(); @@ -50,9 +50,20 @@ namespace MediaBrowser.Api.HttpHandlers } } - IEnumerable entities = await Task.WhenAll(data.Keys.Select(key => { return Kernel.Instance.ItemController.GetYear(key); })).ConfigureAwait(false); + // Get the Year objects + Year[] entities = await Task.WhenAll(data.Keys.Select(key => { return Kernel.Instance.ItemController.GetYear(key); })).ConfigureAwait(false); - return entities.Select(e => ApiService.GetIBNItem(e, data[int.Parse(e.Name)])); + // Convert to an array of IBNItem + IBNItem[] items = new IBNItem[entities.Length]; + + for (int i = 0; i < entities.Length; i++) + { + Year e = entities[i]; + + items[i] = ApiService.GetIBNItem(e, data[int.Parse(e.Name)]); + } + + return items; } } } diff --git a/MediaBrowser.Model/DTO/DTOBaseItem.cs b/MediaBrowser.Model/DTO/DTOBaseItem.cs index 7e85cc84e1..c729db74b5 100644 --- a/MediaBrowser.Model/DTO/DTOBaseItem.cs +++ b/MediaBrowser.Model/DTO/DTOBaseItem.cs @@ -37,10 +37,10 @@ namespace MediaBrowser.Model.DTO public string Overview { get; set; } [ProtoMember(9)] - public IList Taglines { get; set; } + public string[] Taglines { get; set; } [ProtoMember(10)] - public IList Genres { get; set; } + public string[] Genres { get; set; } [ProtoMember(11)] public string DisplayMediaType { get; set; } diff --git a/MediaBrowser.Model/DTO/VideoInfo.cs b/MediaBrowser.Model/DTO/VideoInfo.cs index d55d06626f..8e0d6f38f1 100644 --- a/MediaBrowser.Model/DTO/VideoInfo.cs +++ b/MediaBrowser.Model/DTO/VideoInfo.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Entities; using ProtoBuf; namespace MediaBrowser.Model.DTO @@ -23,9 +22,9 @@ namespace MediaBrowser.Model.DTO public VideoType VideoType { get; set; } [ProtoMember(6)] - public IEnumerable Subtitles { get; set; } + public SubtitleStream[] Subtitles { get; set; } [ProtoMember(7)] - public IEnumerable AudioStreams { get; set; } + public AudioStream[] AudioStreams { get; set; } } } diff --git a/MediaBrowser.Model/Entities/Video.cs b/MediaBrowser.Model/Entities/Video.cs index 5d0e062022..27a9ab8211 100644 --- a/MediaBrowser.Model/Entities/Video.cs +++ b/MediaBrowser.Model/Entities/Video.cs @@ -49,7 +49,7 @@ namespace MediaBrowser.Model.Entities [ProtoMember(2)] public bool IsDefault { get; set; } - [ProtoMember(2)] + [ProtoMember(3)] public bool IsForced { get; set; } }