Forráskód Böngészése

made dtoservice synchronous

Luke Pulverenti 11 éve
szülő
commit
85d7eb917f
26 módosított fájl, 225 hozzáadás és 186 törlés
  1. 9 9
      MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs
  2. 8 8
      MediaBrowser.Api/Images/ImageService.cs
  3. 7 8
      MediaBrowser.Api/InstantMixService.cs
  4. 9 9
      MediaBrowser.Api/LibraryService.cs
  5. 2 2
      MediaBrowser.Api/SimilarItemsHelper.cs
  6. 1 13
      MediaBrowser.Api/TvShowsService.cs
  7. 4 5
      MediaBrowser.Api/UserLibrary/ArtistsService.cs
  8. 5 7
      MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs
  9. 4 5
      MediaBrowser.Api/UserLibrary/GameGenresService.cs
  10. 4 5
      MediaBrowser.Api/UserLibrary/GenresService.cs
  11. 1 1
      MediaBrowser.Api/UserLibrary/ItemsService.cs
  12. 4 5
      MediaBrowser.Api/UserLibrary/MusicGenresService.cs
  13. 4 5
      MediaBrowser.Api/UserLibrary/PersonsService.cs
  14. 4 4
      MediaBrowser.Api/UserLibrary/StudiosService.cs
  15. 12 12
      MediaBrowser.Api/UserLibrary/UserLibraryService.cs
  16. 4 5
      MediaBrowser.Api/UserLibrary/YearsService.cs
  17. 10 7
      MediaBrowser.Api/UserService.cs
  18. 0 1
      MediaBrowser.Api/VideosService.cs
  19. 4 6
      MediaBrowser.Controller/Drawing/ImageHeader.cs
  20. 45 39
      MediaBrowser.Controller/Drawing/ImageManager.cs
  21. 3 4
      MediaBrowser.Controller/Dto/IDtoService.cs
  22. 70 13
      MediaBrowser.Providers/Music/FanArtArtistProvider.cs
  23. 6 8
      MediaBrowser.Server.Implementations/Dto/DtoService.cs
  24. 3 3
      MediaBrowser.Server.Implementations/EntryPoints/WebSocketEvents.cs
  25. 1 1
      MediaBrowser.Server.Implementations/Library/LibraryManager.cs
  26. 1 1
      MediaBrowser.Server.Implementations/Library/Validators/ArtistsValidator.cs

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

@@ -101,12 +101,12 @@ namespace MediaBrowser.Api.DefaultTheme
             var eligibleSpotlightItems = itemsWithBackdrops
                 .Where(i => i is Game || i is Movie || i is Series || i is MusicArtist);
 
-            var spotlightItemTasks = FilterItemsForBackdropDisplay(eligibleSpotlightItems)
+            var dtos = FilterItemsForBackdropDisplay(eligibleSpotlightItems)
                 .OrderBy(i => Guid.NewGuid())
                 .Take(50)
                 .Select(i => _dtoService.GetBaseItemDto(i, fields, user));
 
-            view.SpotlightItems = await Task.WhenAll(spotlightItemTasks).ConfigureAwait(false);
+            view.SpotlightItems = dtos.ToArray();
 
             return view;
         }
@@ -132,13 +132,13 @@ namespace MediaBrowser.Api.DefaultTheme
 
             var fields = new List<ItemFields>();
 
-            var spotlightItemTasks = itemsWithBackdrops
+            var dtos = itemsWithBackdrops
                 .OfType<Game>()
                 .OrderBy(i => Guid.NewGuid())
                 .Take(50)
                 .Select(i => _dtoService.GetBaseItemDto(i, fields, user));
 
-            view.SpotlightItems = await Task.WhenAll(spotlightItemTasks).ConfigureAwait(false);
+            view.SpotlightItems = dtos.ToArray();
 
             return view;
         }
@@ -171,12 +171,12 @@ namespace MediaBrowser.Api.DefaultTheme
 
             var fields = new List<ItemFields>();
 
-            var spotlightItemTasks = FilterItemsForBackdropDisplay(seriesWithBackdrops)
+            var dtos = FilterItemsForBackdropDisplay(seriesWithBackdrops)
                 .OrderBy(i => Guid.NewGuid())
                 .Take(50)
                 .Select(i => _dtoService.GetBaseItemDto(i, fields, user));
 
-            view.SpotlightItems = await Task.WhenAll(spotlightItemTasks).ConfigureAwait(false);
+            view.SpotlightItems = dtos.ToArray();
 
             view.ShowsItems = series
                .Where(i => i.BackdropImagePaths.Count > 0)
@@ -245,12 +245,12 @@ namespace MediaBrowser.Api.DefaultTheme
 
             var fields = new List<ItemFields>();
 
-            var spotlightItemTasks = FilterItemsForBackdropDisplay(itemsWithBackdrops)
+            var dtos = FilterItemsForBackdropDisplay(itemsWithBackdrops)
                 .OrderBy(i => Guid.NewGuid())
                 .Take(50)
                 .Select(i => _dtoService.GetBaseItemDto(i, fields, user));
 
-            view.SpotlightItems = await Task.WhenAll(spotlightItemTasks).ConfigureAwait(false);
+            view.SpotlightItems = dtos.ToArray();
 
             view.MovieItems = moviesWithBackdrops
                .OrderBy(i => Guid.NewGuid())
@@ -350,7 +350,7 @@ namespace MediaBrowser.Api.DefaultTheme
             {
                 var date = Kernel.Instance.ImageManager.GetImageDateModified(item, path);
 
-                var size = Kernel.Instance.ImageManager.GetImageSize(path, date).Result;
+                var size = Kernel.Instance.ImageManager.GetImageSize(path, date);
 
                 return size.Width;
             }

+ 8 - 8
MediaBrowser.Api/Images/ImageService.cs

@@ -361,14 +361,14 @@ namespace MediaBrowser.Api.Images
         {
             var item = _dtoService.GetItemByDtoId(request.Id);
 
-            var result = GetItemImageInfos(item).Result;
+            var result = GetItemImageInfos(item);
 
             return ToOptimizedResult(result);
         }
 
         public object Get(GetItemByNameImageInfos request)
         {
-            var result = GetItemByNameImageInfos(request).Result;
+            var result = GetItemByNameImageInfos(request);
 
             return ToOptimizedResult(result);
         }
@@ -378,7 +378,7 @@ namespace MediaBrowser.Api.Images
         /// </summary>
         /// <param name="request">The request.</param>
         /// <returns>Task{List{ImageInfo}}.</returns>
