فهرست منبع

A few serialization fixes

LukePulverenti Luke Pulverenti luke pulverenti 12 سال پیش
والد
کامیت
caa369c1a3

+ 31 - 15
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<Studio> entities = await Task.WhenAll<Studio>(item.Studios.Select(c => Kernel.Instance.ItemController.GetStudio(c))).ConfigureAwait(false);
+                Studio[] entities = await Task.WhenAll<Studio>(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;
+                }
             }
         }
 

+ 16 - 5
MediaBrowser.Api/HttpHandlers/GenresHandler.cs

@@ -9,9 +9,9 @@ using MediaBrowser.Model.Entities;
 
 namespace MediaBrowser.Api.HttpHandlers
 {
-    public class GenresHandler : BaseJsonHandler<IEnumerable<IBNItem>>
+    public class GenresHandler : BaseJsonHandler<IBNItem[]>
     {
-        protected override Task<IEnumerable<IBNItem>> GetObjectToSerialize()
+        protected override Task<IBNItem[]> 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
         /// </summary>
-        private async Task<IEnumerable<IBNItem>> GetAllGenres(Folder parent, User user)
+        private async Task<IBNItem[]> GetAllGenres(Folder parent, User user)
         {
             Dictionary<string, int> data = new Dictionary<string, int>();
 
@@ -53,9 +53,20 @@ namespace MediaBrowser.Api.HttpHandlers
                 }
             }
 
-            IEnumerable<Genre> entities = await Task.WhenAll<Genre>(data.Keys.Select(key => { return Kernel.Instance.ItemController.GetGenre(key); })).ConfigureAwait(false);
+            // Get the Genre objects
+            Genre[] entities = await Task.WhenAll<Genre>(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;
         }
     }
 }

+ 16 - 5
MediaBrowser.Api/HttpHandlers/StudiosHandler.cs

@@ -9,9 +9,9 @@ using MediaBrowser.Model.Entities;
 
 namespace MediaBrowser.Api.HttpHandlers
 {
-    public class StudiosHandler : BaseJsonHandler<IEnumerable<IBNItem>>
+    public class StudiosHandler : BaseJsonHandler<IBNItem[]>
     {
-        protected override Task<IEnumerable<IBNItem>> GetObjectToSerialize()
+        protected override Task<IBNItem[]> 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
         /// </summary>
-        private async Task<IEnumerable<IBNItem>> GetAllStudios(Folder parent, User user)
+        private async Task<IBNItem[]> GetAllStudios(Folder parent, User user)
         {
             Dictionary<string, int> data = new Dictionary<string, int>();
 
@@ -53,9 +53,20 @@ namespace MediaBrowser.Api.HttpHandlers
                 }
             }
 
-            IEnumerable<Studio> entities = await Task.WhenAll<Studio>(data.Keys.Select(key => { return Kernel.Instance.ItemController.GetStudio(key); })).ConfigureAwait(false);
+            // Get the Studio objects
+            Studio[] entities = await Task.WhenAll<Studio>(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;
         }
     }
 }

+ 16 - 5
MediaBrowser.Api/HttpHandlers/YearsHandler.cs

@@ -9,9 +9,9 @@ using MediaBrowser.Model.Entities;
 
 namespace MediaBrowser.Api.HttpHandlers
 {
-    public class YearsHandler : BaseJsonHandler<IEnumerable<IBNItem>>
+    public class YearsHandler : BaseJsonHandler<IBNItem[]>
     {
-        protected override Task<IEnumerable<IBNItem>> GetObjectToSerialize()
+        protected override Task<IBNItem[]> 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
         /// </summary>
-        private async Task<IEnumerable<IBNItem>> GetAllYears(Folder parent, User user)
+        private async Task<IBNItem[]> GetAllYears(Folder parent, User user)
         {
             Dictionary<int, int> data = new Dictionary<int, int>();
 
@@ -50,9 +50,20 @@ namespace MediaBrowser.Api.HttpHandlers
                 }
             }
 
-            IEnumerable<Year> entities = await Task.WhenAll<Year>(data.Keys.Select(key => { return Kernel.Instance.ItemController.GetYear(key); })).ConfigureAwait(false);
+            // Get the Year objects
+            Year[] entities = await Task.WhenAll<Year>(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;
         }
     }
 }

+ 2 - 2
MediaBrowser.Model/DTO/DTOBaseItem.cs

@@ -37,10 +37,10 @@ namespace MediaBrowser.Model.DTO
         public string Overview { get; set; }
 
         [ProtoMember(9)]
-        public IList<string> Taglines { get; set; }
+        public string[] Taglines { get; set; }
 
         [ProtoMember(10)]
-        public IList<string> Genres { get; set; }
+        public string[] Genres { get; set; }
 
         [ProtoMember(11)]
         public string DisplayMediaType { get; set; }

+ 3 - 4
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<SubtitleStream> Subtitles { get; set; }
+        public SubtitleStream[] Subtitles { get; set; }
 
         [ProtoMember(7)]
-        public IEnumerable<AudioStream> AudioStreams { get; set; }
+        public AudioStream[] AudioStreams { get; set; }
     }
 }

+ 1 - 1
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; }
     }