Browse Source

reduce system info refreshing from dashboard

Luke Pulverenti 11 năm trước cách đây
mục cha
commit
b7a8b92c00
32 tập tin đã thay đổi với 180 bổ sung159 xóa
  1. 17 17
      MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs
  2. 18 17
      MediaBrowser.Api/DefaultTheme/Models.cs
  3. 1 2
      MediaBrowser.Api/Images/ImageRequest.cs
  4. 3 3
      MediaBrowser.Api/InstantMixService.cs
  5. 8 8
      MediaBrowser.Api/LibraryService.cs
  6. 2 2
      MediaBrowser.Api/SearchService.cs
  7. 10 3
      MediaBrowser.Api/SimilarItemsHelper.cs
  8. 8 10
      MediaBrowser.Api/TvShowsService.cs
  9. 4 4
      MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs
  10. 6 6
      MediaBrowser.Api/UserLibrary/ItemsService.cs
  11. 5 5
      MediaBrowser.Api/UserLibrary/UserLibraryService.cs
  12. 2 2
      MediaBrowser.Common.Implementations/BaseApplicationHost.cs
  13. 1 1
      MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs
  14. 1 1
      MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs
  15. 1 1
      MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs
  16. 6 2
      MediaBrowser.Controller/Entities/CollectionFolder.cs
  17. 2 5
      MediaBrowser.Controller/Entities/Folder.cs
  18. 0 4
      MediaBrowser.Model/Drawing/ImageOverlay.cs
  19. 1 2
      MediaBrowser.Model/Dto/ImageOptions.cs
  20. 7 6
      MediaBrowser.Model/System/SystemInfo.cs
  21. 3 2
      MediaBrowser.Model/Tasks/TaskInfo.cs
  22. 2 2
      MediaBrowser.Providers/Movies/FanArtMovieProvider.cs
  23. 2 2
      MediaBrowser.Providers/Music/FanArtArtistProvider.cs
  24. 2 2
      MediaBrowser.Providers/TV/FanArtTVProvider.cs
  25. 7 7
      MediaBrowser.Providers/TV/RemoteSeriesProvider.cs
  26. 32 15
      MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs
  27. 5 5
      MediaBrowser.Server.Implementations/Library/LuceneSearchEngine.cs
  28. 10 10
      MediaBrowser.Server.Implementations/Library/Validators/ArtistsValidator.cs
  29. 2 2
      MediaBrowser.Server.Implementations/Library/Validators/PeoplePostScanTask.cs
  30. 6 6
      MediaBrowser.ServerApplication/ApplicationHost.cs
  31. 3 2
      MediaBrowser.WebDashboard/Api/DashboardInfo.cs
  32. 3 3
      MediaBrowser.WebDashboard/Api/DashboardService.cs

+ 17 - 17
MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs

@@ -107,7 +107,7 @@ namespace MediaBrowser.Api.DefaultTheme
                 .Take(50)
                 .Select(i => _dtoService.GetBaseItemDto(i, fields, user));
 
-            view.SpotlightItems = dtos.ToArray();
+            view.SpotlightItems = dtos.ToList();
 
             return view;
         }
@@ -139,7 +139,7 @@ namespace MediaBrowser.Api.DefaultTheme
                 .Take(50)
                 .Select(i => _dtoService.GetBaseItemDto(i, fields, user));
 
-            view.SpotlightItems = dtos.ToArray();
+            view.SpotlightItems = dtos.ToList();
 
             return view;
         }
@@ -178,7 +178,7 @@ namespace MediaBrowser.Api.DefaultTheme
                 .AsParallel()
                 .Select(i => _dtoService.GetBaseItemDto(i, fields, user));
 
-            view.SpotlightItems = dtos.ToArray();
+            view.SpotlightItems = dtos.ToList();
 
             view.ShowsItems = series
                .Where(i => i.BackdropImagePaths.Count > 0)
@@ -186,7 +186,7 @@ namespace MediaBrowser.Api.DefaultTheme
                .Select(i => GetItemStub(i, ImageType.Backdrop))
                .Where(i => i != null)
                .Take(3)
-               .ToArray();
+               .ToList();
 
             var romanceGenres = request.RomanceGenre.Split(',').ToDictionary(i => i, StringComparer.OrdinalIgnoreCase);
             var comedyGenres = request.ComedyGenre.Split(',').ToDictionary(i => i, StringComparer.OrdinalIgnoreCase);
@@ -197,7 +197,7 @@ namespace MediaBrowser.Api.DefaultTheme
              .Select(i => GetItemStub(i, ImageType.Backdrop))
              .Where(i => i != null)
              .Take(3)
-             .ToArray();
+             .ToList();
 
             view.ComedyItems = seriesWithBackdrops
              .Where(i => i.Genres.Any(comedyGenres.ContainsKey))
@@ -205,7 +205,7 @@ namespace MediaBrowser.Api.DefaultTheme
              .Select(i => GetItemStub(i, ImageType.Backdrop))
              .Where(i => i != null)
              .Take(3)
-             .ToArray();
+             .ToList();
 
             view.ActorItems = GetActors(series);
 
@@ -252,14 +252,14 @@ namespace MediaBrowser.Api.DefaultTheme
                 .Take(50)
                 .Select(i => _dtoService.GetBaseItemDto(i, fields, user));
 
-            view.SpotlightItems = dtos.ToArray();
+            view.SpotlightItems = dtos.ToList();
 
             view.MovieItems = moviesWithBackdrops
                .OrderBy(i => Guid.NewGuid())
                .Select(i => GetItemStub(i, ImageType.Backdrop))
                .Where(i => i != null)
                .Take(3)
-               .ToArray();
+               .ToList();
 
             view.TrailerItems = items
              .OfType<Trailer>()
@@ -268,7 +268,7 @@ namespace MediaBrowser.Api.DefaultTheme
              .Select(i => GetItemStub(i, ImageType.Primary))
              .Where(i => i != null)
              .Take(3)
-             .ToArray();
+             .ToList();
 
             view.BoxSetItems = items
              .OfType<BoxSet>()