-        public Task<List<ImageInfo>> GetItemByNameImageInfos(GetItemByNameImageInfos request)
+        private List<ImageInfo> GetItemByNameImageInfos(GetItemByNameImageInfos request)
         {
             var pathInfo = PathInfo.Parse(RequestContext.PathInfo);
             var type = pathInfo.GetArgumentValue<string>(0);
@@ -393,7 +393,7 @@ namespace MediaBrowser.Api.Images
         /// </summary>
         /// <param name="item">The item.</param>
         /// <returns>Task{List{ImageInfo}}.</returns>
-        public async Task<List<ImageInfo>> GetItemImageInfos(BaseItem item)
+        public List<ImageInfo> GetItemImageInfos(BaseItem item)
         {
             var list = new List<ImageInfo>();
 
@@ -405,7 +405,7 @@ namespace MediaBrowser.Api.Images
 
                 var dateModified = Kernel.Instance.ImageManager.GetImageDateModified(item, path);
 
-                var size = await Kernel.Instance.ImageManager.GetImageSize(path, dateModified).ConfigureAwait(false);
+                var size = Kernel.Instance.ImageManager.GetImageSize(path, dateModified);
 
                 list.Add(new ImageInfo
                 {
@@ -426,7 +426,7 @@ namespace MediaBrowser.Api.Images
 
                 var dateModified = Kernel.Instance.ImageManager.GetImageDateModified(item, image);
 
-                var size = await Kernel.Instance.ImageManager.GetImageSize(image, dateModified).ConfigureAwait(false);
+                var size = Kernel.Instance.ImageManager.GetImageSize(image, dateModified);
 
                 list.Add(new ImageInfo
                 {
@@ -450,7 +450,7 @@ namespace MediaBrowser.Api.Images
 
                 var dateModified = Kernel.Instance.ImageManager.GetImageDateModified(item, image);
 
-                var size = await Kernel.Instance.ImageManager.GetImageSize(image, dateModified).ConfigureAwait(false);
+                var size = Kernel.Instance.ImageManager.GetImageSize(image, dateModified);
 
                 list.Add(new ImageInfo
                 {
@@ -482,7 +482,7 @@ namespace MediaBrowser.Api.Images
 
                         var dateModified = Kernel.Instance.ImageManager.GetImageDateModified(item, image);
 
-                        var size = await Kernel.Instance.ImageManager.GetImageSize(image, dateModified).ConfigureAwait(false);
+                        var size = Kernel.Instance.ImageManager.GetImageSize(image, dateModified);
 
                         list.Add(new ImageInfo
                         {

+ 7 - 8
MediaBrowser.Api/InstantMixService.cs

@@ -6,7 +6,6 @@ using ServiceStack.ServiceHost;
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using System.Threading.Tasks;
 
 namespace MediaBrowser.Api
 {
@@ -56,7 +55,7 @@ namespace MediaBrowser.Api
         {
             var item = _dtoService.GetItemByDtoId(request.Id);
 
-            var result = GetInstantMixResult(request, item.Genres).Result;
+            var result = GetInstantMixResult(request, item.Genres);
 
             return ToOptimizedResult(result);
         }
@@ -72,7 +71,7 @@ namespace MediaBrowser.Api
                .Concat(album.Genres)
                .Distinct(StringComparer.OrdinalIgnoreCase);
 
-            var result = GetInstantMixResult(request, genres).Result;
+            var result = GetInstantMixResult(request, genres);
 
             return ToOptimizedResult(result);
         }
@@ -81,7 +80,7 @@ namespace MediaBrowser.Api
         {
             var genre = GetMusicGenre(request.Name, _libraryManager);
 
-            var result = GetInstantMixResult(request, new[] { genre.Name }).Result;
+            var result = GetInstantMixResult(request, new[] { genre.Name });
 
             return ToOptimizedResult(result);
         }
@@ -98,12 +97,12 @@ namespace MediaBrowser.Api
                 .Concat(artist.Genres)
                 .Distinct(StringComparer.OrdinalIgnoreCase);
 
-            var result = GetInstantMixResult(request, genres).Result;
+            var result = GetInstantMixResult(request, genres);
 
             return ToOptimizedResult(result);
         }
 
-        private async Task<ItemsResult> GetInstantMixResult(BaseGetSimilarItems request, IEnumerable<string> genres)
+        private ItemsResult GetInstantMixResult(BaseGetSimilarItems request, IEnumerable<string> genres)
         {
             var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;
 
@@ -132,10 +131,10 @@ namespace MediaBrowser.Api
                 TotalRecordCount = items.Length
             };
 
-            var tasks = items.Take(request.Limit ?? items.Length)
+            var dtos = items.Take(request.Limit ?? items.Length)
                 .Select(i => _dtoService.GetBaseItemDto(i, fields, user));
 
-            result.Items = await Task.WhenAll(tasks).ConfigureAwait(false);
+            result.Items = dtos.ToArray();
 
             return result;
         }

+ 9 - 9
MediaBrowser.Api/LibraryService.cs

@@ -225,7 +225,7 @@ namespace MediaBrowser.Api
         /// <returns>System.Object.</returns>
         public object Get(GetAncestors request)
         {
-            var result = GetAncestors(request).Result;
+            var result = GetAncestors(request);
 
             return ToOptimizedResult(result);
         }
@@ -235,11 +235,11 @@ namespace MediaBrowser.Api
         /// </summary>
         /// <param name="request">The request.</param>
         /// <returns>Task{BaseItemDto[]}.</returns>
-        public async Task<BaseItemDto[]> GetAncestors(GetAncestors request)
+        public BaseItemDto[] GetAncestors(GetAncestors request)
         {
             var item = _dtoService.GetItemByDtoId(request.Id);
 
-            var tasks = new List<Task<BaseItemDto>>();
+            var baseItemDtos = new List<BaseItemDto>();
 
             var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;
 
@@ -257,7 +257,7 @@ namespace MediaBrowser.Api
                     parent = TranslateParentItem(parent, user);
                 }
 
-                tasks.Add(_dtoService.GetBaseItemDto(parent, fields, user));
+                baseItemDtos.Add(_dtoService.GetBaseItemDto(parent, fields, user));
 
                 if (parent is UserRootFolder)
                 {
@@ -267,7 +267,7 @@ namespace MediaBrowser.Api
                 parent = parent.Parent;
             }
 
-            return await Task.WhenAll(tasks).ConfigureAwait(false);
+            return baseItemDtos.ToArray();
         }
 
         private BaseItem TranslateParentItem(BaseItem item, User user)
@@ -512,11 +512,11 @@ namespace MediaBrowser.Api
                     .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true))
                     .ToList();
 
-            var tasks = item.ThemeSongIds.Select(_itemRepo.RetrieveItem)
+            var dtos = item.ThemeSongIds.Select(_itemRepo.RetrieveItem)
                             .OrderBy(i => i.SortName)
                             .Select(i => _dtoService.GetBaseItemDto(i, fields, user, item));
 
-            var items = await Task.WhenAll(tasks).ConfigureAwait(false);
+            var items = dtos.ToArray();
 
             return new ThemeMediaResult
             {
@@ -559,11 +559,11 @@ namespace MediaBrowser.Api
                     .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true))
                     .ToList();
 
-            var tasks = item.ThemeVideoIds.Select(_itemRepo.RetrieveItem)
+            var dtos = item.ThemeVideoIds.Select(_itemRepo.RetrieveItem)
                             .OrderBy(i => i.SortName)
                             .Select(i => _dtoService.GetBaseItemDto(i, fields, user, item));
 
-            var items = await Task.WhenAll(tasks).ConfigureAwait(false);
+            var items = dtos.ToArray();
 
             return new ThemeMediaResult
             {

+ 2 - 2
MediaBrowser.Api/SimilarItemsHelper.cs

@@ -74,7 +74,7 @@ namespace MediaBrowser.Api
             }).Where(i => i.HasValue).Select(i => i.Value);
         }
     }
-    
+
     /// <summary>
     /// Class SimilarItemsHelper
     /// </summary>
@@ -112,7 +112,7 @@ namespace MediaBrowser.Api
 
             var result = new ItemsResult
             {
-                Items = items.Take(request.Limit ?? items.Length).Select(i => dtoService.GetBaseItemDto(i, fields, user)).Select(t => t.Result).ToArray(),
+                Items = items.Take(request.Limit ?? items.Length).Select(i => dtoService.GetBaseItemDto(i, fields, user)).ToArray(),
 
                 TotalRecordCount = items.Length
             };

+ 1 - 13
MediaBrowser.Api/TvShowsService.cs

@@ -191,7 +191,7 @@ namespace MediaBrowser.Api
 
             var fields = request.GetItemFields().ToList();
 
-            var returnItems = await GetItemDtos(pagedItems, user, fields).ConfigureAwait(false);
+            var returnItems = pagedItems.Select(i => _dtoService.GetBaseItemDto(i, fields, user)).ToArray();
 
             return new ItemsResult
             {
@@ -247,18 +247,6 @@ namespace MediaBrowser.Api
             return new Tuple<Episode, DateTime>(null, lastWatchedDate);
         }
 
-        /// <summary>
-        /// Gets the item dtos.
-        /// </summary>
-        /// <param name="pagedItems">The paged items.</param>
-        /// <param name="user">The user.</param>
-        /// <param name="fields">The fields.</param>
-        /// <returns>Task.</returns>
-        private Task<BaseItemDto[]> GetItemDtos(IEnumerable<BaseItem> pagedItems, User user, List<ItemFields> fields)
-        {
-            return Task.WhenAll(pagedItems.Select(i => _dtoService.GetBaseItemDto(i, fields, user)));
-        }
-
         /// <summary>
         /// Applies the paging.
         /// </summary>

+ 4 - 5
MediaBrowser.Api/UserLibrary/ArtistsService.cs

@@ -9,7 +9,6 @@ using ServiceStack.ServiceHost;
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using System.Threading.Tasks;
 
 namespace MediaBrowser.Api.UserLibrary
 {
@@ -65,7 +64,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// <returns>System.Object.</returns>
         public object Get(GetArtist request)
         {
-            var result = GetItem(request).Result;
+            var result = GetItem(request);
 
             return ToOptimizedResult(result);
         }
@@ -75,7 +74,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <param name="request">The request.</param>
         /// <returns>Task{BaseItemDto}.</returns>
-        private async Task<BaseItemDto> GetItem(GetArtist request)
+        private BaseItemDto GetItem(GetArtist request)
         {
             var item = GetArtist(request.Name, LibraryManager);
 
@@ -86,10 +85,10 @@ namespace MediaBrowser.Api.UserLibrary
             {
                 var user = UserManager.GetUserById(request.UserId.Value);
 
-                return await DtoService.GetBaseItemDto(item, fields.ToList(), user).ConfigureAwait(false);
+                return DtoService.GetBaseItemDto(item, fields.ToList(), user);
             }
 
-            return await DtoService.GetBaseItemDto(item, fields.ToList()).ConfigureAwait(false);
+            return DtoService.GetBaseItemDto(item, fields.ToList());
         }
 
         /// <summary>

+ 5 - 7
MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs

@@ -121,11 +121,9 @@ namespace MediaBrowser.Api.UserLibrary
 
             var fields = request.GetItemFields().ToList();
 
-            var tasks = ibnItems.Select(i => GetDto(i, user, fields));
+            var dtos = ibnItems.Select(i => GetDto(i, user, fields));
 
-            var resultItems = await Task.WhenAll(tasks).ConfigureAwait(false);
-
-            result.Items = resultItems.Where(i => i != null).ToArray();
+            result.Items = dtos.Where(i => i != null).ToArray();
 
             return result;
         }
@@ -253,10 +251,10 @@ namespace MediaBrowser.Api.UserLibrary
         /// <param name="user">The user.</param>
         /// <param name="fields">The fields.</param>
         /// <returns>Task{DtoBaseItem}.</returns>
-        private async Task<BaseItemDto> GetDto(TItemType item, User user, List<ItemFields> fields)
+        private BaseItemDto GetDto(TItemType item, User user, List<ItemFields> fields)
         {
-            var dto = user == null ? await DtoService.GetBaseItemDto(item, fields).ConfigureAwait(false) :
-                await DtoService.GetBaseItemDto(item, fields, user).ConfigureAwait(false);
+            var dto = user == null ? DtoService.GetBaseItemDto(item, fields) :
+                 DtoService.GetBaseItemDto(item, fields, user);
 
             return dto;
         }

+ 4 - 5
MediaBrowser.Api/UserLibrary/GameGenresService.cs

@@ -9,7 +9,6 @@ using ServiceStack.ServiceHost;
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using System.Threading.Tasks;
 
 namespace MediaBrowser.Api.UserLibrary
 {
@@ -56,7 +55,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// <returns>System.Object.</returns>
         public object Get(GetGameGenre request)
         {
-            var result = GetItem(request).Result;
+            var result = GetItem(request);
 
             return ToOptimizedResult(result);
         }
@@ -66,7 +65,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <param name="request">The request.</param>
         /// <returns>Task{BaseItemDto}.</returns>
-        private async Task<BaseItemDto> GetItem(GetGameGenre request)
+        private BaseItemDto GetItem(GetGameGenre request)
         {
             var item = GetGameGenre(request.Name, LibraryManager);
 
@@ -77,10 +76,10 @@ namespace MediaBrowser.Api.UserLibrary
             {
                 var user = UserManager.GetUserById(request.UserId.Value);
 
-                return await DtoService.GetBaseItemDto(item, fields.ToList(), user).ConfigureAwait(false);
+                return DtoService.GetBaseItemDto(item, fields.ToList(), user);
             }
 
-            return await DtoService.GetBaseItemDto(item, fields.ToList()).ConfigureAwait(false);
+            return DtoService.GetBaseItemDto(item, fields.ToList());
         }
 
         /// <summary>

+ 4 - 5
MediaBrowser.Api/UserLibrary/GenresService.cs

@@ -8,7 +8,6 @@ using ServiceStack.ServiceHost;
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using System.Threading.Tasks;
 
 namespace MediaBrowser.Api.UserLibrary
 {
@@ -60,7 +59,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// <returns>System.Object.</returns>
         public object Get(GetGenre request)
         {
-            var result = GetItem(request).Result;
+            var result = GetItem(request);
 
             return ToOptimizedResult(result);
         }
@@ -70,7 +69,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <param name="request">The request.</param>
         /// <returns>Task{BaseItemDto}.</returns>
-        private async Task<BaseItemDto> GetItem(GetGenre request)
+        private BaseItemDto GetItem(GetGenre request)
         {
             var item = GetGenre(request.Name, LibraryManager);
 
@@ -81,10 +80,10 @@ namespace MediaBrowser.Api.UserLibrary
             {
                 var user = UserManager.GetUserById(request.UserId.Value);
 
-                return await DtoService.GetBaseItemDto(item, fields.ToList(), user).ConfigureAwait(false);
+                return DtoService.GetBaseItemDto(item, fields.ToList(), user);
             }
 
-            return await DtoService.GetBaseItemDto(item, fields.ToList()).ConfigureAwait(false);
+            return DtoService.GetBaseItemDto(item, fields.ToList());
         }
 
         /// <summary>

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

@@ -260,7 +260,7 @@ namespace MediaBrowser.Api.UserLibrary
 
             var fields = request.GetItemFields().ToList();
 
-            var returnItems = await Task.WhenAll(pagedItems.Select(i => _dtoService.GetBaseItemDto(i, fields, user))).ConfigureAwait(false);
+            var returnItems = pagedItems.Select(i => _dtoService.GetBaseItemDto(i, fields, user)).ToArray();
 
             return new ItemsResult
             {

+ 4 - 5
MediaBrowser.Api/UserLibrary/MusicGenresService.cs

@@ -9,7 +9,6 @@ using ServiceStack.ServiceHost;
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using System.Threading.Tasks;
 
 namespace MediaBrowser.Api.UserLibrary
 {
@@ -56,7 +55,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// <returns>System.Object.</returns>
         public object Get(GetMusicGenre request)
         {
-            var result = GetItem(request).Result;
+            var result = GetItem(request);
 
             return ToOptimizedResult(result);
         }
@@ -66,7 +65,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <param name="request">The request.</param>
         /// <returns>Task{BaseItemDto}.</returns>
-        private async Task<BaseItemDto> GetItem(GetMusicGenre request)
+        private BaseItemDto GetItem(GetMusicGenre request)
         {
             var item = GetMusicGenre(request.Name, LibraryManager);
 
@@ -77,10 +76,10 @@ namespace MediaBrowser.Api.UserLibrary
             {
                 var user = UserManager.GetUserById(request.UserId.Value);
 
-                return await DtoService.GetBaseItemDto(item, fields.ToList(), user).ConfigureAwait(false);
+                return  DtoService.GetBaseItemDto(item, fields.ToList(), user);
             }
 
-            return await DtoService.GetBaseItemDto(item, fields.ToList()).ConfigureAwait(false);
+            return  DtoService.GetBaseItemDto(item, fields.ToList());
         }
 
         /// <summary>

+ 4 - 5
MediaBrowser.Api/UserLibrary/PersonsService.cs

@@ -8,7 +8,6 @@ using ServiceStack.ServiceHost;
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using System.Threading.Tasks;
 
 namespace MediaBrowser.Api.UserLibrary
 {
@@ -72,7 +71,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// <returns>System.Object.</returns>
         public object Get(GetPerson request)
         {
-            var result = GetItem(request).Result;
+            var result = GetItem(request);
 
             return ToOptimizedResult(result);
         }
@@ -82,7 +81,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <param name="request">The request.</param>
         /// <returns>Task{BaseItemDto}.</returns>
-        private async Task<BaseItemDto> GetItem(GetPerson request)
+        private BaseItemDto GetItem(GetPerson request)
         {
             var item = GetPerson(request.Name, LibraryManager);
 
@@ -93,10 +92,10 @@ namespace MediaBrowser.Api.UserLibrary
             {
                 var user = UserManager.GetUserById(request.UserId.Value);
 
-                return await DtoService.GetBaseItemDto(item, fields.ToList(), user).ConfigureAwait(false);
+                return DtoService.GetBaseItemDto(item, fields.ToList(), user);
             }
 
-            return await DtoService.GetBaseItemDto(item, fields.ToList()).ConfigureAwait(false);
+            return DtoService.GetBaseItemDto(item, fields.ToList());
         }
 
         /// <summary>

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

@@ -60,7 +60,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// <returns>System.Object.</returns>
         public object Get(GetStudio request)
         {
-            var result = GetItem(request).Result;
+            var result = GetItem(request);
 
             return ToOptimizedResult(result);
         }
@@ -70,7 +70,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <param name="request">The request.</param>
         /// <returns>Task{BaseItemDto}.</returns>
-        private async Task<BaseItemDto> GetItem(GetStudio request)
+        private BaseItemDto GetItem(GetStudio request)
         {
             var item = GetStudio(request.Name, LibraryManager);
 
@@ -81,10 +81,10 @@ namespace MediaBrowser.Api.UserLibrary
             {
                 var user = UserManager.GetUserById(request.UserId.Value);
 
-                return await DtoService.GetBaseItemDto(item, fields.ToList(), user).ConfigureAwait(false);
+                return DtoService.GetBaseItemDto(item, fields.ToList(), user);
             }
 
-            return await DtoService.GetBaseItemDto(item, fields.ToList()).ConfigureAwait(false);
+            return DtoService.GetBaseItemDto(item, fields.ToList());
         }
 
         /// <summary>

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

@@ -393,12 +393,12 @@ namespace MediaBrowser.Api.UserLibrary
         /// <returns>System.Object.</returns>
         public object Get(GetSpecialFeatures request)
         {
-            var result = GetAsync(request).Result;
+            var result = GetAsync(request);
 
             return ToOptimizedResult(result);
         }
 
-        private Task<BaseItemDto[]> GetAsync(GetSpecialFeatures request)
+        private BaseItemDto[] GetAsync(GetSpecialFeatures request)
         {
             var user = _userManager.GetUserById(request.UserId);
 
@@ -415,12 +415,12 @@ namespace MediaBrowser.Api.UserLibrary
                 // Avoid implicitly captured closure
                 var movie1 = movie;
 
-                var tasks = movie.SpecialFeatureIds
+                var dtos = movie.SpecialFeatureIds
                     .Select(_itemRepo.RetrieveItem)
                     .OrderBy(i => i.SortName)
                     .Select(i => _dtoService.GetBaseItemDto(i, fields, user, movie1));
 
-                return Task.WhenAll(tasks);
+                return dtos.ToArray();
             }
 
             var series = item as Series;
@@ -428,7 +428,7 @@ namespace MediaBrowser.Api.UserLibrary
             // Get them from the child tree
             if (series != null)
             {
-                var tasks = series
+                var dtos = series
                     .RecursiveChildren
                     .OfType<Episode>()
                     .Where(i => i.ParentIndexNumber.HasValue && i.ParentIndexNumber.Value == 0)
@@ -448,7 +448,7 @@ namespace MediaBrowser.Api.UserLibrary
                     .ThenBy(i => i.SortName)
                     .Select(i => _dtoService.GetBaseItemDto(i, fields, user));
 
-                return Task.WhenAll(tasks);
+                return dtos.ToArray();
             }
 
             throw new ArgumentException("The item does not support special features");
@@ -461,12 +461,12 @@ namespace MediaBrowser.Api.UserLibrary
         /// <returns>System.Object.</returns>
         public object Get(GetLocalTrailers request)
         {
-            var result = GetAsync(request).Result;
+            var result = GetAsync(request);
 
             return ToOptimizedResult(result);
         }
 
-        private Task<BaseItemDto[]> GetAsync(GetLocalTrailers request)
+        private BaseItemDto[] GetAsync(GetLocalTrailers request)
         {
             var user = _userManager.GetUserById(request.UserId);
 
@@ -475,12 +475,12 @@ namespace MediaBrowser.Api.UserLibrary
             // Get everything
             var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)).ToList();
 
-            var tasks = item.LocalTrailerIds
+            var dtos = item.LocalTrailerIds
                 .Select(_itemRepo.RetrieveItem)
                 .OrderBy(i => i.SortName)
                 .Select(i => _dtoService.GetBaseItemDto(i, fields, user, item));
 
-            return Task.WhenAll(tasks);
+            return dtos.ToArray();
         }
 
         /// <summary>
@@ -497,7 +497,7 @@ namespace MediaBrowser.Api.UserLibrary
             // Get everything
             var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)).ToList();
 
-            var result = _dtoService.GetBaseItemDto(item, fields, user).Result;
+            var result = _dtoService.GetBaseItemDto(item, fields, user);
 
             return ToOptimizedResult(result);
         }
@@ -516,7 +516,7 @@ namespace MediaBrowser.Api.UserLibrary
             // Get everything
             var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)).ToList();
 
