diff --git a/MediaBrowser.Api/Images/ImageByNameService.cs b/MediaBrowser.Api/Images/ImageByNameService.cs index 10e30db5f1..b17cc81de6 100644 --- a/MediaBrowser.Api/Images/ImageByNameService.cs +++ b/MediaBrowser.Api/Images/ImageByNameService.cs @@ -1,8 +1,10 @@ using MediaBrowser.Common.Extensions; using MediaBrowser.Controller; +using MediaBrowser.Controller.Entities; using ServiceStack.ServiceHost; using System; using System.IO; +using System.Linq; namespace MediaBrowser.Api.Images { @@ -98,9 +100,11 @@ namespace MediaBrowser.Api.Images ? "folder" : request.Type; - var file = Path.Combine(_appPaths.GeneralPath, request.Name, filename + ".jpg"); + var paths = BaseItem.SupportedImageExtensions.Select(i => Path.Combine(_appPaths.GeneralPath, request.Name, filename + i)).ToList(); - return ToStaticFileResult(File.Exists(file) ? file : Path.ChangeExtension(file, ".png")); + var path = paths.FirstOrDefault(File.Exists) ?? paths.FirstOrDefault(); + + return ToStaticFileResult(path); } /// @@ -114,18 +118,12 @@ namespace MediaBrowser.Api.Images if (Directory.Exists(themeFolder)) { - var file = Path.Combine(themeFolder, request.Name + ".png"); + var path = BaseItem.SupportedImageExtensions.Select(i => Path.Combine(themeFolder, request.Name + i)) + .FirstOrDefault(File.Exists); - if (File.Exists(file)) + if (!string.IsNullOrEmpty(path)) { - return ToStaticFileResult(file); - } - - file = Path.Combine(themeFolder, request.Name + ".jpg"); - - if (File.Exists(file)) - { - return ToStaticFileResult(file); + return ToStaticFileResult(path); } } @@ -133,18 +131,15 @@ namespace MediaBrowser.Api.Images if (Directory.Exists(allFolder)) { - var file = Path.Combine(allFolder, request.Name + ".png"); + // Avoid implicitly captured closure + var currentRequest = request; - if (File.Exists(file)) + var path = BaseItem.SupportedImageExtensions.Select(i => Path.Combine(allFolder, currentRequest.Name + i)) + .FirstOrDefault(File.Exists); + + if (!string.IsNullOrEmpty(path)) { - return ToStaticFileResult(file); - } - - file = Path.Combine(allFolder, request.Name + ".jpg"); - - if (File.Exists(file)) - { - return ToStaticFileResult(file); + return ToStaticFileResult(path); } } @@ -162,18 +157,12 @@ namespace MediaBrowser.Api.Images if (Directory.Exists(themeFolder)) { - var file = Path.Combine(themeFolder, request.Name + ".png"); + var path = BaseItem.SupportedImageExtensions.Select(i => Path.Combine(themeFolder, request.Name + i)) + .FirstOrDefault(File.Exists); - if (File.Exists(file)) + if (!string.IsNullOrEmpty(path)) { - return ToStaticFileResult(file); - } - - file = Path.Combine(themeFolder, request.Name + ".jpg"); - - if (File.Exists(file)) - { - return ToStaticFileResult(file); + return ToStaticFileResult(path); } } @@ -181,18 +170,15 @@ namespace MediaBrowser.Api.Images if (Directory.Exists(allFolder)) { - var file = Path.Combine(allFolder, request.Name + ".png"); + // Avoid implicitly captured closure + var currentRequest = request; - if (File.Exists(file)) + var path = BaseItem.SupportedImageExtensions.Select(i => Path.Combine(allFolder, currentRequest.Name + i)) + .FirstOrDefault(File.Exists); + + if (!string.IsNullOrEmpty(path)) { - return ToStaticFileResult(file); - } - - file = Path.Combine(allFolder, request.Name + ".jpg"); - - if (File.Exists(file)) - { - return ToStaticFileResult(file); + return ToStaticFileResult(path); } } diff --git a/MediaBrowser.Controller/Dto/SessionInfoDtoBuilder.cs b/MediaBrowser.Controller/Dto/SessionInfoDtoBuilder.cs index ce8e510b8c..27e6a8d95d 100644 --- a/MediaBrowser.Controller/Dto/SessionInfoDtoBuilder.cs +++ b/MediaBrowser.Controller/Dto/SessionInfoDtoBuilder.cs @@ -36,9 +36,10 @@ namespace MediaBrowser.Controller.Dto dto.NowPlayingItem = DtoBuilder.GetBaseItemInfo(session.NowPlayingItem); } - if (session.UserId.HasValue) + if (session.User != null) { - dto.UserId = session.UserId.Value.ToString("N"); + dto.UserId = session.User.Id.ToString("N"); + dto.UserName = session.User.Name; } return dto; diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index de272ca645..e4e3debe96 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -42,6 +42,11 @@ namespace MediaBrowser.Controller.Entities LocalTrailerIds = new List(); } + /// + /// The supported image extensions + /// + public static readonly string[] SupportedImageExtensions = new[] { ".png", ".jpg", ".jpeg" }; + /// /// The trailer folder name /// diff --git a/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs b/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs index 1bca867a98..1bd4ce0caa 100644 --- a/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs +++ b/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs @@ -146,8 +146,7 @@ namespace MediaBrowser.Controller.Providers /// FileSystemInfo. protected virtual FileSystemInfo GetImage(BaseItem item, string filenameWithoutExtension) { - return item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.ResolveArgs.Path, filenameWithoutExtension + ".png")) - ?? item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.ResolveArgs.Path, filenameWithoutExtension + ".jpg")); + return BaseItem.SupportedImageExtensions.Select(i => item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.ResolveArgs.Path, filenameWithoutExtension + i))).FirstOrDefault(i => i != null); } /// @@ -159,7 +158,7 @@ namespace MediaBrowser.Controller.Providers // Primary Image var image = GetImage(item, "folder") ?? GetImage(item, "poster") ?? - GetImage(item, "cover") ?? + GetImage(item, "cover") ?? GetImage(item, "default"); if (image != null) diff --git a/MediaBrowser.Controller/Session/SessionInfo.cs b/MediaBrowser.Controller/Session/SessionInfo.cs index c3651974b3..e49b526241 100644 --- a/MediaBrowser.Controller/Session/SessionInfo.cs +++ b/MediaBrowser.Controller/Session/SessionInfo.cs @@ -27,7 +27,7 @@ namespace MediaBrowser.Controller.Session /// Gets or sets the user id. /// /// The user id. - public Guid? UserId { get; set; } + public User User { get; set; } /// /// Gets or sets the type of the client. diff --git a/MediaBrowser.Model/Session/SessionInfoDto.cs b/MediaBrowser.Model/Session/SessionInfoDto.cs index 879d496b2e..294e6a2642 100644 --- a/MediaBrowser.Model/Session/SessionInfoDto.cs +++ b/MediaBrowser.Model/Session/SessionInfoDto.cs @@ -17,6 +17,12 @@ namespace MediaBrowser.Model.Session /// The user id. public string UserId { get; set; } + /// + /// Gets or sets the name of the user. + /// + /// The name of the user. + public string UserName { get; set; } + /// /// Gets or sets the type of the client. /// diff --git a/MediaBrowser.Server.Implementations/ScheduledTasks/ImageCleanupTask.cs b/MediaBrowser.Server.Implementations/ScheduledTasks/ImageCleanupTask.cs index 7087c0421c..0c30165524 100644 --- a/MediaBrowser.Server.Implementations/ScheduledTasks/ImageCleanupTask.cs +++ b/MediaBrowser.Server.Implementations/ScheduledTasks/ImageCleanupTask.cs @@ -4,6 +4,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; @@ -175,7 +176,13 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks /// IEnumerable{System.String}. private IEnumerable GetFiles(string path) { - return Directory.EnumerateFiles(path, "*.jpg", SearchOption.AllDirectories).Concat(Directory.EnumerateFiles(path, "*.png", SearchOption.AllDirectories)); + return Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories) + .Where(i => + { + var ext = Path.GetExtension(i); + + return !string.IsNullOrEmpty(ext) && BaseItem.SupportedImageExtensions.Contains(ext, StringComparer.OrdinalIgnoreCase); + }); } /// diff --git a/MediaBrowser.Server.Implementations/Session/SessionManager.cs b/MediaBrowser.Server.Implementations/Session/SessionManager.cs index 6c1768fd8e..29ce2698c3 100644 --- a/MediaBrowser.Server.Implementations/Session/SessionManager.cs +++ b/MediaBrowser.Server.Implementations/Session/SessionManager.cs @@ -185,7 +185,7 @@ namespace MediaBrowser.Server.Implementations.Session connection.DeviceName = deviceName; - connection.UserId = user == null ? (Guid?)null : user.Id; + connection.User = user; return connection; } diff --git a/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs b/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs index 532436c079..c649fd4747 100644 --- a/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs +++ b/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs @@ -99,18 +99,18 @@ namespace MediaBrowser.Server.Implementations.Session { var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSockets.Contains(message.Connection)); - if (session != null && session.UserId.HasValue) + if (session != null && session.User != null) { var item = DtoBuilder.GetItemByClientId(message.Data, _userManager, _libraryManager); - _sessionManager.OnPlaybackStart(_userManager.GetUserById(session.UserId.Value), item, session.Client, session.DeviceId, session.DeviceName); + _sessionManager.OnPlaybackStart(_userManager.GetUserById(session.User.Id), item, session.Client, session.DeviceId, session.DeviceName); } } else if (string.Equals(message.MessageType, "PlaybackProgress", StringComparison.OrdinalIgnoreCase)) { var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSockets.Contains(message.Connection)); - if (session != null && session.UserId.HasValue) + if (session != null && session.User != null) { var vals = message.Data.Split('|'); @@ -130,14 +130,14 @@ namespace MediaBrowser.Server.Implementations.Session var isPaused = vals.Length > 2 && string.Equals(vals[2], "true", StringComparison.OrdinalIgnoreCase); - _sessionManager.OnPlaybackProgress(_userManager.GetUserById(session.UserId.Value), item, positionTicks, isPaused, session.Client, session.DeviceId, session.DeviceName); + _sessionManager.OnPlaybackProgress(_userManager.GetUserById(session.User.Id), item, positionTicks, isPaused, session.Client, session.DeviceId, session.DeviceName); } } else if (string.Equals(message.MessageType, "PlaybackStopped", StringComparison.OrdinalIgnoreCase)) { var session = _sessionManager.Sessions.FirstOrDefault(i => i.WebSockets.Contains(message.Connection)); - if (session != null && session.UserId.HasValue) + if (session != null && session.User != null) { var vals = message.Data.Split('|'); @@ -155,7 +155,7 @@ namespace MediaBrowser.Server.Implementations.Session } } - _sessionManager.OnPlaybackStopped(_userManager.GetUserById(session.UserId.Value), item, positionTicks, session.Client, session.DeviceId, session.DeviceName); + _sessionManager.OnPlaybackStopped(_userManager.GetUserById(session.User.Id), item, positionTicks, session.Client, session.DeviceId, session.DeviceName); } } diff --git a/MediaBrowser.ServerApplication/EntryPoints/LibraryChangedNotifier.cs b/MediaBrowser.ServerApplication/EntryPoints/LibraryChangedNotifier.cs index a59b152574..43224c6a99 100644 --- a/MediaBrowser.ServerApplication/EntryPoints/LibraryChangedNotifier.cs +++ b/MediaBrowser.ServerApplication/EntryPoints/LibraryChangedNotifier.cs @@ -190,12 +190,18 @@ namespace MediaBrowser.ServerApplication.EntryPoints { var currentSessions = _sessionManager.Sessions.ToList(); - var users = currentSessions.Select(i => i.UserId ?? Guid.Empty).Where(i => i != Guid.Empty).Distinct().ToList(); + var users = currentSessions.Select(i => i.User) + .Where(i => i != null) + .Select(i => i.Id) + .Distinct() + .ToList(); foreach (var userId in users) { var id = userId; - var webSockets = currentSessions.Where(u => u.UserId.HasValue && u.UserId.Value == id).SelectMany(i => i.WebSockets).ToList(); + var webSockets = currentSessions.Where(u => u.User != null && u.User.Id == id) + .SelectMany(i => i.WebSockets) + .ToList(); try { diff --git a/MediaBrowser.WebDashboard/Api/DashboardService.cs b/MediaBrowser.WebDashboard/Api/DashboardService.cs index 4f7162da7d..5ef413b55e 100644 --- a/MediaBrowser.WebDashboard/Api/DashboardService.cs +++ b/MediaBrowser.WebDashboard/Api/DashboardService.cs @@ -208,7 +208,7 @@ namespace MediaBrowser.WebDashboard.Api var dtoBuilder = new UserDtoBuilder(logger); - var tasks = userManager.Users.Where(u => connections.Any(c => c.UserId.HasValue && c.UserId.Value == u.Id)).Select(dtoBuilder.GetUserDto); + var tasks = userManager.Users.Where(u => connections.Any(c => c.User != null && c.User.Id == u.Id)).Select(dtoBuilder.GetUserDto); var users = await Task.WhenAll(tasks).ConfigureAwait(false);