@@ -277,7 +277,7 @@ namespace MediaBrowser.Api.DefaultTheme
              .Select(i => GetItemStub(i, ImageType.Backdrop))
              .Where(i => i != null)
              .Take(3)
-             .ToArray();
+             .ToList();
 
             view.ThreeDItems = moviesWithBackdrops
              .Where(i => i.Is3D)
@@ -285,7 +285,7 @@ namespace MediaBrowser.Api.DefaultTheme
              .Select(i => GetItemStub(i, ImageType.Backdrop))
              .Where(i => i != null)
              .Take(3)
-             .ToArray();
+             .ToList();
 
             var romanceGenres = request.RomanceGenre.Split(',').ToDictionary(i => i, StringComparer.OrdinalIgnoreCase);
             var comedyGenres = request.ComedyGenre.Split(',').ToDictionary(i => i, StringComparer.OrdinalIgnoreCase);
@@ -296,7 +296,7 @@ namespace MediaBrowser.Api.DefaultTheme
              .Select(i => GetItemStub(i, ImageType.Backdrop))
              .Where(i => i != null)
              .Take(3)
-             .ToArray();
+             .ToList();
 
             view.ComedyItems = moviesWithBackdrops
              .Where(i => i.Genres.Any(comedyGenres.ContainsKey))
@@ -304,7 +304,7 @@ namespace MediaBrowser.Api.DefaultTheme
              .Select(i => GetItemStub(i, ImageType.Backdrop))
              .Where(i => i != null)
              .Take(3)
-             .ToArray();
+             .ToList();
 
             view.HDItems = hdMovies
              .Where(i => i.BackdropImagePaths.Count > 0)
@@ -312,7 +312,7 @@ namespace MediaBrowser.Api.DefaultTheme
              .Select(i => GetItemStub(i, ImageType.Backdrop))
              .Where(i => i != null)
              .Take(3)
-             .ToArray();
+             .ToList();
 
             view.FamilyMovies = familyMovies
              .Where(i => i.BackdropImagePaths.Count > 0)
@@ -320,7 +320,7 @@ namespace MediaBrowser.Api.DefaultTheme
              .Select(i => GetItemStub(i, ImageType.Backdrop))
              .Where(i => i != null)
              .Take(3)
-             .ToArray();
+             .ToList();
 
             view.PeopleItems = GetActors(items);
 
@@ -362,7 +362,7 @@ namespace MediaBrowser.Api.DefaultTheme
             }
         }
 
-        private ItemStub[] GetActors(IEnumerable<BaseItem> mediaItems)
+        private List<ItemStub> GetActors(IEnumerable<BaseItem> mediaItems)
         {
             var actors = mediaItems.SelectMany(i => i.People)
                 .Select(i => i.Name)
@@ -390,7 +390,7 @@ namespace MediaBrowser.Api.DefaultTheme
             })
             .Where(i => i != null)
             .Take(3)
-            .ToArray();
+            .ToList();
         }
 
         private ItemStub GetItemStub(BaseItem item, ImageType imageType)

+ 18 - 17
MediaBrowser.Api/DefaultTheme/Models.cs

@@ -1,6 +1,7 @@
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
 using System;