-            var result = _dtoService.GetBaseItemDto(item, fields, user).Result;
+            var result = _dtoService.GetBaseItemDto(item, fields, user);
 
             return ToOptimizedResult(result);
         }

+ 4 - 5
MediaBrowser.Api/UserLibrary/YearsService.cs

@@ -9,7 +9,6 @@ using System;
 using System.Collections.Generic;
 using System.Globalization;
 using System.Linq;
-using System.Threading.Tasks;
 
 namespace MediaBrowser.Api.UserLibrary
 {
@@ -66,7 +65,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// <returns>System.Object.</returns>
         public object Get(GetYear request)
         {
-            var result = GetItem(request).Result;
+            var result = GetItem(request);
 
             return ToOptimizedResult(result);
         }
@@ -76,7 +75,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <param name="request">The request.</param>
         /// <returns>Task{BaseItemDto}.</returns>
-        private async Task<BaseItemDto> GetItem(GetYear request)
+        private BaseItemDto GetItem(GetYear request)
         {
             var item = LibraryManager.GetYear(request.Year);
 
@@ -87,10 +86,10 @@ namespace MediaBrowser.Api.UserLibrary
             {
                 var user = UserManager.GetUserById(request.UserId.Value);
 
-                return await DtoService.GetBaseItemDto(item, fields.ToList(), user).ConfigureAwait(false);
+                return DtoService.GetBaseItemDto(item, fields.ToList(), user);
             }
 
-            return await DtoService.GetBaseItemDto(item, fields.ToList()).ConfigureAwait(false);
+            return DtoService.GetBaseItemDto(item, fields.ToList());
         }
 
         /// <summary>

+ 10 - 7
MediaBrowser.Api/UserService.cs

@@ -20,7 +20,7 @@ namespace MediaBrowser.Api
     [Api(Description = "Gets a list of users")]
     public class GetUsers : IReturn<List<UserDto>>
     {
-        [ApiMember(Name = "IsHidden", Description="Optional filter by IsHidden=true or false", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
+        [ApiMember(Name = "IsHidden", Description = "Optional filter by IsHidden=true or false", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
         public bool? IsHidden { get; set; }
 
         [ApiMember(Name = "IsDisabled", Description = "Optional filter by IsDisabled=true or false", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
@@ -32,7 +32,7 @@ namespace MediaBrowser.Api
     public class GetPublicUsers : IReturn<List<UserDto>>
     {
     }
-    
+
     /// <summary>
     /// Class GetUser
     /// </summary>
@@ -220,9 +220,12 @@ namespace MediaBrowser.Api
                 users = users.Where(i => i.Configuration.IsHidden == request.IsHidden.Value);
             }
 
-            var tasks = users.OrderBy(u => u.Name).Select(_dtoService.GetUserDto).Select(i => i.Result);
+            var result = users
+                .OrderBy(u => u.Name)
+                .Select(_dtoService.GetUserDto)
+                .ToList();
 
-            return ToOptimizedResult(tasks.ToList());
+            return ToOptimizedResult(result);
         }
 
         /// <summary>
@@ -239,7 +242,7 @@ namespace MediaBrowser.Api
                 throw new ResourceNotFoundException("User not found");
             }
 
-            var result = _dtoService.GetUserDto(user).Result;
+            var result = _dtoService.GetUserDto(user);
 
             return ToOptimizedResult(result);
         }
@@ -305,7 +308,7 @@ namespace MediaBrowser.Api
 
             var result = new AuthenticationResult
             {
-                User = await _dtoService.GetUserDto(user).ConfigureAwait(false)
+                User = _dtoService.GetUserDto(user)
             };
 
             return result;
@@ -404,7 +407,7 @@ namespace MediaBrowser.Api
 
             newUser.UpdateConfiguration(dtoUser.Configuration, _xmlSerializer);
 
-            var result = _dtoService.GetUserDto(newUser).Result;
+            var result = _dtoService.GetUserDto(newUser);
 
             return ToOptimizedResult(result);
         }

+ 0 - 1
MediaBrowser.Api/VideosService.cs

@@ -65,7 +65,6 @@ namespace MediaBrowser.Api
             var items = video.AdditionalPartIds.Select(_itemRepo.RetrieveItem)
                          .OrderBy(i => i.SortName)
                          .Select(i => _dtoService.GetBaseItemDto(i, fields, user, video))
-                         .Select(t => t.Result)
                          .ToArray();
 
             var result = new ItemsResult

+ 4 - 6
MediaBrowser.Controller/Drawing/ImageHeader.cs

@@ -1,6 +1,4 @@
-using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Logging;
 using System;
 using System.Collections.Generic;
 using System.Drawing;
@@ -41,7 +39,7 @@ namespace MediaBrowser.Controller.Drawing
         /// <param name="logger">The logger.</param>
         /// <returns>The dimensions of the specified image.</returns>
         /// <exception cref="ArgumentException">The image was of an unrecognised format.</exception>
-        public static async Task<Size> GetDimensions(string path, ILogger logger)
+        public static Size GetDimensions(string path, ILogger logger)
         {
             try
             {
@@ -59,11 +57,11 @@ namespace MediaBrowser.Controller.Drawing
             }
 
             // Buffer to memory stream to avoid image locking file
-            using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, true))
+            using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
             {
                 using (var memoryStream = new MemoryStream())
                 {
-                    await fs.CopyToAsync(memoryStream).ConfigureAwait(false);
+                    fs.CopyTo(memoryStream);
 
                     // Co it the old fashioned way
                     using (var b = Image.FromStream(memoryStream, true, false))

+ 45 - 39
MediaBrowser.Controller/Drawing/ImageManager.cs

@@ -68,11 +68,6 @@ namespace MediaBrowser.Controller.Drawing
 
         private readonly IItemRepository _itemRepo;
 
-        /// <summary>
-        /// The _locks
-        /// </summary>
-        private readonly ConcurrentDictionary<string, SemaphoreSlim> _locks = new ConcurrentDictionary<string, SemaphoreSlim>();
-
         /// <summary>
         /// Initializes a new instance of the <see cref="ImageManager" /> class.
         /// </summary>
@@ -146,7 +141,7 @@ namespace MediaBrowser.Controller.Drawing
                 }
             }
 
-            var originalImageSize = await GetImageSize(originalImagePath, dateModified).ConfigureAwait(false);
+            var originalImageSize = GetImageSize(originalImagePath, dateModified);
 
             // Determine the output size based on incoming parameters
             var newSize = DrawingUtils.Resize(originalImageSize, width, height, maxWidth, maxHeight);
@@ -304,7 +299,7 @@ namespace MediaBrowser.Controller.Drawing
         /// <param name="dateModified">The date modified.</param>
         /// <returns>Task{ImageSize}.</returns>
         /// <exception cref="System.ArgumentNullException">imagePath</exception>
-        public async Task<ImageSize> GetImageSize(string imagePath, DateTime dateModified)
+        public ImageSize GetImageSize(string imagePath, DateTime dateModified)
         {
             if (string.IsNullOrEmpty(imagePath))
             {
@@ -317,7 +312,7 @@ namespace MediaBrowser.Controller.Drawing
 
             if (!_cachedImagedSizes.TryGetValue(name, out size))
             {
-                size = await GetImageSize(name, imagePath).ConfigureAwait(false);
+                size = GetImageSize(name, imagePath);
 
                 _cachedImagedSizes.AddOrUpdate(name, size, (keyName, oldValue) => size);
             }
@@ -333,7 +328,7 @@ namespace MediaBrowser.Controller.Drawing
         /// <param name="keyName">Name of the key.</param>
         /// <param name="imagePath">The image path.</param>
         /// <returns>ImageSize.</returns>
-        private async Task<ImageSize> GetImageSize(string keyName, string imagePath)
+        private ImageSize GetImageSize(string keyName, string imagePath)
         {
             // Now check the file system cache
             var fullCachePath = ImageSizeCache.GetResourcePath(keyName, ".txt");
@@ -349,34 +344,29 @@ namespace MediaBrowser.Controller.Drawing
                 // Cache file doesn't exist or is currently being written to
             }
 
-            var semaphore = GetLock(fullCachePath);
-
-            await semaphore.WaitAsync().ConfigureAwait(false);
-
-            try
-            {
-                var result = File.ReadAllText(fullCachePath).Split('|').Select(i => double.Parse(i, UsCulture)).ToArray();
+            var syncLock = GetObjectLock(fullCachePath);
 
-                return new ImageSize { Width = result[0], Height = result[1] };
-            }
-            catch (FileNotFoundException)
+            lock (syncLock)
             {
-                // Cache file doesn't exist no biggie
-            }
-            catch (DirectoryNotFoundException)
-            {
-                // Cache file doesn't exist no biggie
-            }
-            catch
-            {
-                semaphore.Release();
+                try
+                {
+                    var result = File.ReadAllText(fullCachePath)
+                        .Split('|')
+                        .Select(i => double.Parse(i, UsCulture))
+                        .ToArray();
 
-                throw;
-            }
+                    return new ImageSize { Width = result[0], Height = result[1] };
+                }
+                catch (FileNotFoundException)
+                {
+                    // Cache file doesn't exist no biggie
+                }
+                catch (DirectoryNotFoundException)
+                {
+                    // Cache file doesn't exist no biggie
+                }
 
-            try
-            {
-                var size = await ImageHeader.GetDimensions(imagePath, _logger).ConfigureAwait(false);
+                var size = ImageHeader.GetDimensions(imagePath, _logger);
 
                 var parentPath = Path.GetDirectoryName(fullCachePath);
 
@@ -390,10 +380,6 @@ namespace MediaBrowser.Controller.Drawing
 
                 return new ImageSize { Width = size.Width, Height = size.Height };
             }
-            finally
-            {
-                semaphore.Release();
-            }
         }
 
         /// <summary>
@@ -600,7 +586,7 @@ namespace MediaBrowser.Controller.Drawing
 
             return GetEnhancedImage(originalImagePath, dateModified, item, imageType, imageIndex, supportedImageEnhancers);
         }
-        
+
         /// <summary>
         /// Runs an image through the image enhancers, caches the result, and returns the cached path
         /// </summary>
@@ -786,6 +772,11 @@ namespace MediaBrowser.Controller.Drawing
             return result;
         }
 
+        /// <summary>
+        /// The _semaphoreLocks
+        /// </summary>
+        private readonly ConcurrentDictionary<string, SemaphoreSlim> _semaphoreLocks = new ConcurrentDictionary<string, SemaphoreSlim>();
+
         /// <summary>
         /// Gets the lock.
         /// </summary>
@@ -793,7 +784,22 @@ namespace MediaBrowser.Controller.Drawing
         /// <returns>System.Object.</returns>
         private SemaphoreSlim GetLock(string filename)
         {
-            return _locks.GetOrAdd(filename, key => new SemaphoreSlim(1, 1));
+            return _semaphoreLocks.GetOrAdd(filename, key => new SemaphoreSlim(1, 1));
+        }
+
+        /// <summary>
+        /// The _semaphoreLocks
+        /// </summary>
+        private readonly ConcurrentDictionary<string, object> _locks = new ConcurrentDictionary<string, object>();
+
+        /// <summary>
+        /// Gets the lock.
+        /// </summary>
+        /// <param name="filename">The filename.</param>
+        /// <returns>System.Object.</returns>
+        private object GetObjectLock(string filename)
+        {
+            return _locks.GetOrAdd(filename, key => new object());
         }
     }
 }

