diff options
| -rw-r--r-- | MediaBrowser.Api/UserService.cs | 8 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Drawing/ImageManager.cs | 72 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Dto/DtoBuilder.cs | 14 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Dto/UserDtoBuilder.cs | 5 | ||||
| -rw-r--r-- | MediaBrowser.ServerApplication/EntryPoints/WebSocketEvents.cs | 4 | ||||
| -rw-r--r-- | MediaBrowser.WebDashboard/Api/DashboardInfoWebSocketListener.cs | 2 | ||||
| -rw-r--r-- | MediaBrowser.WebDashboard/Api/DashboardService.cs | 10 |
7 files changed, 61 insertions, 54 deletions
diff --git a/MediaBrowser.Api/UserService.cs b/MediaBrowser.Api/UserService.cs index 3f3af743d..44c11e790 100644 --- a/MediaBrowser.Api/UserService.cs +++ b/MediaBrowser.Api/UserService.cs @@ -168,7 +168,9 @@ namespace MediaBrowser.Api { var dtoBuilder = new UserDtoBuilder(Logger); - var users = _userManager.Users.OrderBy(u => u.Name).Select(dtoBuilder.GetUserDto).ToArray(); + var tasks = _userManager.Users.OrderBy(u => u.Name).Select(dtoBuilder.GetUserDto); + + var users = tasks.Select(i => i.Result).ToList(); return ToOptimizedResult(users); } @@ -189,7 +191,7 @@ namespace MediaBrowser.Api var dtoBuilder = new UserDtoBuilder(Logger); - var result = dtoBuilder.GetUserDto(user); + var result = dtoBuilder.GetUserDto(user).Result; return ToOptimizedResult(result); } @@ -305,7 +307,7 @@ namespace MediaBrowser.Api var dtoBuilder = new UserDtoBuilder(Logger); - var result = dtoBuilder.GetUserDto(newUser); + var result = dtoBuilder.GetUserDto(newUser).Result; return ToOptimizedResult(result); } diff --git a/MediaBrowser.Controller/Drawing/ImageManager.cs b/MediaBrowser.Controller/Drawing/ImageManager.cs index 32ff940b2..d901d4a94 100644 --- a/MediaBrowser.Controller/Drawing/ImageManager.cs +++ b/MediaBrowser.Controller/Drawing/ImageManager.cs @@ -137,7 +137,7 @@ namespace MediaBrowser.Controller.Drawing _logger.Error("Error enhancing image", ex); } - var originalImageSize = GetImageSize(originalImagePath, dateModified); + var originalImageSize = await GetImageSize(originalImagePath, dateModified).ConfigureAwait(false); // Determine the output size based on incoming parameters var newSize = DrawingUtils.Resize(originalImageSize, width, height, maxWidth, maxHeight); @@ -149,16 +149,6 @@ namespace MediaBrowser.Controller.Drawing var cacheFilePath = GetCacheFilePath(originalImagePath, newSize, quality.Value, dateModified); - // Grab the cache file if it already exists - if (File.Exists(cacheFilePath)) - { - using (var fileStream = new FileStream(cacheFilePath, FileMode.Open, FileAccess.Read, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous)) - { - await fileStream.CopyToAsync(toStream).ConfigureAwait(false); - return; - } - } - var semaphore = GetLock(cacheFilePath); await semaphore.WaitAsync().ConfigureAwait(false); @@ -279,7 +269,7 @@ namespace MediaBrowser.Controller.Drawing /// <param name="dateModified">The date modified.</param> /// <returns>Task{ImageSize}.</returns> /// <exception cref="System.ArgumentNullException">imagePath</exception> - public ImageSize GetImageSize(string imagePath, DateTime dateModified) + public async Task<ImageSize> GetImageSize(string imagePath, DateTime dateModified) { if (string.IsNullOrEmpty(imagePath)) { @@ -288,7 +278,16 @@ namespace MediaBrowser.Controller.Drawing var name = imagePath + "datemodified=" + dateModified.Ticks; - return _cachedImagedSizes.GetOrAdd(name, keyName => GetImageSize(keyName, imagePath)); + ImageSize size; + + if (!_cachedImagedSizes.TryGetValue(name, out size)) + { + size = await GetImageSize(name, imagePath).ConfigureAwait(false); + + _cachedImagedSizes.AddOrUpdate(name, size, (keyName, oldValue) => size); + } + + return size; } protected readonly CultureInfo UsCulture = new CultureInfo("en-US"); @@ -299,30 +298,41 @@ namespace MediaBrowser.Controller.Drawing /// <param name="keyName">Name of the key.</param> /// <param name="imagePath">The image path.</param> /// <returns>ImageSize.</returns> - private ImageSize GetImageSize(string keyName, string imagePath) + private async Task<ImageSize> GetImageSize(string keyName, string imagePath) { // Now check the file system cache var fullCachePath = ImageSizeCache.GetResourcePath(keyName, ".txt"); + var semaphore = GetLock(fullCachePath); + + await semaphore.WaitAsync().ConfigureAwait(false); + try { - var result = File.ReadAllText(fullCachePath).Split('|').Select(i => double.Parse(i, UsCulture)).ToArray(); + try + { + var result = File.ReadAllText(fullCachePath).Split('|').Select(i => double.Parse(i, UsCulture)).ToArray(); - return new ImageSize { Width = result[0], Height = result[1] }; - } - catch (FileNotFoundException) - { - // Cache file doesn't exist no biggie - } + return new ImageSize { Width = result[0], Height = result[1] }; + } + catch (FileNotFoundException) + { + // Cache file doesn't exist no biggie + } - _logger.Debug("Getting image size for {0}", imagePath); + _logger.Debug("Getting image size for {0}", imagePath); - var size = ImageHeader.GetDimensions(imagePath, _logger); + var size = ImageHeader.GetDimensions(imagePath, _logger); - // Update the file system cache - File.WriteAllText(fullCachePath, size.Width.ToString(UsCulture) + @"|" + size.Height.ToString(UsCulture)); + // Update the file system cache + File.WriteAllText(fullCachePath, size.Width.ToString(UsCulture) + @"|" + size.Height.ToString(UsCulture)); - return new ImageSize { Width = size.Width, Height = size.Height }; + return new ImageSize { Width = size.Width, Height = size.Height }; + } + finally + { + semaphore.Release(); + } } /// <summary> @@ -445,11 +455,6 @@ namespace MediaBrowser.Controller.Drawing var croppedImagePath = CroppedImageCache.GetResourcePath(name, Path.GetExtension(originalImagePath)); - if (CroppedImageCache.ContainsFilePath(croppedImagePath)) - { - return croppedImagePath; - } - var semaphore = GetLock(croppedImagePath); await semaphore.WaitAsync().ConfigureAwait(false); @@ -529,11 +534,6 @@ namespace MediaBrowser.Controller.Drawing // All enhanced images are saved as png to allow transparency var enhancedImagePath = EnhancedImageCache.GetResourcePath(cacheGuid + ".png"); - if (EnhancedImageCache.ContainsFilePath(enhancedImagePath)) - { - return enhancedImagePath; - } - var semaphore = GetLock(enhancedImagePath); await semaphore.WaitAsync().ConfigureAwait(false); diff --git a/MediaBrowser.Controller/Dto/DtoBuilder.cs b/MediaBrowser.Controller/Dto/DtoBuilder.cs index 6e33f52e6..504b3d92a 100644 --- a/MediaBrowser.Controller/Dto/DtoBuilder.cs +++ b/MediaBrowser.Controller/Dto/DtoBuilder.cs @@ -75,7 +75,7 @@ namespace MediaBrowser.Controller.Dto { try { - AttachPrimaryImageAspectRatio(dto, item, _logger); + await AttachPrimaryImageAspectRatio(dto, item, _logger).ConfigureAwait(false); } catch (Exception ex) { @@ -138,7 +138,7 @@ namespace MediaBrowser.Controller.Dto { try { - AttachPrimaryImageAspectRatio(dto, item, _logger); + await AttachPrimaryImageAspectRatio(dto, item, _logger).ConfigureAwait(false); } catch (Exception ex) { @@ -198,9 +198,9 @@ namespace MediaBrowser.Controller.Dto /// </summary> /// <param name="dto">The dto.</param> /// <param name="item">The item.</param> - /// <param name="_logger">The _logger.</param> + /// <param name="logger">The _logger.</param> /// <returns>Task.</returns> - internal static void AttachPrimaryImageAspectRatio(IItemDto dto, BaseItem item, ILogger _logger) + internal static async Task AttachPrimaryImageAspectRatio(IItemDto dto, BaseItem item, ILogger logger) { var path = item.PrimaryImagePath; @@ -218,16 +218,16 @@ namespace MediaBrowser.Controller.Dto try { - size = Kernel.Instance.ImageManager.GetImageSize(path, dateModified); + size = await Kernel.Instance.ImageManager.GetImageSize(path, dateModified).ConfigureAwait(false); } catch (FileNotFoundException) { - _logger.Error("Image file does not exist: {0}", path); + logger.Error("Image file does not exist: {0}", path); return; } catch (Exception ex) { - _logger.ErrorException("Failed to determine primary image aspect ratio for {0}", ex, path); + logger.ErrorException("Failed to determine primary image aspect ratio for {0}", ex, path); return; } diff --git a/MediaBrowser.Controller/Dto/UserDtoBuilder.cs b/MediaBrowser.Controller/Dto/UserDtoBuilder.cs index 5c717529a..ad90a392c 100644 --- a/MediaBrowser.Controller/Dto/UserDtoBuilder.cs +++ b/MediaBrowser.Controller/Dto/UserDtoBuilder.cs @@ -3,6 +3,7 @@ using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using System; +using System.Threading.Tasks; namespace MediaBrowser.Controller.Dto { @@ -31,7 +32,7 @@ namespace MediaBrowser.Controller.Dto /// <param name="user">The user.</param> /// <returns>DtoUser.</returns> /// <exception cref="System.ArgumentNullException">user</exception> - public UserDto GetUserDto(User user) + public async Task<UserDto> GetUserDto(User user) { if (user == null) { @@ -56,7 +57,7 @@ namespace MediaBrowser.Controller.Dto try { - DtoBuilder.AttachPrimaryImageAspectRatio(dto, user, _logger); + await DtoBuilder.AttachPrimaryImageAspectRatio(dto, user, _logger).ConfigureAwait(false); } catch (Exception ex) { diff --git a/MediaBrowser.ServerApplication/EntryPoints/WebSocketEvents.cs b/MediaBrowser.ServerApplication/EntryPoints/WebSocketEvents.cs index a8eb8f4c0..64aa78ec4 100644 --- a/MediaBrowser.ServerApplication/EntryPoints/WebSocketEvents.cs +++ b/MediaBrowser.ServerApplication/EntryPoints/WebSocketEvents.cs @@ -241,9 +241,9 @@ namespace MediaBrowser.ServerApplication.EntryPoints /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The e.</param> - void userManager_UserUpdated(object sender, GenericEventArgs<User> e) + async void userManager_UserUpdated(object sender, GenericEventArgs<User> e) { - var dto = new UserDtoBuilder(_logger).GetUserDto(e.Argument); + var dto = await new UserDtoBuilder(_logger).GetUserDto(e.Argument).ConfigureAwait(false); _serverManager.SendWebSocketMessage("UserUpdated", dto); } diff --git a/MediaBrowser.WebDashboard/Api/DashboardInfoWebSocketListener.cs b/MediaBrowser.WebDashboard/Api/DashboardInfoWebSocketListener.cs index debe78599..1c4037179 100644 --- a/MediaBrowser.WebDashboard/Api/DashboardInfoWebSocketListener.cs +++ b/MediaBrowser.WebDashboard/Api/DashboardInfoWebSocketListener.cs @@ -61,7 +61,7 @@ namespace MediaBrowser.WebDashboard.Api /// <returns>Task{IEnumerable{TaskInfo}}.</returns> protected override Task<DashboardInfo> GetDataToSend(object state) { - return Task.FromResult(DashboardService.GetDashboardInfo(_appHost, Logger, _taskManager, _userManager, _libraryManager)); + return DashboardService.GetDashboardInfo(_appHost, Logger, _taskManager, _userManager, _libraryManager); } } } diff --git a/MediaBrowser.WebDashboard/Api/DashboardService.cs b/MediaBrowser.WebDashboard/Api/DashboardService.cs index 04586fbe4..66219e72d 100644 --- a/MediaBrowser.WebDashboard/Api/DashboardService.cs +++ b/MediaBrowser.WebDashboard/Api/DashboardService.cs @@ -177,7 +177,9 @@ namespace MediaBrowser.WebDashboard.Api /// <returns>System.Object.</returns> public object Get(GetDashboardInfo request) { - return GetDashboardInfo(_appHost, Logger, _taskManager, _userManager, _libraryManager); + var result = GetDashboardInfo(_appHost, Logger, _taskManager, _userManager, _libraryManager).Result; + + return ResultFactory.GetOptimizedResult(RequestContext, result); } /// <summary> @@ -189,13 +191,15 @@ namespace MediaBrowser.WebDashboard.Api /// <param name="userManager">The user manager.</param> /// <param name="libraryManager">The library manager.</param> /// <returns>DashboardInfo.</returns> - public static DashboardInfo GetDashboardInfo(IServerApplicationHost appHost, ILogger logger, ITaskManager taskManager, IUserManager userManager, ILibraryManager libraryManager) + public static async Task<DashboardInfo> GetDashboardInfo(IServerApplicationHost appHost, ILogger logger, ITaskManager taskManager, IUserManager userManager, ILibraryManager libraryManager) { var connections = userManager.RecentConnections.ToArray(); var dtoBuilder = new UserDtoBuilder(logger); - var users = userManager.Users.Where(u => connections.Any(c => new Guid(c.UserId) == u.Id)).Select(dtoBuilder.GetUserDto); + var tasks = userManager.Users.Where(u => connections.Any(c => new Guid(c.UserId) == u.Id)).Select(dtoBuilder.GetUserDto); + + var users = await Task.WhenAll(tasks).ConfigureAwait(false); return new DashboardInfo { |