+using System.Collections.Generic;
 
 namespace MediaBrowser.Api.DefaultTheme
 {
@@ -14,19 +15,19 @@ namespace MediaBrowser.Api.DefaultTheme
 
     public class MoviesView
     {
-        public BaseItemDto[] SpotlightItems { get; set; }
-        public ItemStub[] MovieItems { get; set; }
-        public ItemStub[] PeopleItems { get; set; }
+        public List<BaseItemDto> SpotlightItems { get; set; }
+        public List<ItemStub> MovieItems { get; set; }
+        public List<ItemStub> PeopleItems { get; set; }
 
-        public ItemStub[] BoxSetItems { get; set; }
-        public ItemStub[] TrailerItems { get; set; }
-        public ItemStub[] HDItems { get; set; }
-        public ItemStub[] ThreeDItems { get; set; }
+        public List<ItemStub> BoxSetItems { get; set; }
+        public List<ItemStub> TrailerItems { get; set; }
+        public List<ItemStub> HDItems { get; set; }
+        public List<ItemStub> ThreeDItems { get; set; }
 
-        public ItemStub[] FamilyMovies { get; set; }
+        public List<ItemStub> FamilyMovies { get; set; }
 
-        public ItemStub[] RomanceItems { get; set; }
-        public ItemStub[] ComedyItems { get; set; }
+        public List<ItemStub> RomanceItems { get; set; }
+        public List<ItemStub> ComedyItems { get; set; }
 
         public double FamilyMoviePercentage { get; set; }
 
@@ -35,21 +36,21 @@ namespace MediaBrowser.Api.DefaultTheme
 
     public class TvView
     {
-        public BaseItemDto[] SpotlightItems { get; set; }
-        public ItemStub[] ShowsItems { get; set; }
-        public ItemStub[] ActorItems { get; set; }
+        public List<BaseItemDto> SpotlightItems { get; set; }
+        public List<ItemStub> ShowsItems { get; set; }
+        public List<ItemStub> ActorItems { get; set; }
 
-        public ItemStub[] RomanceItems { get; set; }
-        public ItemStub[] ComedyItems { get; set; }
+        public List<ItemStub> RomanceItems { get; set; }
+        public List<ItemStub> ComedyItems { get; set; }
     }
 
     public class GamesView
     {
-        public BaseItemDto[] SpotlightItems { get; set; }
+        public List<BaseItemDto> SpotlightItems { get; set; }
     }
 
     public class HomeView
     {
-        public BaseItemDto[] SpotlightItems { get; set; }
+        public List<BaseItemDto> SpotlightItems { get; set; }
     }
 }

+ 1 - 2
MediaBrowser.Api/Images/ImageRequest.cs

@@ -57,14 +57,13 @@ namespace MediaBrowser.Api.Images
         public ImageOutputFormat Format { get; set; }
 
         [ApiMember(Name = "Indicator", Description = "Determines what overlay to render, if any. none, watched.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
-        public ImageOverlay Indicator { get; set; }
+        public ImageOverlay? Indicator { get; set; }
         
         public ImageRequest()
         {
             EnableImageEnhancers = true;
 
             Format = ImageOutputFormat.Original;
-            Indicator = ImageOverlay.None;
         }
     }
 

+ 3 - 3
MediaBrowser.Api/InstantMixService.cs

@@ -124,14 +124,14 @@ namespace MediaBrowser.Api
                 .Select(i => i.Item1)
                 .Take(limit)
                 .OrderBy(i => Guid.NewGuid())
-                .ToArray();
+                .ToList();
 
             var result = new ItemsResult
             {
-                TotalRecordCount = items.Length
+                TotalRecordCount = items.Count
             };
 
-            var dtos = items.Take(request.Limit ?? items.Length)
+            var dtos = items.Take(request.Limit ?? items.Count)
                 .Select(i => _dtoService.GetBaseItemDto(i, fields, user));
 
             result.Items = dtos.ToArray();

+ 8 - 8
MediaBrowser.Api/LibraryService.cs

@@ -235,7 +235,7 @@ namespace MediaBrowser.Api
         /// </summary>
         /// <param name="request">The request.</param>
         /// <returns>Task{BaseItemDto[]}.</returns>
-        public BaseItemDto[] GetAncestors(GetAncestors request)
+        public List<BaseItemDto> GetAncestors(GetAncestors request)
         {
             var item = _dtoService.GetItemByDtoId(request.Id);
 
@@ -267,7 +267,7 @@ namespace MediaBrowser.Api
                 parent = parent.Parent;
             }
 
-            return baseItemDtos.ToArray();
+            return baseItemDtos.ToList();
         }
 
         private BaseItem TranslateParentItem(BaseItem item, User user)
@@ -463,7 +463,7 @@ namespace MediaBrowser.Api
                 Id = request.Id,
                 UserId = request.UserId
 
-            }).Result;
+            });
 
             var themeVideos = GetThemeVideos(new GetThemeVideos
             {
@@ -471,7 +471,7 @@ namespace MediaBrowser.Api
                 Id = request.Id,
                 UserId = request.UserId
 
-            }).Result;
+            });
 
             return ToOptimizedResult(new AllThemeMediaResult
             {
@@ -487,12 +487,12 @@ namespace MediaBrowser.Api
         /// <returns>System.Object.</returns>
         public object Get(GetThemeSongs request)
         {
-            var result = GetThemeSongs(request).Result;
+            var result = GetThemeSongs(request);
 
             return ToOptimizedResult(result);
         }
 
-        private async Task<ThemeMediaResult> GetThemeSongs(GetThemeSongs request)
+        private ThemeMediaResult GetThemeSongs(GetThemeSongs request)
         {
             var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;
 
@@ -533,12 +533,12 @@ namespace MediaBrowser.Api
         /// <returns>System.Object.</returns>
         public object Get(GetThemeVideos request)
         {
-            var result = GetThemeVideos(request).Result;
+            var result = GetThemeVideos(request);
 
             return ToOptimizedResult(result);
         }
 
-        public async Task<ThemeMediaResult> GetThemeVideos(GetThemeVideos request)
+        public ThemeMediaResult GetThemeVideos(GetThemeVideos request)
         {
             var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;
 

+ 2 - 2
MediaBrowser.Api/SearchService.cs

@@ -118,7 +118,7 @@ namespace MediaBrowser.Api
 
             var results = await _searchEngine.GetSearchHints(inputItems, request.SearchTerm).ConfigureAwait(false);
 
-            var searchResultArray = results.ToArray();
+            var searchResultArray = results.ToList();
 
             IEnumerable<SearchHintInfo> returnResults = searchResultArray;
 
@@ -134,7 +134,7 @@ namespace MediaBrowser.Api
 
             return new SearchHintResult
             {
-                TotalRecordCount = searchResultArray.Length,
+                TotalRecordCount = searchResultArray.Count,
 
                 SearchHints = returnResults.Select(GetSearchHintResult).ToArray()
             };

+ 10 - 3
MediaBrowser.Api/SimilarItemsHelper.cs

@@ -108,13 +108,20 @@ namespace MediaBrowser.Api
                                  : user.RootFolder.GetRecursiveChildren(user);
 
             var items = GetSimilaritems(item, inputItems, includeInSearch, getSimilarityScore)
-                .ToArray();
+                .ToList();
+
+            IEnumerable<BaseItem> returnItems = items;
+
+            if (request.Limit.HasValue)
+            {
+                returnItems = returnItems.Take(request.Limit.Value);
+            }
 
             var result = new ItemsResult
             {
-                Items = items.Take(request.Limit ?? items.Length).Select(i => dtoService.GetBaseItemDto(i, fields, user)).ToArray(),
+                Items = returnItems.Select(i => dtoService.GetBaseItemDto(i, fields, user)).ToArray(),
 
-                TotalRecordCount = items.Length
+                TotalRecordCount = items.Count
             };
 
             return result;

+ 8 - 10
MediaBrowser.Api/TvShowsService.cs

@@ -3,13 +3,11 @@ using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Persistence;
-using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Querying;
 using ServiceStack.ServiceHost;
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using System.Threading.Tasks;
 
 namespace MediaBrowser.Api
 {
@@ -144,7 +142,7 @@ namespace MediaBrowser.Api
         /// <returns>System.Object.</returns>
         public object Get(GetNextUpEpisodes request)
         {
-            var result = GetNextUpEpisodes(request).Result;
+            var result = GetNextUpEpisodes(request);
 
             return ToOptimizedResult(result);
         }
@@ -154,18 +152,18 @@ namespace MediaBrowser.Api
         /// </summary>
         /// <param name="request">The request.</param>
         /// <returns>Task{ItemsResult}.</returns>
-        private async Task<ItemsResult> GetNextUpEpisodes(GetNextUpEpisodes request)
+        private ItemsResult GetNextUpEpisodes(GetNextUpEpisodes request)
         {
             var user = _userManager.GetUserById(request.UserId);
 
-            var itemsArray = user.RootFolder
+            var itemsList = user.RootFolder
                 .GetRecursiveChildren(user)
                 .OfType<Series>()
                 .AsParallel()
                 .Select(i => GetNextUp(i, user))
-                .ToArray();
+                .ToList();
 
-            itemsArray = itemsArray
+            itemsList = itemsList
                 .Where(i => i.Item1 != null)
                 .OrderByDescending(i =>
                 {
@@ -185,9 +183,9 @@ namespace MediaBrowser.Api
                     return 0;
                 })
                 .ThenByDescending(i => i.Item1.PremiereDate ?? DateTime.MinValue)
-                .ToArray();
+                .ToList();
 
-            var pagedItems = ApplyPaging(request, itemsArray.Select(i => i.Item1));
+            var pagedItems = ApplyPaging(request, itemsList.Select(i => i.Item1));
 
             var fields = request.GetItemFields().ToList();
 
@@ -195,7 +193,7 @@ namespace MediaBrowser.Api
 
             return new ItemsResult
             {
-                TotalRecordCount = itemsArray.Length,
+                TotalRecordCount = itemsList.Count,
                 Items = returnItems
             };
         }

+ 4 - 4
MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs

@@ -96,13 +96,13 @@ namespace MediaBrowser.Api.UserLibrary
 
             filteredItems = ItemsService.ApplySortOrder(request, filteredItems, user, LibraryManager).Cast<TItemType>();
 
-            var ibnItemsArray = filteredItems.ToArray();
+            var ibnItemsArray = filteredItems.ToList();
 
             IEnumerable<TItemType> ibnItems = ibnItemsArray;
 
             var result = new ItemsResult
             {
-                TotalRecordCount = ibnItemsArray.Length
+                TotalRecordCount = ibnItemsArray.Count
             };
 
             if (request.StartIndex.HasValue || request.Limit.HasValue)
@@ -142,8 +142,8 @@ namespace MediaBrowser.Api.UserLibrary
                 items = items.Where(i => string.Compare(request.NameStartsWithOrGreater, i.Name, StringComparison.CurrentCultureIgnoreCase) < 1);
             }
 
-            var imageTypes = request.GetImageTypes().ToArray();
-            if (imageTypes.Length > 0)
+            var imageTypes = request.GetImageTypes().ToList();
+            if (imageTypes.Count > 0)
             {
                 items = items.Where(item => imageTypes.Any(imageType => ItemsService.HasImage(item, imageType)));
             }

+ 6 - 6
MediaBrowser.Api/UserLibrary/ItemsService.cs

@@ -254,7 +254,7 @@ namespace MediaBrowser.Api.UserLibrary
 
             items = ApplySortOrder(request, items, user, _libraryManager);
 
-            var itemsArray = items.ToArray();
+            var itemsArray = items.ToList();
 
             var pagedItems = ApplyPaging(request, itemsArray);
 
@@ -264,7 +264,7 @@ namespace MediaBrowser.Api.UserLibrary
 
             return new ItemsResult
             {
-                TotalRecordCount = itemsArray.Length,
+                TotalRecordCount = itemsArray.Count,
                 Items = returnItems
             };
         }
@@ -307,9 +307,9 @@ namespace MediaBrowser.Api.UserLibrary
         /// <returns>IEnumerable{BaseItem}.</returns>
         internal static IEnumerable<BaseItem> ApplySortOrder(BaseItemsRequest request, IEnumerable<BaseItem> items, User user, ILibraryManager libraryManager)
         {
-            var orderBy = request.GetOrderBy().ToArray();
+            var orderBy = request.GetOrderBy().ToList();
 
-            return orderBy.Length == 0 ? items : libraryManager.Sort(items, user, orderBy, request.SortOrder ?? SortOrder.Ascending);
+            return orderBy.Count == 0 ? items : libraryManager.Sort(items, user, orderBy, request.SortOrder ?? SortOrder.Ascending);
         }
 
         /// <summary>
@@ -603,8 +603,8 @@ namespace MediaBrowser.Api.UserLibrary
                 items = items.Where(i => !string.IsNullOrEmpty(i.MediaType) && types.Contains(i.MediaType, StringComparer.OrdinalIgnoreCase));
             }
 
-            var imageTypes = request.GetImageTypes().ToArray();
-            if (imageTypes.Length > 0)
+            var imageTypes = request.GetImageTypes().ToList();
+            if (imageTypes.Count > 0)
             {
                 items = items.Where(item => imageTypes.Any(imageType => HasImage(item, imageType)));
             }

+ 5 - 5
MediaBrowser.Api/UserLibrary/UserLibraryService.cs

@@ -398,7 +398,7 @@ namespace MediaBrowser.Api.UserLibrary
             return ToOptimizedResult(result);
         }
 
-        private BaseItemDto[] GetAsync(GetSpecialFeatures request)
+        private List<BaseItemDto> GetAsync(GetSpecialFeatures request)
         {
             var user = _userManager.GetUserById(request.UserId);
 
@@ -420,7 +420,7 @@ namespace MediaBrowser.Api.UserLibrary
                     .OrderBy(i => i.SortName)
                     .Select(i => _dtoService.GetBaseItemDto(i, fields, user, movie1));
 
-                return dtos.ToArray();
+                return dtos.ToList();
             }
 
             var series = item as Series;
@@ -448,7 +448,7 @@ namespace MediaBrowser.Api.UserLibrary
                     .ThenBy(i => i.SortName)
                     .Select(i => _dtoService.GetBaseItemDto(i, fields, user));
 
-                return dtos.ToArray();
+                return dtos.ToList();
             }
 
             throw new ArgumentException("The item does not support special features");