+ 3 - 4
MediaBrowser.Controller/Dto/IDtoService.cs

@@ -6,7 +6,6 @@ using MediaBrowser.Model.Querying;
 using MediaBrowser.Model.Session;
 using System;
 using System.Collections.Generic;
-using System.Threading.Tasks;
 
 namespace MediaBrowser.Controller.Dto
 {
@@ -19,8 +18,8 @@ namespace MediaBrowser.Controller.Dto
         /// Gets the user dto.
         /// </summary>
         /// <param name="user">The user.</param>
-        /// <returns>Task{UserDto}.</returns>
-        Task<UserDto> GetUserDto(User user);
+        /// <returns>UserDto.</returns>
+        UserDto GetUserDto(User user);
 
         /// <summary>
         /// Gets the session info dto.
@@ -66,6 +65,6 @@ namespace MediaBrowser.Controller.Dto
         /// <param name="user">The user.</param>
         /// <param name="owner">The owner.</param>
         /// <returns>Task{BaseItemDto}.</returns>
-        Task<BaseItemDto> GetBaseItemDto(BaseItem item, List<ItemFields> fields, User user = null, BaseItem owner = null);
+        BaseItemDto GetBaseItemDto(BaseItem item, List<ItemFields> fields, User user = null, BaseItem owner = null);
     }
 }

