Jelajahi Sumber

Add PrimaryImageAspectRatio to user dto

LukePulverenti 12 tahun lalu
induk
melakukan
dbf6081a9b

+ 4 - 4
MediaBrowser.Api/Library/LibraryService.cs

@@ -122,7 +122,7 @@ namespace MediaBrowser.Api.Library
             // Get everything
             var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true));
 
-            var result = new DtoBuilder(Logger).GetDtoBaseItem(item, fields.ToList(), _libraryManager).Result;
+            var result = new DtoBuilder(Logger).GetBaseItemDto(item, fields.ToList(), _libraryManager).Result;
 
             return ToOptimizedResult(result);
         }
@@ -139,7 +139,7 @@ namespace MediaBrowser.Api.Library
             // Get everything
             var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true));
 
-            var result = new DtoBuilder(Logger).GetDtoBaseItem(item, fields.ToList(), _libraryManager).Result;
+            var result = new DtoBuilder(Logger).GetBaseItemDto(item, fields.ToList(), _libraryManager).Result;
 
             return ToOptimizedResult(result);
         }
@@ -156,7 +156,7 @@ namespace MediaBrowser.Api.Library
             // Get everything
             var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true));
 
-            var result = new DtoBuilder(Logger).GetDtoBaseItem(item, fields.ToList(), _libraryManager).Result;
+            var result = new DtoBuilder(Logger).GetBaseItemDto(item, fields.ToList(), _libraryManager).Result;
 
             return ToOptimizedResult(result);
         }
@@ -173,7 +173,7 @@ namespace MediaBrowser.Api.Library
             // Get everything
             var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true));
 
-            var result = new DtoBuilder(Logger).GetDtoBaseItem(item, fields.ToList(), _libraryManager).Result;
+            var result = new DtoBuilder(Logger).GetBaseItemDto(item, fields.ToList(), _libraryManager).Result;
 
             return ToOptimizedResult(result);
         }

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

@@ -146,7 +146,7 @@ namespace MediaBrowser.Api.UserLibrary
                 return null;
             }
 
-            var dto = await new DtoBuilder(Logger).GetDtoBaseItem(item, user, fields, LibraryManager).ConfigureAwait(false);
+            var dto = await new DtoBuilder(Logger).GetBaseItemDto(item, user, fields, LibraryManager).ConfigureAwait(false);
 
             dto.ChildCount = stub.Item2();
 

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

@@ -208,7 +208,7 @@ namespace MediaBrowser.Api.UserLibrary
 
             var dtoBuilder = new DtoBuilder(Logger);
 
-            var returnItems = await Task.WhenAll(pagedItems.Select(i => dtoBuilder.GetDtoBaseItem(i, user, fields, _libraryManager))).ConfigureAwait(false);
+            var returnItems = await Task.WhenAll(pagedItems.Select(i => dtoBuilder.GetBaseItemDto(i, user, fields, _libraryManager))).ConfigureAwait(false);
 
             return new ItemsResult
             {

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

@@ -342,7 +342,7 @@ namespace MediaBrowser.Api.UserLibrary
 
             var dtoBuilder = new DtoBuilder(Logger);
 
-            var items = movie.SpecialFeatures.Select(i => dtoBuilder.GetDtoBaseItem(i, user, fields, _libraryManager)).AsParallel().Select(t => t.Result).ToList();
+            var items = movie.SpecialFeatures.Select(i => dtoBuilder.GetBaseItemDto(i, user, fields, _libraryManager)).AsParallel().Select(t => t.Result).ToList();
 
             return ToOptimizedResult(items);
         }
@@ -363,7 +363,7 @@ namespace MediaBrowser.Api.UserLibrary
 
             var dtoBuilder = new DtoBuilder(Logger);
 
-            var items = item.LocalTrailers.Select(i => dtoBuilder.GetDtoBaseItem(i, user, fields, _libraryManager)).AsParallel().Select(t => t.Result).ToList();
+            var items = item.LocalTrailers.Select(i => dtoBuilder.GetBaseItemDto(i, user, fields, _libraryManager)).AsParallel().Select(t => t.Result).ToList();
 
             return ToOptimizedResult(items);
         }