@@ -466,7 +466,7 @@ namespace MediaBrowser.Api.UserLibrary
             return ToOptimizedResult(result);
         }
 
-        private BaseItemDto[] GetAsync(GetLocalTrailers request)
+        private List<BaseItemDto> GetAsync(GetLocalTrailers request)
         {
             var user = _userManager.GetUserById(request.UserId);
 
@@ -480,7 +480,7 @@ namespace MediaBrowser.Api.UserLibrary
                 .OrderBy(i => i.SortName)
                 .Select(i => _dtoService.GetBaseItemDto(i, fields, user, item));
 
-            return dtos.ToArray();
+            return dtos.ToList();
         }
 
         /// <summary>

+ 2 - 2
MediaBrowser.Common.Implementations/BaseApplicationHost.cs

@@ -238,7 +238,7 @@ namespace MediaBrowser.Common.Implementations
         {
             FailedAssemblies.Clear();
 
-            var assemblies = GetComposablePartAssemblies().ToArray();
+            var assemblies = GetComposablePartAssemblies().ToList();
 
             foreach (var assembly in assemblies)
             {
@@ -431,7 +431,7 @@ namespace MediaBrowser.Common.Implementations
         /// <returns>IEnumerable{``0}.</returns>
         public IEnumerable<T> GetExports<T>(bool manageLiftime = true)
         {
-            var parts = GetExportTypes<T>().Select(CreateInstance).Cast<T>().ToArray();
+            var parts = GetExportTypes<T>().Select(CreateInstance).Cast<T>().ToList();
 
             if (manageLiftime)
             {

+ 1 - 1
MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs

@@ -470,7 +470,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
         {
             var message = new HttpRequestMessage(HttpMethod.Get, options.Url);
 
-            foreach (var pair in options.RequestHeaders.ToArray())
+            foreach (var pair in options.RequestHeaders.ToList())
             {
                 message.Headers.Add(pair.Key, pair.Value);
             }

+ 1 - 1
MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs

@@ -23,7 +23,7 @@ namespace MediaBrowser.Common.ScheduledTasks
                 State = task.State,
                 Id = task.Id,
                 LastExecutionResult = task.LastExecutionResult,
-                Triggers = task.Triggers.Select(GetTriggerInfo).ToArray(),
+                Triggers = task.Triggers.Select(GetTriggerInfo).ToList(),
                 Description = task.Description,
                 Category = task.Category
             };

+ 1 - 1
MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs

@@ -35,6 +35,6 @@ namespace MediaBrowser.Controller.Drawing
 
         public ImageOutputFormat OutputFormat { get; set; }
 
-        public ImageOverlay Indicator { get; set; }
+        public ImageOverlay? Indicator { get; set; }
     }
 }

+ 6 - 2
MediaBrowser.Controller/Entities/CollectionFolder.cs

@@ -65,6 +65,8 @@ namespace MediaBrowser.Controller.Entities
                 IndexCache.Clear();
             }
 
+            ResetDynamicChildren();
+
             return NullTaskResult;
         }
 