+ 70 - 13
MediaBrowser.Providers/Music/FanArtArtistProvider.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Configuration;
+using System.Net;
+using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.IO;
 using MediaBrowser.Common.Net;
@@ -17,6 +18,7 @@ using System.Linq;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Xml;
+using MediaBrowser.Model.Net;
 
 namespace MediaBrowser.Providers.Music
 {
@@ -314,8 +316,19 @@ namespace MediaBrowser.Providers.Music
                 path = node != null ? node.Value : null;
                 if (!string.IsNullOrEmpty(path))
                 {
-                    await _providerManager.SaveImage(item, path, FanArtResourcePool, ImageType.Logo, null, cancellationToken)
-                        .ConfigureAwait(false);
+                    try
+                    {
+                        await _providerManager.SaveImage(item, path, FanArtResourcePool, ImageType.Logo, null, cancellationToken)
+                            .ConfigureAwait(false);
+                    }
+                    catch (HttpException ex)
+                    {
+                        // Sometimes fanart has bad url's in their xml. Nothing we can do here but catch it
+                        if (!ex.StatusCode.HasValue || ex.StatusCode.Value != HttpStatusCode.NotFound)
+                        {
+                            throw;
+                        }
+                    }
                 }
             }
             cancellationToken.ThrowIfCancellationRequested();