@@ -384,7 +384,7 @@ namespace MediaBrowser.Api.UserLibrary
 
             var dtoBuilder = new DtoBuilder(Logger);
 
-            var result = dtoBuilder.GetDtoBaseItem(item, user, fields, _libraryManager).Result;
+            var result = dtoBuilder.GetBaseItemDto(item, user, fields, _libraryManager).Result;
 
             return ToOptimizedResult(result);
         }

+ 6 - 4
MediaBrowser.Api/UserService.cs

@@ -169,9 +169,11 @@ namespace MediaBrowser.Api
         {
             var dtoBuilder = new DtoBuilder(Logger);
 
-            var result = _userManager.Users.OrderBy(u => u.Name).Select(dtoBuilder.GetDtoUser).ToList();
+            var tasks = _userManager.Users.OrderBy(u => u.Name).Select(dtoBuilder.GetUserDto).ToArray();
 
-            return ToOptimizedResult(result);
+            var task = Task.WhenAll(tasks);
+
+            return ToOptimizedResult(task.Result);
         }
 
         /// <summary>
@@ -188,7 +190,7 @@ namespace MediaBrowser.Api
                 throw new ResourceNotFoundException("User not found");
             }
 
-            var result = new DtoBuilder(Logger).GetDtoUser(user);
+            var result = new DtoBuilder(Logger).GetUserDto(user).Result;
 
             return ToOptimizedResult(result);
         }
@@ -302,7 +304,7 @@ namespace MediaBrowser.Api
 
             newUser.UpdateConfiguration(dtoUser.Configuration, _xmlSerializer);
             
-            var result = new DtoBuilder(Logger).GetDtoUser(newUser);
+            var result = new DtoBuilder(Logger).GetUserDto(newUser).Result;
 
             return ToOptimizedResult(result);
         }

+ 17 - 7
MediaBrowser.Controller/Library/DtoBuilder.cs

@@ -38,7 +38,7 @@ namespace MediaBrowser.Controller.Library
         /// <param name="fields">The fields.</param>
         /// <returns>Task{DtoBaseItem}.</returns>
         /// <exception cref="System.ArgumentNullException">item</exception>