@@ -99,7 +101,8 @@ namespace MediaBrowser.Controller.Entities
             return LibraryManager.RootFolder.Children
                 .OfType<Folder>()
                 .Where(i => i.Path != null && locationsDicionary.ContainsKey(i.Path))
-                .SelectMany(c => c.LinkedChildren).ToList();
+                .SelectMany(c => c.LinkedChildren)
+                .ToList();
         }
 
         private IEnumerable<BaseItem> _actualChildren;
@@ -131,7 +134,8 @@ namespace MediaBrowser.Controller.Entities
                 LibraryManager.RootFolder.Children
                 .OfType<Folder>()
                 .Where(i => i.Path != null && locationsDicionary.ContainsKey(i.Path))
-                .SelectMany(c => c.Children);
+                .SelectMany(c => c.Children)
+                .ToList();
         }
 
         public void ResetDynamicChildren()

+ 2 - 5
MediaBrowser.Controller/Entities/Folder.cs

@@ -99,7 +99,7 @@ namespace MediaBrowser.Controller.Entities
                 item.DateModified = DateTime.UtcNow;
             }
 
-            _children.Add(item);
+            AddChildrenInternal(new[] { item });
 
             await LibraryManager.CreateItem(item, cancellationToken).ConfigureAwait(false);
 
@@ -728,10 +728,7 @@ namespace MediaBrowser.Controller.Entities
 
                 if (actualRemovals.Count > 0)
                 {
-                    lock (ChildrenSyncLock)
-                    {
-                        _children = new ConcurrentBag<BaseItem>(_children.Except(actualRemovals));
-                    }
+                    RemoveChildrenInternal(actualRemovals);
                 }
 
                 await LibraryManager.CreateItems(newItems, cancellationToken).ConfigureAwait(false);

+ 0 - 4
MediaBrowser.Model/Drawing/ImageOverlay.cs

@@ -6,10 +6,6 @@ namespace MediaBrowser.Model.Drawing
     /// </summary>
     public enum ImageOverlay
     {
-        /// <summary>
-        /// The none
-        /// </summary>
-        None,
         /// <summary>
         /// The watched
         /// </summary>

+ 1 - 2
MediaBrowser.Model/Dto/ImageOptions.cs

@@ -72,14 +72,13 @@ namespace MediaBrowser.Model.Dto
 
         public ImageOutputFormat Format { get; set; }
 
-        public ImageOverlay Indicator { get; set; }
+        public ImageOverlay? Indicator { get; set; }
         
         public ImageOptions()
         {
             EnableImageEnhancers = true;
 
             Format = ImageOutputFormat.Original;
-            Indicator = ImageOverlay.None;
         }
     }
 }

+ 7 - 6
MediaBrowser.Model/System/SystemInfo.cs

@@ -1,4 +1,5 @@
 using MediaBrowser.Model.Updates;
+using System.Collections.Generic;
 
 namespace MediaBrowser.Model.System
 {
@@ -35,7 +36,7 @@ namespace MediaBrowser.Model.System
         /// Gets or sets the in progress installations.
         /// </summary>
         /// <value>The in progress installations.</value>
-        public InstallationInfo[] InProgressInstallations { get; set; }
+        public List<InstallationInfo> InProgressInstallations { get; set; }
 
         /// <summary>
         /// Gets or sets the web socket port number.
@@ -47,7 +48,7 @@ namespace MediaBrowser.Model.System
         /// Gets or sets the completed installations.
         /// </summary>
         /// <value>The completed installations.</value>
-        public InstallationInfo[] CompletedInstallations { get; set; }
+        public List<InstallationInfo> CompletedInstallations { get; set; }
 
         /// <summary>
         /// Gets or sets a value indicating whether [supports native web socket].
@@ -59,7 +60,7 @@ namespace MediaBrowser.Model.System
         /// Gets or sets plugin assemblies that failed to load.
         /// </summary>
         /// <value>The failed assembly loads.</value>
-        public string[] FailedPluginAssemblies { get; set; }
+        public List<string> FailedPluginAssemblies { get; set; }
 
         /// <summary>
         /// Gets or sets the id.
@@ -84,11 +85,11 @@ namespace MediaBrowser.Model.System
         /// </summary>
         public SystemInfo()
         {
-            InProgressInstallations = new InstallationInfo[] { };
+            InProgressInstallations = new List<InstallationInfo>();
 
-            CompletedInstallations = new InstallationInfo[] { };
+            CompletedInstallations = new List<InstallationInfo>();
 
-            FailedPluginAssemblies = new string[] { };
+            FailedPluginAssemblies = new List<string>();
         }
     }
 }

