diff --git a/MediaBrowser.Api/Library/LibraryService.cs b/MediaBrowser.Api/Library/LibraryService.cs
index 39cbe64901..5e705f5d8f 100644
--- a/MediaBrowser.Api/Library/LibraryService.cs
+++ b/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);
}
diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs
index 9d056c699b..7fa430e39f 100644
--- a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs
+++ b/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();
diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs
index c2b01f9b0e..86c5169f26 100644
--- a/MediaBrowser.Api/UserLibrary/ItemsService.cs
+++ b/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
{
diff --git a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs
index ca439b346c..c9bab06858 100644
--- a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs
+++ b/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);
}
diff --git a/MediaBrowser.Api/UserService.cs b/MediaBrowser.Api/UserService.cs
index d1606f954c..0eecad652a 100644
--- a/MediaBrowser.Api/UserService.cs
+++ b/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);
}
///
@@ -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);
}
diff --git a/MediaBrowser.Controller/Library/DtoBuilder.cs b/MediaBrowser.Controller/Library/DtoBuilder.cs
index 0b14bb9522..d9beb43266 100644
--- a/MediaBrowser.Controller/Library/DtoBuilder.cs
+++ b/MediaBrowser.Controller/Library/DtoBuilder.cs
@@ -38,7 +38,7 @@ namespace MediaBrowser.Controller.Library
/// The fields.
/// Task{DtoBaseItem}.
/// item
- public async Task GetDtoBaseItem(BaseItem item, List fields, ILibraryManager libraryManager)
+ public async Task GetBaseItemDto(BaseItem item, List fields, ILibraryManager libraryManager)
{
if (item == null)
{
@@ -96,7 +96,7 @@ namespace MediaBrowser.Controller.Library
/// The library manager.
/// Task{DtoBaseItem}.
/// item
- public async Task GetDtoBaseItem(BaseItem item, User user, List fields, ILibraryManager libraryManager)
+ public async Task GetBaseItemDto(BaseItem item, User user, List 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
/// The dto.
/// The item.
/// Task.
- 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
/// The data.
/// DtoUserItemData.
///
- public UserItemDataDto GetDtoUserItemData(UserItemData data)
+ public UserItemDataDto GetUserItemDataDto(UserItemData data)
{
if (data == null)
{
@@ -758,7 +758,7 @@ namespace MediaBrowser.Controller.Library
/// The user.
/// DtoUser.
/// user
- public UserDto GetDtoUser(User user)
+ public async Task 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;
}
diff --git a/MediaBrowser.Model/DTO/BaseItemDto.cs b/MediaBrowser.Model/DTO/BaseItemDto.cs
index 67c7dabf60..4440e9bf60 100644
--- a/MediaBrowser.Model/DTO/BaseItemDto.cs
+++ b/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.
///
[ProtoContract]
- public class BaseItemDto : IHasProviderIds, INotifyPropertyChanged
+ public class BaseItemDto : IHasProviderIds, INotifyPropertyChanged, IItemDto
{
///
/// Gets or sets the name.
diff --git a/MediaBrowser.Model/DTO/UserDto.cs b/MediaBrowser.Model/DTO/UserDto.cs
index cfdba14fbe..979422dbe8 100644
--- a/MediaBrowser.Model/DTO/UserDto.cs
+++ b/MediaBrowser.Model/DTO/UserDto.cs
@@ -10,7 +10,7 @@ namespace MediaBrowser.Model.Dto
/// Class UserDto
///
[ProtoContract]
- public class UserDto : INotifyPropertyChanged
+ public class UserDto : INotifyPropertyChanged, IItemDto
{
///
/// Gets or sets the name.
@@ -61,6 +61,13 @@ namespace MediaBrowser.Model.Dto
[ProtoMember(7)]
public UserConfiguration Configuration { get; set; }
+ ///
+ /// Gets or sets the primary image aspect ratio.
+ ///
+ /// The primary image aspect ratio.
+ [ProtoMember(8)]
+ public double? PrimaryImageAspectRatio { get; set; }
+
///
/// Gets a value indicating whether this instance has primary image.
///
diff --git a/MediaBrowser.Model/Dto/IItemDto.cs b/MediaBrowser.Model/Dto/IItemDto.cs
new file mode 100644
index 0000000000..c970296559
--- /dev/null
+++ b/MediaBrowser.Model/Dto/IItemDto.cs
@@ -0,0 +1,8 @@
+
+namespace MediaBrowser.Model.Dto
+{
+ public interface IItemDto
+ {
+ double? PrimaryImageAspectRatio { get; set; }
+ }
+}
diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj
index 0d0e20f815..6c2a62f911 100644
--- a/MediaBrowser.Model/MediaBrowser.Model.csproj
+++ b/MediaBrowser.Model/MediaBrowser.Model.csproj
@@ -44,6 +44,7 @@
+
diff --git a/MediaBrowser.Server.Implementations/HttpServer/BaseRestService.cs b/MediaBrowser.Server.Implementations/HttpServer/BaseRestService.cs
index b847084379..ef9483b6e4 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/BaseRestService.cs
+++ b/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);
diff --git a/MediaBrowser.ServerApplication/EntryPoints/WebSocketEvents.cs b/MediaBrowser.ServerApplication/EntryPoints/WebSocketEvents.cs
index 13359fced2..b498a6fe4c 100644
--- a/MediaBrowser.ServerApplication/EntryPoints/WebSocketEvents.cs
+++ b/MediaBrowser.ServerApplication/EntryPoints/WebSocketEvents.cs
@@ -172,9 +172,11 @@ namespace MediaBrowser.ServerApplication.EntryPoints
///
/// The sender.
/// The e.
- void userManager_UserUpdated(object sender, GenericEventArgs e)
+ async void userManager_UserUpdated(object sender, GenericEventArgs 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);
}
///
diff --git a/MediaBrowser.ServerApplication/MainWindow.xaml b/MediaBrowser.ServerApplication/MainWindow.xaml
index 51f6714126..330bacd355 100644
--- a/MediaBrowser.ServerApplication/MainWindow.xaml
+++ b/MediaBrowser.ServerApplication/MainWindow.xaml
@@ -18,6 +18,8 @@
+
diff --git a/MediaBrowser.ServerApplication/MainWindow.xaml.cs b/MediaBrowser.ServerApplication/MainWindow.xaml.cs
index 364dd9da65..872acea9c3 100644
--- a/MediaBrowser.ServerApplication/MainWindow.xaml.cs
+++ b/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");
+ }
///
/// Occurs when [property changed].
diff --git a/MediaBrowser.WebDashboard/Api/DashboardInfoWebSocketListener.cs b/MediaBrowser.WebDashboard/Api/DashboardInfoWebSocketListener.cs
index cdcdb49dc4..38d5d32a80 100644
--- a/MediaBrowser.WebDashboard/Api/DashboardInfoWebSocketListener.cs
+++ b/MediaBrowser.WebDashboard/Api/DashboardInfoWebSocketListener.cs
@@ -57,7 +57,7 @@ namespace MediaBrowser.WebDashboard.Api
/// Task{IEnumerable{TaskInfo}}.
protected override Task GetDataToSend(object state)
{
- return Task.FromResult(DashboardService.GetDashboardInfo(_appHost, Logger, _taskManager, _userManager));
+ return DashboardService.GetDashboardInfo(_appHost, Logger, _taskManager, _userManager);
}
}
}
diff --git a/MediaBrowser.WebDashboard/Api/DashboardService.cs b/MediaBrowser.WebDashboard/Api/DashboardService.cs
index 136a9170ea..86e4c10ea7 100644
--- a/MediaBrowser.WebDashboard/Api/DashboardService.cs
+++ b/MediaBrowser.WebDashboard/Api/DashboardService.cs
@@ -110,7 +110,7 @@ namespace MediaBrowser.WebDashboard.Api
/// System.Object.
public object Get(GetDashboardInfo request)
{
- return GetDashboardInfo(_appHost, Logger, _taskManager, _userManager);
+ return GetDashboardInfo(_appHost, Logger, _taskManager, _userManager).Result;
}
///
@@ -120,12 +120,15 @@ namespace MediaBrowser.WebDashboard.Api
/// The task manager.
/// The user manager.
/// DashboardInfo.
- public static DashboardInfo GetDashboardInfo(IServerApplicationHost appHost, ILogger logger, ITaskManager taskManager, IUserManager userManager)
+ public static async Task 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
};
}