@@ -332,10 +345,21 @@ namespace MediaBrowser.Providers.Music
                         path = node.Value;
                         if (!string.IsNullOrEmpty(path))
                         {
-                            await _providerManager.SaveImage(item, path, FanArtResourcePool, ImageType.Backdrop, numBackdrops, cancellationToken)
-                                .ConfigureAwait(false);
-                            numBackdrops++;
-                            if (numBackdrops >= ConfigurationManager.Configuration.MaxBackdrops) break;
+                            try
+                            {
+                                await _providerManager.SaveImage(item, path, FanArtResourcePool, ImageType.Backdrop, numBackdrops, cancellationToken)
+                                    .ConfigureAwait(false);
+                                numBackdrops++;
+                                if (numBackdrops >= ConfigurationManager.Configuration.MaxBackdrops) break;
+                            }
+                            catch (HttpException ex)
+                            {
+                                // Sometimes fanart has bad url's in their xml. Nothing we can do here but catch it
+                                if (!ex.StatusCode.HasValue || ex.StatusCode.Value != HttpStatusCode.NotFound)
+                                {
+                                    throw;
+                                }
+                            }
                         }
                     }
 
@@ -353,8 +377,19 @@ namespace MediaBrowser.Providers.Music
                 path = node != null ? node.Value : null;
                 if (!string.IsNullOrEmpty(path))
                 {
-                    await _providerManager.SaveImage(item, path, FanArtResourcePool, ImageType.Art, null, cancellationToken)
-                        .ConfigureAwait(false);
+                    try
+                    {
+                        await _providerManager.SaveImage(item, path, FanArtResourcePool, ImageType.Art, null, cancellationToken)
+                            .ConfigureAwait(false);
+                    }
+                    catch (HttpException ex)
+                    {
+                        // Sometimes fanart has bad url's in their xml. Nothing we can do here but catch it
+                        if (!ex.StatusCode.HasValue || ex.StatusCode.Value != HttpStatusCode.NotFound)
+                        {
+                            throw;
+                        }
+                    }
                 }
             }
             cancellationToken.ThrowIfCancellationRequested();