+ 3 - 2
MediaBrowser.Model/Tasks/TaskInfo.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Collections.Generic;
 
 namespace MediaBrowser.Model.Tasks
 {
@@ -41,7 +42,7 @@ namespace MediaBrowser.Model.Tasks
         /// Gets or sets the triggers.
         /// </summary>
         /// <value>The triggers.</value>
-        public TaskTriggerInfo[] Triggers { get; set; }
+        public List<TaskTriggerInfo> Triggers { get; set; }
 
         /// <summary>
         /// Gets or sets the description.
@@ -60,7 +61,7 @@ namespace MediaBrowser.Model.Tasks
         /// </summary>
         public TaskInfo()
         {
-            Triggers = new TaskTriggerInfo[] {};
+            Triggers = new List<TaskTriggerInfo>();
         }
     }
 }

+ 2 - 2
MediaBrowser.Providers/Movies/FanArtMovieProvider.cs

@@ -172,9 +172,9 @@ namespace MediaBrowser.Providers.Movies
                 var files = new DirectoryInfo(path)
                     .EnumerateFiles("*.xml", SearchOption.TopDirectoryOnly)
                     .Select(i => i.LastWriteTimeUtc)
-                    .ToArray();
+                    .ToList();
 
-                if (files.Length > 0)
+                if (files.Count > 0)
                 {
                     return files.Max();
                 }

+ 2 - 2
MediaBrowser.Providers/Music/FanArtArtistProvider.cs

@@ -166,9 +166,9 @@ namespace MediaBrowser.Providers.Music
                 var files = new DirectoryInfo(path)
                     .EnumerateFiles("*.xml", SearchOption.TopDirectoryOnly)
                     .Select(i => i.LastWriteTimeUtc)
-                    .ToArray();
+                    .ToList();
 
-                if (files.Length > 0)
+                if (files.Count > 0)
                 {
                     return files.Max();
                 }

+ 2 - 2
MediaBrowser.Providers/TV/FanArtTVProvider.cs

@@ -103,9 +103,9 @@ namespace MediaBrowser.Providers.TV
                 var files = new DirectoryInfo(path)
                     .EnumerateFiles("*.xml", SearchOption.TopDirectoryOnly)
                     .Select(i => i.LastWriteTimeUtc)
-                    .ToArray();
+                    .ToList();
 
-                if (files.Length > 0)
+                if (files.Count > 0)
                 {
                     return files.Max();
                 }

+ 7 - 7
MediaBrowser.Providers/TV/RemoteSeriesProvider.cs

@@ -165,9 +165,9 @@ namespace MediaBrowser.Providers.TV
                 var files = new DirectoryInfo(path)
                     .EnumerateFiles("*.xml", SearchOption.TopDirectoryOnly)
                     .Select(i => i.LastWriteTimeUtc)
-                    .ToArray();
+                    .ToList();
 
-                if (files.Length > 0)
+                if (files.Count > 0)
                 {
                     return files.Max();
                 }
@@ -222,7 +222,7 @@ namespace MediaBrowser.Providers.TV
         /// <returns>Task{System.Boolean}.</returns>
         private async Task FetchSeriesData(Series series, string seriesId, string seriesDataPath, bool isForcedRefresh, CancellationToken cancellationToken)
         {
-            var files = Directory.EnumerateFiles(seriesDataPath, "*.xml", SearchOption.TopDirectoryOnly).Select(Path.GetFileName).ToArray();
+            var files = Directory.EnumerateFiles(seriesDataPath, "*.xml", SearchOption.TopDirectoryOnly).Select(Path.GetFileName).ToList();
 
             var seriesXmlFilename = ConfigurationManager.Configuration.PreferredMetadataLanguage.ToLower() + ".xml";
 
@@ -555,9 +555,9 @@ namespace MediaBrowser.Providers.TV
                                             .Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries)
                                             .Select(i => i.Trim())
                                             .Where(i => !string.IsNullOrWhiteSpace(i))
-                                            .ToArray();
+                                            .ToList();
 
-                                        if (vals.Length > 0)
+                                        if (vals.Count > 0)
                                         {
                                             item.Genres.Clear();
 
@@ -584,9 +584,9 @@ namespace MediaBrowser.Providers.TV
                                             .Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries)
                                             .Select(i => i.Trim())
                                             .Where(i => !string.IsNullOrWhiteSpace(i))
-                                            .ToArray();
+                                            .ToList();
 
