Explorar o código

improve next up performance

Luke Pulverenti %!s(int64=8) %!d(string=hai) anos
pai
achega
2bac4f85ad

+ 17 - 12
Emby.Server.Implementations/TV/TVSeriesManager.cs

@@ -77,7 +77,7 @@ namespace Emby.Server.Implementations.TV
             // Avoid implicitly captured closure
             var episodes = GetNextUpEpisodes(request, user, items);
 
-            return GetResult(episodes, null, request);
+            return GetResult(episodes, request);
         }
 
         public QueryResult<BaseItem> GetNextUp(NextUpQuery request, List<Folder> parentsFolders)
@@ -128,7 +128,7 @@ namespace Emby.Server.Implementations.TV
             // Avoid implicitly captured closure
             var episodes = GetNextUpEpisodes(request, user, items);
 
-            return GetResult(episodes, null, request);
+            return GetResult(episodes, request);
         }
 
         public IEnumerable<Episode> GetNextUpEpisodes(NextUpQuery request, User user, IEnumerable<string> seriesKeys)
@@ -163,8 +163,7 @@ namespace Emby.Server.Implementations.TV
                     return false;
                 })
                 .Select(i => i.Item2())
-                .Where(i => i != null)
-                .Take(request.Limit ?? int.MaxValue);
+                .Where(i => i != null);
         }
 
         private string GetUniqueSeriesKey(BaseItem series)
@@ -232,24 +231,30 @@ namespace Emby.Server.Implementations.TV
             return new Tuple<DateTime, Func<Episode>>(DateTime.MinValue, getEpisode);
         }
 
-        private QueryResult<BaseItem> GetResult(IEnumerable<BaseItem> items, int? totalRecordLimit, NextUpQuery query)
+        private QueryResult<BaseItem> GetResult(IEnumerable<BaseItem> items, NextUpQuery query)
         {
-            var itemsArray = totalRecordLimit.HasValue ? items.Take(totalRecordLimit.Value).ToArray() : items.ToArray();
-            var totalCount = itemsArray.Length;
+            int totalCount = 0;
 
-            if (query.Limit.HasValue)
+            if (query.EnableTotalRecordCount)
             {
-                itemsArray = itemsArray.Skip(query.StartIndex ?? 0).Take(query.Limit.Value).ToArray();
+                var list = items.ToList();
+                totalCount = list.Count;
+                items = list;
             }
-            else if (query.StartIndex.HasValue)
+
+            if (query.StartIndex.HasValue)
+            {
+                items = items.Skip(query.StartIndex.Value);
+            }
+            if (query.Limit.HasValue)
             {
-                itemsArray = itemsArray.Skip(query.StartIndex.Value).ToArray();
+                items = items.Take(query.Limit.Value);
             }
 
             return new QueryResult<BaseItem>
             {
                 TotalRecordCount = totalCount,
-                Items = itemsArray
+                Items = items.ToArray()
             };
         }
     }

+ 8 - 1
MediaBrowser.Api/TvShowsService.cs

@@ -72,6 +72,12 @@ namespace MediaBrowser.Api
 
         [ApiMember(Name = "EnableUserData", Description = "Optional, include user data", IsRequired = false, DataType = "boolean", ParameterType = "query", Verb = "GET")]
         public bool? EnableUserData { get; set; }
+        public bool EnableTotalRecordCount { get; set; }
+
+        public GetNextUpEpisodes()
+        {
+            EnableTotalRecordCount = true;
+        }
     }
 
     [Route("/Shows/Upcoming", "GET", Summary = "Gets a list of upcoming episodes")]
@@ -376,7 +382,8 @@ namespace MediaBrowser.Api
                 ParentId = request.ParentId,
                 SeriesId = request.SeriesId,
                 StartIndex = request.StartIndex,
-                UserId = request.UserId
+                UserId = request.UserId,
+                EnableTotalRecordCount = request.EnableTotalRecordCount
             });
 
             var user = _userManager.GetUserById(request.UserId);

+ 3 - 0
MediaBrowser.Model/Querying/NextUpQuery.cs

@@ -55,9 +55,12 @@ namespace MediaBrowser.Model.Querying
         /// <value>The enable image types.</value>
         public ImageType[] EnableImageTypes { get; set; }
 
+        public bool EnableTotalRecordCount { get; set; }
+
         public NextUpQuery()
         {
             EnableImageTypes = new ImageType[] {};
+            EnableTotalRecordCount = true;
         }
     }
 }