@@ -366,8 +401,19 @@ namespace MediaBrowser.Providers.Music
                 path = node != null ? node.Value : null;
                 if (!string.IsNullOrEmpty(path))
                 {
-                    await _providerManager.SaveImage(item, path, FanArtResourcePool, ImageType.Banner, null, cancellationToken)
-                        .ConfigureAwait(false);
+                    try
+                    {
+                        await _providerManager.SaveImage(item, path, FanArtResourcePool, ImageType.Banner, null, cancellationToken)
+                            .ConfigureAwait(false);
+                    }
+                    catch (HttpException ex)
+                    {
+                        // Sometimes fanart has bad url's in their xml. Nothing we can do here but catch it
+                        if (!ex.StatusCode.HasValue || ex.StatusCode.Value != HttpStatusCode.NotFound)
+                        {
+                            throw;
+                        }
+                    }
                 }
             }
 
@@ -380,8 +426,19 @@ namespace MediaBrowser.Providers.Music
                 path = node != null ? node.Value : null;
                 if (!string.IsNullOrEmpty(path))
                 {
-                    await _providerManager.SaveImage(item, path, FanArtResourcePool, ImageType.Primary, null, cancellationToken)
-                        .ConfigureAwait(false);
+                    try
+                    {
+                        await _providerManager.SaveImage(item, path, FanArtResourcePool, ImageType.Primary, null, cancellationToken)
+                            .ConfigureAwait(false);
+                    }
+                    catch (HttpException ex)
+                    {
+                        // Sometimes fanart has bad url's in their xml. Nothing we can do here but catch it
+                        if (!ex.StatusCode.HasValue || ex.StatusCode.Value != HttpStatusCode.NotFound)
+                        {
+                            throw;
+                        }
+                    }
                 }
             }
         }