-                                        if (vals.Length > 0)
+                                        if (vals.Count > 0)
                                         {
                                             item.Studios.Clear();
 

+ 32 - 15
MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs

@@ -208,15 +208,27 @@ namespace MediaBrowser.Server.Implementations.Drawing
 
         private WatchedIndicatorDrawer _watchedDrawer;
 
-        private void DrawIndicator(Graphics graphics, int imageWidth, int imageHeight, ImageOverlay indicator)
+        private void DrawIndicator(Graphics graphics, int imageWidth, int imageHeight, ImageOverlay? indicator)
         {
-            if (indicator == ImageOverlay.Watched)
+            if (!indicator.HasValue)
             {
-                _watchedDrawer = _watchedDrawer ?? (_watchedDrawer = new WatchedIndicatorDrawer());
+                return;
+            }
+
+            try
+            {
+                if (indicator.Value == ImageOverlay.Watched)
+                {
+                    _watchedDrawer = _watchedDrawer ?? (_watchedDrawer = new WatchedIndicatorDrawer());
 
-                var currentImageSize = new Size(imageWidth, imageHeight);
+                    var currentImageSize = new Size(imageWidth, imageHeight);
 
-                _watchedDrawer.Process(graphics, currentImageSize);
+                    _watchedDrawer.Process(graphics, currentImageSize);
+                }
+            }
+            catch (Exception ex)
+            {
+                _logger.ErrorException("Error drawing indicator overlay", ex);
             }
         }
 
@@ -338,7 +350,7 @@ namespace MediaBrowser.Server.Implementations.Drawing
         /// <summary>
         /// Gets the cache file path based on a set of parameters
         /// </summary>
-        private string GetCacheFilePath(string originalPath, ImageSize outputSize, int quality, DateTime dateModified, ImageOutputFormat format, ImageOverlay overlay)
+        private string GetCacheFilePath(string originalPath, ImageSize outputSize, int quality, DateTime dateModified, ImageOutputFormat format, ImageOverlay? overlay)
         {
             var filename = originalPath;
 
@@ -355,9 +367,9 @@ namespace MediaBrowser.Server.Implementations.Drawing
                 filename += "format=" + format;
             }
 
-            if (overlay != ImageOverlay.None)
+            if (overlay.HasValue)
             {
-                filename += "overlay=" + overlay;
+                filename += "overlay=" + overlay.Value;
             }
 
             return GetCachePath(_resizedImageCachePath, filename, Path.GetExtension(originalPath));
@@ -414,9 +426,13 @@ namespace MediaBrowser.Server.Implementations.Drawing
 
             try
             {
-                var result = File.ReadAllText(fullCachePath).Split('|').Select(i => double.Parse(i, UsCulture)).ToArray();
+                var result = File.ReadAllText(fullCachePath).Split('|');
 
-                return new ImageSize { Width = result[0], Height = result[1] };
+                return new ImageSize
+                {
+                    Width = double.Parse(result[0], UsCulture),
+                    Height = double.Parse(result[1], UsCulture)
+                };
             }
             catch (IOException)
             {
@@ -429,12 +445,13 @@ namespace MediaBrowser.Server.Implementations.Drawing
             {
                 try
                 {
-                    var result = File.ReadAllText(fullCachePath)
-                        .Split('|')
-                        .Select(i => double.Parse(i, UsCulture))
-                        .ToArray();
+                    var result = File.ReadAllText(fullCachePath).Split('|');
 
-                    return new ImageSize { Width = result[0], Height = result[1] };
+                    return new ImageSize
+                    {
+                        Width = double.Parse(result[0], UsCulture),
+                        Height = double.Parse(result[1], UsCulture)
+                    };
                 }
                 catch (FileNotFoundException)
                 {

+ 5 - 5
MediaBrowser.Server.Implementations/Library/LuceneSearchEngine.cs

@@ -299,7 +299,7 @@ namespace MediaBrowser.Server.Implementations.Library
         /// <param name="searchInput">The search input.</param>
         /// <param name="searchWords">The search input.</param>
         /// <returns>System.Int32.</returns>
-        private Tuple<string, int> GetIndex(string input, string searchInput, string[] searchWords)
+        private Tuple<string, int> GetIndex(string input, string searchInput, List<string> searchWords)
         {
             if (string.IsNullOrEmpty(input))
             {
@@ -324,11 +324,11 @@ namespace MediaBrowser.Server.Implementations.Library
 
             var items = GetWords(input);
 
-            for (var i = 0; i < searchWords.Length; i++)
+            for (var i = 0; i < searchWords.Count; i++)
             {
                 var searchTerm = searchWords[i];
 
-                for (var j = 0; j < items.Length; j++)
+                for (var j = 0; j < items.Count; j++)
                 {
                     var item = items[j];
 
@@ -357,9 +357,9 @@ namespace MediaBrowser.Server.Implementations.Library
         /// </summary>
         /// <param name="term">The term.</param>
         /// <returns>System.String[][].</returns>
-        private string[] GetWords(string term)
+        private List<string> GetWords(string term)
         {
-            return term.Split().Where(i => !string.IsNullOrWhiteSpace(i)).ToArray();
+            return term.Split().Where(i => !string.IsNullOrWhiteSpace(i)).ToList();
         }
     }
 

+ 10 - 10
MediaBrowser.Server.Implementations/Library/Validators/ArtistsValidator.cs

@@ -57,10 +57,10 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
         /// <returns>Task.</returns>
         public async Task Run(IProgress<double> progress, CancellationToken cancellationToken)
         {
-            var allItems = _libraryManager.RootFolder.RecursiveChildren.ToArray();
+            var allItems = _libraryManager.RootFolder.RecursiveChildren.ToList();
 
-            var allMusicArtists = allItems.OfType<MusicArtist>().ToArray();
-            var allSongs = allItems.OfType<Audio>().ToArray();
+            var allMusicArtists = allItems.OfType<MusicArtist>().ToList();
+            var allSongs = allItems.OfType<Audio>().ToList();
 
             var innerProgress = new ActionableProgress<double>();
 
@@ -73,8 +73,8 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
             var numComplete = 0;
 
             var userLibraries = _userManager.Users
-                .Select(i => new Tuple<Guid, IHasArtist[]>(i.Id, i.RootFolder.GetRecursiveChildren(i).OfType<IHasArtist>().ToArray()))
-                .ToArray();
+                .Select(i => new Tuple<Guid, List<IHasArtist>>(i.Id, i.RootFolder.GetRecursiveChildren(i).OfType<IHasArtist>().ToList()))
+                .ToList();
 
             var numArtists = allArtists.Count;
 
@@ -140,11 +140,11 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
 
             var items = allItems
                 .Where(i => i.HasArtist(name))
-                .ToArray();
+                .ToList();
 
             var counts = new ItemByNameCounts
             {
-                TotalCount = items.Length,
+                TotalCount = items.Count,
 
                 SongCount = items.OfType<Audio>().Count(),
 
@@ -167,7 +167,6 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
         private void MergeImages(Dictionary<ImageType, string> source, Dictionary<ImageType, string> target)
         {
             foreach (var key in source.Keys
-                .ToArray()
                 .Where(k => !target.ContainsKey(k)))
             {
                 string path;
@@ -202,7 +201,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
                     return list;
                 })
                 .Distinct(StringComparer.OrdinalIgnoreCase)
-                .ToArray();
+                .ToList();
 
             const int maxTasks = 3;
 
@@ -211,6 +210,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
             var returnArtists = new ConcurrentBag<Artist>();
 
             var numComplete = 0;
+            var numArtists = allArtists.Count;
 
             foreach (var artist in allArtists)
             {
@@ -248,7 +248,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
                     {
                         numComplete++;
                         double percent = numComplete;
-                        percent /= allArtists.Length;
+                        percent /= numArtists;
 
                         progress.Report(100 * percent);
                     }

+ 2 - 2
MediaBrowser.Server.Implementations/Library/Validators/PeoplePostScanTask.cs

@@ -47,7 +47,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
         private void RunInternal(IProgress<double> progress, CancellationToken cancellationToken)
         {
             var userLibraries = _userManager.Users
-                .Select(i => new Tuple<Guid, BaseItem[]>(i.Id, i.RootFolder.GetRecursiveChildren(i).ToArray()))
+                .Select(i => new Tuple<Guid, List<BaseItem>>(i.Id, i.RootFolder.GetRecursiveChildren(i).ToList()))
                 .ToList();
 
             var masterDictionary = new Dictionary<string, Dictionary<Guid, Dictionary<CountType, int>>>(StringComparer.OrdinalIgnoreCase);
@@ -118,7 +118,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
                 var names = media
                     .People.Select(i => i.Name)
                     .Distinct(StringComparer.OrdinalIgnoreCase)
-                    .ToArray();
+                    .ToList();
 
                 CountHelpers.SetItemCounts(userId, media, names, masterDictionary);
             }

+ 6 - 6
MediaBrowser.ServerApplication/ApplicationHost.cs

@@ -460,11 +460,11 @@ namespace MediaBrowser.ServerApplication
                                     GetExports<ILibraryPostScanTask>(),
                                     GetExports<IMetadataSaver>());
 
-            ProviderManager.AddParts(GetExports<BaseMetadataProvider>().ToArray());
+            ProviderManager.AddParts(GetExports<BaseMetadataProvider>());
 
-            IsoManager.AddParts(GetExports<IIsoMounter>().ToArray());
+            IsoManager.AddParts(GetExports<IIsoMounter>());
 
-            ImageProcessor.AddParts(GetExports<IImageEnhancer>().ToArray());
+            ImageProcessor.AddParts(GetExports<IImageEnhancer>());
         }
 
         /// <summary>
@@ -607,9 +607,9 @@ namespace MediaBrowser.ServerApplication
                 IsNetworkDeployed = CanSelfUpdate,
                 WebSocketPortNumber = ServerManager.WebSocketPortNumber,
                 SupportsNativeWebSocket = ServerManager.SupportsNativeWebSocket,
-                FailedPluginAssemblies = FailedAssemblies.ToArray(),
-                InProgressInstallations = InstallationManager.CurrentInstallations.Select(i => i.Item1).ToArray(),
-                CompletedInstallations = InstallationManager.CompletedInstallations.ToArray(),
+                FailedPluginAssemblies = FailedAssemblies.ToList(),
+                InProgressInstallations = InstallationManager.CurrentInstallations.Select(i => i.Item1).ToList(),
+                CompletedInstallations = InstallationManager.CompletedInstallations.ToList(),
                 Id = _systemId,
                 ProgramDataPath = ApplicationPaths.ProgramDataPath,
                 MacAddress = GetMacAddress(),

+ 3 - 2
MediaBrowser.WebDashboard/Api/DashboardInfo.cs

@@ -2,6 +2,7 @@
 using MediaBrowser.Model.System;
 using MediaBrowser.Model.Tasks;
 using System;
+using System.Collections.Generic;
 
 namespace MediaBrowser.WebDashboard.Api
 {
@@ -20,7 +21,7 @@ namespace MediaBrowser.WebDashboard.Api
         /// Gets or sets the running tasks.
         /// </summary>
         /// <value>The running tasks.</value>
-        public TaskInfo[] RunningTasks { get; set; }
+        public List<TaskInfo> RunningTasks { get; set; }
 
         /// <summary>
         /// Gets or sets the application update task id.
@@ -32,7 +33,7 @@ namespace MediaBrowser.WebDashboard.Api
         /// Gets or sets the active connections.
         /// </summary>
         /// <value>The active connections.</value>
-        public SessionInfoDto[] ActiveConnections { get; set; }
+        public List<SessionInfoDto> ActiveConnections { get; set; }
     }
 
 }

+ 3 - 3
MediaBrowser.WebDashboard/Api/DashboardService.cs

@@ -187,7 +187,7 @@ namespace MediaBrowser.WebDashboard.Api
             ITaskManager taskManager,
             ISessionManager connectionManager, IDtoService dtoService)
         {
-            var connections = connectionManager.Sessions.Where(i => i.IsActive).ToArray();
+            var connections = connectionManager.Sessions.Where(i => i.IsActive).ToList();
 
             return new DashboardInfo
             {
@@ -195,11 +195,11 @@ namespace MediaBrowser.WebDashboard.Api
 
                 RunningTasks = taskManager.ScheduledTasks.Where(i => i.State == TaskState.Running || i.State == TaskState.Cancelling)
                                      .Select(ScheduledTaskHelpers.GetTaskInfo)
-                                     .ToArray(),
+                                     .ToList(),
 
                 ApplicationUpdateTaskId = taskManager.ScheduledTasks.First(t => t.ScheduledTask.GetType().Name.Equals("SystemUpdateTask", StringComparison.OrdinalIgnoreCase)).Id,
 
-                ActiveConnections = connections.Select(dtoService.GetSessionInfoDto).ToArray()
+                ActiveConnections = connections.Select(dtoService.GetSessionInfoDto).ToList()
             };
         }