-        public async Task<BaseItemDto> GetDtoBaseItem(BaseItem item, List<ItemFields> fields, ILibraryManager libraryManager)
+        public async Task<BaseItemDto> GetBaseItemDto(BaseItem item, List<ItemFields> fields, ILibraryManager libraryManager)
         {
             if (item == null)
             {
@@ -96,7 +96,7 @@ namespace MediaBrowser.Controller.Library
         /// <param name="libraryManager">The library manager.</param>
         /// <returns>Task{DtoBaseItem}.</returns>
         /// <exception cref="System.ArgumentNullException">item</exception>
-        public async Task<BaseItemDto> GetDtoBaseItem(BaseItem item, User user, List<ItemFields> fields, ILibraryManager libraryManager)
+        public async Task<BaseItemDto> GetBaseItemDto(BaseItem item, User user, List<ItemFields> fields, ILibraryManager libraryManager)
         {
             if (item == null)
             {
@@ -168,7 +168,7 @@ namespace MediaBrowser.Controller.Library
 
                 if (userData != null)
                 {
-                    dto.UserData = GetDtoUserItemData(userData);
+                    dto.UserData = GetUserItemDataDto(userData);
                 }
             }
 
@@ -197,7 +197,7 @@ namespace MediaBrowser.Controller.Library
         /// <param name="dto">The dto.</param>
         /// <param name="item">The item.</param>
         /// <returns>Task.</returns>
-        private async Task AttachPrimaryImageAspectRatio(BaseItemDto dto, BaseItem item)
+        private async Task AttachPrimaryImageAspectRatio(IItemDto dto, BaseItem item)
         {
             var path = item.PrimaryImagePath;
 
@@ -647,7 +647,7 @@ namespace MediaBrowser.Controller.Library
         /// <param name="data">The data.</param>
         /// <returns>DtoUserItemData.</returns>
         /// <exception cref="System.ArgumentNullException"></exception>
-        public UserItemDataDto GetDtoUserItemData(UserItemData data)
+        public UserItemDataDto GetUserItemDataDto(UserItemData data)
         {
             if (data == null)
             {
@@ -758,7 +758,7 @@ namespace MediaBrowser.Controller.Library
         /// <param name="user">The user.</param>
         /// <returns>DtoUser.</returns>
         /// <exception cref="System.ArgumentNullException">user</exception>
-        public UserDto GetDtoUser(User user)
+        public async Task<UserDto> GetUserDto(User user)
         {
             if (user == null)
             {
@@ -780,8 +780,18 @@ namespace MediaBrowser.Controller.Library
             if (!string.IsNullOrEmpty(image))
             {
                 dto.PrimaryImageTag = Kernel.Instance.ImageManager.GetImageCacheTag(user, ImageType.Primary, image);
-            }
 
+                try
+                {
+                    await AttachPrimaryImageAspectRatio(dto, user).ConfigureAwait(false);
+                }
+                catch (Exception ex)
+                {
+                    // Have to use a catch-all unfortunately because some .net image methods throw plain Exceptions
+                    _logger.ErrorException("Error generating PrimaryImageAspectRatio for {0}", ex, user.Name);
+                }
+            }
+            
             return dto;
         }
 

+ 1 - 1
MediaBrowser.Model/DTO/BaseItemDto.cs

@@ -12,7 +12,7 @@ namespace MediaBrowser.Model.Dto
     /// This holds information about a BaseItem in a format that is convenient for the client.
     /// </summary>
     [ProtoContract]
-    public class BaseItemDto : IHasProviderIds, INotifyPropertyChanged
+    public class BaseItemDto : IHasProviderIds, INotifyPropertyChanged, IItemDto
     {
         /// <summary>
         /// Gets or sets the name.

+ 8 - 1
MediaBrowser.Model/DTO/UserDto.cs

@@ -10,7 +10,7 @@ namespace MediaBrowser.Model.Dto
     /// Class UserDto
     /// </summary>
     [ProtoContract]
-    public class UserDto : INotifyPropertyChanged
+    public class UserDto : INotifyPropertyChanged, IItemDto
     {
         /// <summary>
         /// Gets or sets the name.
@@ -61,6 +61,13 @@ namespace MediaBrowser.Model.Dto
         [ProtoMember(7)]
         public UserConfiguration Configuration { get; set; }
 
+        /// <summary>
+        /// Gets or sets the primary image aspect ratio.
+        /// </summary>
+        /// <value>The primary image aspect ratio.</value>
+        [ProtoMember(8)]
+        public double? PrimaryImageAspectRatio { get; set; }
+        
         /// <summary>
         /// Gets a value indicating whether this instance has primary image.
         /// </summary>

+ 8 - 0
MediaBrowser.Model/Dto/IItemDto.cs

@@ -0,0 +1,8 @@
+
+namespace MediaBrowser.Model.Dto
+{
+    public interface IItemDto
+    {
+        double? PrimaryImageAspectRatio { get; set; }
+    }
+}

+ 1 - 0
MediaBrowser.Model/MediaBrowser.Model.csproj

@@ -44,6 +44,7 @@
     <Compile Include="Configuration\ServerConfiguration.cs" />
     <Compile Include="Dto\BaseItemPerson.cs" />
     <Compile Include="Dto\ChapterInfoDto.cs" />
+    <Compile Include="Dto\IItemDto.cs" />
     <Compile Include="Dto\ItemsByNameQuery.cs" />
     <Compile Include="Dto\MediaType.cs" />
     <Compile Include="Entities\BaseItemInfo.cs" />

+ 1 - 1
MediaBrowser.Server.Implementations/HttpServer/BaseRestService.cs

@@ -53,7 +53,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer
             {
                 throw new ArgumentNullException("result");
             }
-
+            
             Response.AddHeader("Vary", "Accept-Encoding");
 
             return RequestContext.ToOptimizedResult(result);

+ 4 - 2
MediaBrowser.ServerApplication/EntryPoints/WebSocketEvents.cs

@@ -172,9 +172,11 @@ 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)
         {
-            _serverManager.SendWebSocketMessage("UserUpdated", new DtoBuilder(_logger).GetDtoUser(e.Argument));
+            var dto = await new DtoBuilder(_logger).GetUserDto(e.Argument).ConfigureAwait(false);
+
+            _serverManager.SendWebSocketMessage("UserUpdated", dto);
         }
 
         /// <summary>

+ 2 - 0
MediaBrowser.ServerApplication/MainWindow.xaml

@@ -18,6 +18,8 @@
                         </MenuItem>
                         <MenuItem x:Name="cmdSwaggerApiDocs" Header="Swagger" Click="cmdSwaggerApiDocs_Click" Background="White">
                         </MenuItem>
+                        <MenuItem x:Name="cmdGithubWiki" Header="GitHub Wiki" Click="cmdGithubWiki_Click" Background="White">
+                        </MenuItem>
                     </MenuItem>
                     <Separator/>
                     <MenuItem x:Name="cmShowLogWindow" Header="Show Log Window" IsCheckable="True" Click="CmShowLogWindow_click"/>

+ 5 - 0
MediaBrowser.ServerApplication/MainWindow.xaml.cs

@@ -184,6 +184,11 @@ namespace MediaBrowser.ServerApplication
             App.OpenUrl("http://localhost:" + _configurationManager.Configuration.HttpServerPortNumber + "/" +
                       Kernel.Instance.WebApplicationName + "/swagger-ui/index.html");
         }
+
+        void cmdGithubWiki_Click(object sender, EventArgs e)
+        {
+            App.OpenUrl("https://github.com/MediaBrowser/MediaBrowser/wiki");
+        }
         
         /// <summary>
         /// Occurs when [property changed].

+ 1 - 1
MediaBrowser.WebDashboard/Api/DashboardInfoWebSocketListener.cs

@@ -57,7 +57,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));
+            return DashboardService.GetDashboardInfo(_appHost, Logger, _taskManager, _userManager);
         }
     }
 }

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

@@ -110,7 +110,7 @@ namespace MediaBrowser.WebDashboard.Api
         /// <returns>System.Object.</returns>
         public object Get(GetDashboardInfo request)
         {
-            return GetDashboardInfo(_appHost, Logger, _taskManager, _userManager);
+            return GetDashboardInfo(_appHost, Logger, _taskManager, _userManager).Result;
         }
 
         /// <summary>
@@ -120,12 +120,15 @@ namespace MediaBrowser.WebDashboard.Api
         /// <param name="taskManager">The task manager.</param>
         /// <param name="userManager">The user manager.</param>
         /// <returns>DashboardInfo.</returns>
-        public static DashboardInfo GetDashboardInfo(IServerApplicationHost appHost, ILogger logger, ITaskManager taskManager, IUserManager userManager)
+        public static async Task<DashboardInfo> GetDashboardInfo(IServerApplicationHost appHost, ILogger logger, ITaskManager taskManager, IUserManager userManager)
         {
             var connections = userManager.ConnectedUsers.ToArray();
 
             var dtoBuilder = new DtoBuilder(logger);
 
+            var tasks = userManager.Users.Where(u => connections.Any(c => c.UserId == u.Id)).Select(dtoBuilder.GetUserDto);
+            var users = await Task.WhenAll(tasks).ConfigureAwait(false);
+
             return new DashboardInfo
             {
                 SystemInfo = appHost.GetSystemInfo(),
@@ -138,7 +141,7 @@ namespace MediaBrowser.WebDashboard.Api
 
                 ActiveConnections = connections,
 
-                Users = userManager.Users.Where(u => connections.Any(c => c.UserId == u.Id)).Select(dtoBuilder.GetDtoUser).ToArray()
+                Users = users
             };
         }