+ 6 - 8
MediaBrowser.Server.Implementations/Dto/DtoService.cs

@@ -19,7 +19,6 @@ using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
-using System.Threading.Tasks;
 
 namespace MediaBrowser.Server.Implementations.Dto
 {
@@ -49,7 +48,7 @@ namespace MediaBrowser.Server.Implementations.Dto
         /// <param name="owner">The owner.</param>
         /// <returns>Task{DtoBaseItem}.</returns>
         /// <exception cref="System.ArgumentNullException">item</exception>
-        public async Task<BaseItemDto> GetBaseItemDto(BaseItem item, List<ItemFields> fields, User user = null, BaseItem owner = null)
+        public BaseItemDto GetBaseItemDto(BaseItem item, List<ItemFields> fields, User user = null, BaseItem owner = null)
         {
             if (item == null)
             {
@@ -72,7 +71,7 @@ namespace MediaBrowser.Server.Implementations.Dto
             {
                 try
                 {
-                    await AttachPrimaryImageAspectRatio(dto, item).ConfigureAwait(false);
+                    AttachPrimaryImageAspectRatio(dto, item);
                 }
                 catch (Exception ex)
                 {
@@ -189,7 +188,7 @@ namespace MediaBrowser.Server.Implementations.Dto
             }
         }
 
-        public async Task<UserDto> GetUserDto(User user)
+        public UserDto GetUserDto(User user)
         {
             if (user == null)
             {
@@ -214,7 +213,7 @@ namespace MediaBrowser.Server.Implementations.Dto
 
                 try
                 {
-                    await AttachPrimaryImageAspectRatio(dto, user).ConfigureAwait(false);
+                    AttachPrimaryImageAspectRatio(dto, user);
                 }
                 catch (Exception ex)
                 {
@@ -1132,9 +1131,8 @@ namespace MediaBrowser.Server.Implementations.Dto
         /// </summary>
         /// <param name="dto">The dto.</param>
         /// <param name="item">The item.</param>
-        /// <param name="logger">The _logger.</param>
         /// <returns>Task.</returns>
-        private async Task AttachPrimaryImageAspectRatio(IItemDto dto, BaseItem item)
+        private void AttachPrimaryImageAspectRatio(IItemDto dto, BaseItem item)
         {
             var path = item.PrimaryImagePath;
 
@@ -1152,7 +1150,7 @@ namespace MediaBrowser.Server.Implementations.Dto
 
             try
             {
-                size = await Kernel.Instance.ImageManager.GetImageSize(path, dateModified).ConfigureAwait(false);
+                size = Kernel.Instance.ImageManager.GetImageSize(path, dateModified);
             }
             catch (FileNotFoundException)
             {

+ 3 - 3
MediaBrowser.Server.Implementations/EntryPoints/WebSocketEvents.cs

@@ -44,7 +44,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
         private readonly ITaskManager _taskManager;
 
         private readonly IDtoService _dtoService;
-        
+
         /// <summary>
         /// Initializes a new instance of the <see cref="WebSocketEvents" /> class.
         /// </summary>
@@ -134,9 +134,9 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
         /// </summary>
         /// <param name="sender">The sender.</param>
         /// <param name="e">The e.</param>
-        async void userManager_UserUpdated(object sender, GenericEventArgs<User> e)
+        void userManager_UserUpdated(object sender, GenericEventArgs<User> e)
         {
-            var dto = await _dtoService.GetUserDto(e.Argument).ConfigureAwait(false);
+            var dto = _dtoService.GetUserDto(e.Argument);
 
             _serverManager.SendWebSocketMessage("UserUpdated", dto);
         }

+ 1 - 1
MediaBrowser.Server.Implementations/Library/LibraryManager.cs

@@ -824,7 +824,7 @@ namespace MediaBrowser.Server.Implementations.Library
         /// <returns>Task.</returns>
         public async Task ValidatePeople(CancellationToken cancellationToken, IProgress<double> progress)
         {
-            const int maxTasks = 5;
+            const int maxTasks = 3;
 
             var tasks = new List<Task>();
 

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

@@ -202,7 +202,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
                 .Distinct(StringComparer.OrdinalIgnoreCase)
                 .ToList();
 
-            const int maxTasks = 5;
+            const int maxTasks = 3;
 
             var tasks = new List<Task>();