diff --git a/Jellyfin.Data/Entities/ImageInfo.cs b/Jellyfin.Data/Entities/ImageInfo.cs
index 336c13b36a..6593695450 100644
--- a/Jellyfin.Data/Entities/ImageInfo.cs
+++ b/Jellyfin.Data/Entities/ImageInfo.cs
@@ -1,24 +1,33 @@
using System;
using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
namespace Jellyfin.Data.Entities
{
public class ImageInfo
{
- public ImageInfo(string path)
+ public ImageInfo(string path, int width, int height)
{
Path = path;
+ Width = width;
+ Height = height;
LastModified = DateTime.UtcNow;
}
[Key]
[Required]
-
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; protected set; }
[Required]
public string Path { get; set; }
+ [Required]
+ public int Width { get; set; }
+
+ [Required]
+ public int Height { get; set; }
+
[Required]
public DateTime LastModified { get; set; }
}
diff --git a/Jellyfin.Data/Entities/Permission.cs b/Jellyfin.Data/Entities/Permission.cs
index 136e7abd35..7061280283 100644
--- a/Jellyfin.Data/Entities/Permission.cs
+++ b/Jellyfin.Data/Entities/Permission.cs
@@ -12,14 +12,7 @@ namespace Jellyfin.Data.Entities
partial void Init();
///
- /// Default constructor. Protected due to required properties, but present because EF needs it.
- ///
- protected Permission()
- {
- Init();
- }
-
- ///
+ /// Initializes a new instance of the class.
/// Public constructor with required data
///
///
@@ -33,6 +26,15 @@ namespace Jellyfin.Data.Entities
Init();
}
+ ///
+ /// Initializes a new instance of the class.
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ ///
+ protected Permission()
+ {
+ Init();
+ }
+
///
/// Static create function (for use in LINQ queries, etc.)
///
diff --git a/Jellyfin.Data/Entities/User.cs b/Jellyfin.Data/Entities/User.cs
index bd1cde31ce..783823a17f 100644
--- a/Jellyfin.Data/Entities/User.cs
+++ b/Jellyfin.Data/Entities/User.cs
@@ -25,7 +25,7 @@ namespace Jellyfin.Data.Entities
///
/// The username for the new user.
/// The authentication provider's Id
- public User(string username, string authenticationProviderId)
+ public User(string username, string authenticationProviderId, string passwordResetProviderId)
{
if (string.IsNullOrEmpty(username))
{
@@ -39,6 +39,7 @@ namespace Jellyfin.Data.Entities
Username = username;
AuthenticationProviderId = authenticationProviderId;
+ PasswordResetProviderId = passwordResetProviderId;
Groups = new HashSet();
Permissions = new HashSet();
@@ -85,10 +86,11 @@ namespace Jellyfin.Data.Entities
///
/// The username for the created user.
/// The Id of the user's authentication provider.
+ /// The Id of the user's password reset provider.
/// The created instance.
- public static User Create(string username, string authenticationProviderId)
+ public static User Create(string username, string authenticationProviderId, string passwordResetProviderId)
{
- return new User(username, authenticationProviderId);
+ return new User(username, authenticationProviderId, passwordResetProviderId);
}
/*************************************************************************
diff --git a/Jellyfin.Server.Implementations/Users/UserManager.cs b/Jellyfin.Server.Implementations/Users/UserManager.cs
index 2915741555..18616f75f9 100644
--- a/Jellyfin.Server.Implementations/Users/UserManager.cs
+++ b/Jellyfin.Server.Implementations/Users/UserManager.cs
@@ -190,7 +190,10 @@ namespace Jellyfin.Server.Implementations.Users
var dbContext = _dbProvider.CreateContext();
- var newUser = new User(name, _defaultAuthenticationProvider.GetType().FullName);
+ var newUser = new User(
+ name,
+ _defaultAuthenticationProvider.GetType().FullName,
+ _defaultPasswordResetProvider.GetType().FullName);
dbContext.Users.Add(newUser);
dbContext.SaveChanges();
diff --git a/Jellyfin.Server/Migrations/Routines/MigrateUserDb.cs b/Jellyfin.Server/Migrations/Routines/MigrateUserDb.cs
index 9a428a7477..987c85f4c3 100644
--- a/Jellyfin.Server/Migrations/Routines/MigrateUserDb.cs
+++ b/Jellyfin.Server/Migrations/Routines/MigrateUserDb.cs
@@ -7,6 +7,7 @@ using Jellyfin.Data.Enums;
using Jellyfin.Server.Implementations;
using Jellyfin.Server.Implementations.Users;
using MediaBrowser.Controller;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Users;
using Microsoft.Extensions.Logging;
@@ -84,9 +85,9 @@ namespace Jellyfin.Server.Migrations.Routines
StringComparison.Ordinal)
?? typeof(DefaultAuthenticationProvider).FullName;
- policy.PasswordResetProviderId ??= typeof(DefaultPasswordResetProvider).FullName;
+ policy.PasswordResetProviderId = typeof(DefaultPasswordResetProvider).FullName;
- var user = new User(mockup.Name, policy.AuthenticationProviderId)
+ var user = new User(mockup.Name, policy.AuthenticationProviderId, string.Empty)
{
Id = entry[1].ReadGuidFromBlob(),
InternalId = entry[0].ToInt64(),
@@ -113,6 +114,16 @@ namespace Jellyfin.Server.Migrations.Routines
LastActivityDate = mockup.LastActivityDate ?? DateTime.MinValue
};
+ if (mockup.ImageInfos.Length > 0)
+ {
+ ItemImageInfo info = mockup.ImageInfos[0];
+
+ user.ProfileImage = new ImageInfo(info.Path, info.Width, info.Height)
+ {
+ LastModified = info.DateModified
+ };
+ }
+
user.SetPermission(PermissionKind.IsAdministrator, policy.IsAdministrator);
user.SetPermission(PermissionKind.IsHidden, policy.IsHidden);
user.SetPermission(PermissionKind.IsDisabled, policy.IsDisabled);
@@ -184,6 +195,8 @@ namespace Jellyfin.Server.Migrations.Routines
public DateTime? LastActivityDate { get; set; }
public string Name { get; set; }
+
+ public ItemImageInfo[] ImageInfos { get; set; }
}
}
}
diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs
index 5bdf1618bc..1392184df4 100644
--- a/MediaBrowser.Api/Images/ImageService.cs
+++ b/MediaBrowser.Api/Images/ImageService.cs
@@ -17,6 +17,7 @@ using MediaBrowser.Model.Drawing;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO;
+using MediaBrowser.Model.Net;
using MediaBrowser.Model.Services;
using Microsoft.Extensions.Logging;
using Microsoft.Net.Http.Headers;
@@ -887,7 +888,7 @@ namespace MediaBrowser.Api.Images
var userDataPath = Path.Combine(ServerConfigurationManager.ApplicationPaths.UserConfigurationDirectoryPath, user.Username);
await _providerManager
- .SaveImage(user, memoryStream, mimeType, Path.Combine(userDataPath, _imageProcessor.GetImageCacheTag(user)))
+ .SaveImage(user, memoryStream, mimeType, Path.Combine(userDataPath, "profile" + MimeTypes.ToExtension(mimeType)))
.ConfigureAwait(false);
await _userManager.UpdateUserAsync(user);
}
diff --git a/MediaBrowser.Providers/Manager/ImageSaver.cs b/MediaBrowser.Providers/Manager/ImageSaver.cs
index 6bed387807..3c94f62150 100644
--- a/MediaBrowser.Providers/Manager/ImageSaver.cs
+++ b/MediaBrowser.Providers/Manager/ImageSaver.cs
@@ -131,7 +131,7 @@ namespace MediaBrowser.Providers.Manager
var currentImage = GetCurrentImage(item, type, index);
var currentImageIsLocalFile = currentImage != null && currentImage.IsLocalFile;
- var currentImagePath = currentImage == null ? null : currentImage.Path;
+ var currentImagePath = currentImage?.Path;
var savedPaths = new List();
@@ -179,13 +179,8 @@ namespace MediaBrowser.Providers.Manager
}
}
- public async Task SaveImage(User user, Stream source, string mimeType, string path)
+ public async Task SaveImage(User user, Stream source, string path)
{
- if (string.IsNullOrEmpty(mimeType))
- {
- throw new ArgumentNullException(nameof(mimeType));
- }
-
await SaveImageToLocation(source, path, path, CancellationToken.None).ConfigureAwait(false);
}
diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs
index f4e875a24f..be8fe3e1c5 100644
--- a/MediaBrowser.Providers/Manager/ProviderManager.cs
+++ b/MediaBrowser.Providers/Manager/ProviderManager.cs
@@ -191,7 +191,7 @@ namespace MediaBrowser.Providers.Manager
public Task SaveImage(User user, Stream source, string mimeType, string path)
{
return new ImageSaver(_configurationManager, _libraryMonitor, _fileSystem, _logger)
- .SaveImage(user, source, mimeType, path);
+ .SaveImage(user, source, path);
}
public async Task> GetAvailableRemoteImages(BaseItem item, RemoteImageQuery query, CancellationToken cancellationToken)