mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-04-22 10:04:44 +01:00
removed excess hashing in providers and made user data key-based
This commit is contained in:
@@ -3,6 +3,8 @@ using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Controller.Entities.Audio;
|
||||
using MediaBrowser.Controller.Entities.Movies;
|
||||
using MediaBrowser.Controller.Entities.TV;
|
||||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Controller.Persistence;
|
||||
using MediaBrowser.Model.Drawing;
|
||||
using MediaBrowser.Model.Dto;
|
||||
using MediaBrowser.Model.Entities;
|
||||
@@ -14,7 +16,7 @@ using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MediaBrowser.Controller.Library
|
||||
namespace MediaBrowser.Controller.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// Generates DTO's from domain entities
|
||||
@@ -28,13 +30,13 @@ namespace MediaBrowser.Controller.Library
|
||||
|
||||
private readonly ILogger _logger;
|
||||
private readonly ILibraryManager _libraryManager;
|
||||
private readonly IUserManager _userManager;
|
||||
private readonly IUserDataRepository _userDataRepository;
|
||||
|
||||
public DtoBuilder(ILogger logger, ILibraryManager libraryManager, IUserManager userManager)
|
||||
public DtoBuilder(ILogger logger, ILibraryManager libraryManager, IUserDataRepository userDataRepository)
|
||||
{
|
||||
_logger = logger;
|
||||
_libraryManager = libraryManager;
|
||||
_userManager = userManager;
|
||||
_userDataRepository = userDataRepository;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -73,7 +75,7 @@ namespace MediaBrowser.Controller.Library
|
||||
{
|
||||
try
|
||||
{
|
||||
AttachPrimaryImageAspectRatio(dto, item);
|
||||
AttachPrimaryImageAspectRatio(dto, item, _logger);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -136,7 +138,7 @@ namespace MediaBrowser.Controller.Library
|
||||
{
|
||||
try
|
||||
{
|
||||
AttachPrimaryImageAspectRatio(dto, item);
|
||||
AttachPrimaryImageAspectRatio(dto, item, _logger);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -167,7 +169,7 @@ namespace MediaBrowser.Controller.Library
|
||||
{
|
||||
if (fields.Contains(ItemFields.UserData))
|
||||
{
|
||||
var userData = await _userManager.GetUserData(user.Id, item.UserDataId).ConfigureAwait(false);
|
||||
var userData = await _userDataRepository.GetUserData(user.Id, item.GetUserDataKey()).ConfigureAwait(false);
|
||||
|
||||
dto.UserData = GetUserItemDataDto(userData);
|
||||
}
|
||||
@@ -186,18 +188,19 @@ namespace MediaBrowser.Controller.Library
|
||||
// Skip sorting since all we want is a count
|
||||
dto.ChildCount = folder.GetChildren(user).Count();
|
||||
|
||||
await SetSpecialCounts(folder, user, dto, _userManager).ConfigureAwait(false);
|
||||
await SetSpecialCounts(folder, user, dto, _userDataRepository).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Attaches the primary image aspect ratio.
|
||||
/// </summary>
|
||||
/// <param name="dto">The dto.</param>
|
||||
/// <param name="item">The item.</param>
|
||||
/// <param name="_logger">The _logger.</param>
|
||||
/// <returns>Task.</returns>
|
||||
private void AttachPrimaryImageAspectRatio(IItemDto dto, BaseItem item)
|
||||
internal static void AttachPrimaryImageAspectRatio(IItemDto dto, BaseItem item, ILogger _logger)
|
||||
{
|
||||
var path = item.PrimaryImagePath;
|
||||
|
||||
@@ -503,9 +506,9 @@ namespace MediaBrowser.Controller.Library
|
||||
/// <param name="folder">The folder.</param>
|
||||
/// <param name="user">The user.</param>
|
||||
/// <param name="dto">The dto.</param>
|
||||
/// <param name="userManager">The user manager.</param>
|
||||
/// <param name="userDataRepository">The user data repository.</param>
|
||||
/// <returns>Task.</returns>
|
||||
private static async Task SetSpecialCounts(Folder folder, User user, BaseItemDto dto, IUserManager userManager)
|
||||
private static async Task SetSpecialCounts(Folder folder, User user, BaseItemDto dto, IUserDataRepository userDataRepository)
|
||||
{
|
||||
var rcentlyAddedItemCount = 0;
|
||||
var recursiveItemCount = 0;
|
||||
@@ -515,7 +518,7 @@ namespace MediaBrowser.Controller.Library
|
||||
// Loop through each recursive child
|
||||
foreach (var child in folder.GetRecursiveChildren(user).Where(i => !i.IsFolder))
|
||||
{
|
||||
var userdata = await userManager.GetUserData(user.Id, child.UserDataId).ConfigureAwait(false);
|
||||
var userdata = await userDataRepository.GetUserData(user.Id, child.GetUserDataKey()).ConfigureAwait(false);
|
||||
|
||||
recursiveItemCount++;
|
||||
|
||||
@@ -785,49 +788,6 @@ namespace MediaBrowser.Controller.Library
|
||||
return item.Id.ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts a User to a DTOUser
|
||||
/// </summary>
|
||||
/// <param name="user">The user.</param>
|
||||
/// <returns>DtoUser.</returns>
|
||||
/// <exception cref="System.ArgumentNullException">user</exception>
|
||||
public UserDto GetUserDto(User user)
|
||||
{
|
||||
if (user == null)
|
||||
{
|
||||
throw new ArgumentNullException("user");
|
||||
}
|
||||
|
||||
var dto = new UserDto
|
||||
{
|
||||
Id = user.Id,
|
||||
Name = user.Name,
|
||||
HasPassword = !String.IsNullOrEmpty(user.Password),
|
||||
LastActivityDate = user.LastActivityDate,
|
||||
LastLoginDate = user.LastLoginDate,
|
||||
Configuration = user.Configuration
|
||||
};
|
||||
|
||||
var image = user.PrimaryImagePath;
|
||||
|
||||
if (!string.IsNullOrEmpty(image))
|
||||
{
|
||||
dto.PrimaryImageTag = Kernel.Instance.ImageManager.GetImageCacheTag(user, ImageType.Primary, image);
|
||||
|
||||
try
|
||||
{
|
||||
AttachPrimaryImageAspectRatio(dto, user);
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a BaseItem based upon it's client-side item id
|
||||
/// </summary>
|
||||
71
MediaBrowser.Controller/Dto/UserDtoBuilder.cs
Normal file
71
MediaBrowser.Controller/Dto/UserDtoBuilder.cs
Normal file
@@ -0,0 +1,71 @@
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Model.Dto;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.Logging;
|
||||
using System;
|
||||
|
||||
namespace MediaBrowser.Controller.Dto
|
||||
{
|
||||
/// <summary>
|
||||
/// Class UserDtoBuilder
|
||||
/// </summary>
|
||||
public class UserDtoBuilder
|
||||
{
|
||||
/// <summary>
|
||||
/// The _logger
|
||||
/// </summary>
|
||||
private readonly ILogger _logger;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="UserDtoBuilder"/> class.
|
||||
/// </summary>
|
||||
/// <param name="logger">The logger.</param>
|
||||
public UserDtoBuilder(ILogger logger)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts a User to a DTOUser
|
||||
/// </summary>
|
||||
/// <param name="user">The user.</param>
|
||||
/// <returns>DtoUser.</returns>
|
||||
/// <exception cref="System.ArgumentNullException">user</exception>
|
||||
public UserDto GetUserDto(User user)
|
||||
{
|
||||
if (user == null)
|
||||
{
|
||||
throw new ArgumentNullException("user");
|
||||
}
|
||||
|
||||
var dto = new UserDto
|
||||
{
|
||||
Id = user.Id.ToString(),
|
||||
Name = user.Name,
|
||||
HasPassword = !String.IsNullOrEmpty(user.Password),
|
||||
LastActivityDate = user.LastActivityDate,
|
||||
LastLoginDate = user.LastLoginDate,
|
||||
Configuration = user.Configuration
|
||||
};
|
||||
|
||||
var image = user.PrimaryImagePath;
|
||||
|
||||
if (!string.IsNullOrEmpty(image))
|
||||
{
|
||||
dto.PrimaryImageTag = Kernel.Instance.ImageManager.GetImageCacheTag(user, ImageType.Primary, image);
|
||||
|
||||
try
|
||||
{
|
||||
DtoBuilder.AttachPrimaryImageAspectRatio(dto, user, _logger);
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@ using MediaBrowser.Controller.Configuration;
|
||||
using MediaBrowser.Controller.IO;
|
||||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Controller.Localization;
|
||||
using MediaBrowser.Controller.Persistence;
|
||||
using MediaBrowser.Controller.Providers;
|
||||
using MediaBrowser.Controller.Resolvers;
|
||||
using MediaBrowser.Model.Entities;
|
||||
@@ -183,23 +184,18 @@ namespace MediaBrowser.Controller.Entities
|
||||
/// <summary>
|
||||
/// The _file system stamp
|
||||
/// </summary>
|
||||
private Guid? _fileSystemStamp;
|
||||
private string _fileSystemStamp;
|
||||
/// <summary>
|
||||
/// Gets a directory stamp, in the form of a string, that can be used for
|
||||
/// comparison purposes to determine if the file system entries for this item have changed.
|
||||
/// </summary>
|
||||
/// <value>The file system stamp.</value>
|
||||
[IgnoreDataMember]
|
||||
public Guid FileSystemStamp
|
||||
public string FileSystemStamp
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!_fileSystemStamp.HasValue)
|
||||
{
|
||||
_fileSystemStamp = GetFileSystemStamp();
|
||||
}
|
||||
|
||||
return _fileSystemStamp.Value;
|
||||
return _fileSystemStamp ?? (_fileSystemStamp = GetFileSystemStamp());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -221,12 +217,12 @@ namespace MediaBrowser.Controller.Entities
|
||||
/// comparison purposes to determine if the file system entries for this item have changed.
|
||||
/// </summary>
|
||||
/// <returns>Guid.</returns>
|
||||
private Guid GetFileSystemStamp()
|
||||
private string GetFileSystemStamp()
|
||||
{
|
||||
// If there's no path or the item is a file, there's nothing to do
|
||||
if (LocationType != LocationType.FileSystem || !ResolveArgs.IsDirectory)
|
||||
{
|
||||
return Guid.Empty;
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
var sb = new StringBuilder();
|
||||
@@ -242,7 +238,7 @@ namespace MediaBrowser.Controller.Entities
|
||||
sb.Append(file.cFileName);
|
||||
}
|
||||
|
||||
return sb.ToString().GetMD5();
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -820,21 +816,12 @@ namespace MediaBrowser.Controller.Entities
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The _user data id
|
||||
/// Gets the user data key.
|
||||
/// </summary>
|
||||
protected Guid _userDataId; //cache this so it doesn't have to be re-constructed on every reference
|
||||
/// <summary>
|
||||
/// Return the id that should be used to key user data for this item.
|
||||
/// Default is just this Id but subclasses can use provider Ids for transportability.
|
||||
/// </summary>
|
||||
/// <value>The user data id.</value>
|
||||
[IgnoreDataMember]
|
||||
public virtual Guid UserDataId
|
||||
/// <returns>System.String.</returns>
|
||||
public virtual string GetUserDataKey()
|
||||
{
|
||||
get
|
||||
{
|
||||
return _userDataId == Guid.Empty ? (_userDataId = Id) : _userDataId;
|
||||
}
|
||||
return Id.ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -1151,14 +1138,16 @@ namespace MediaBrowser.Controller.Entities
|
||||
/// <param name="userManager">The user manager.</param>
|
||||
/// <returns>Task.</returns>
|
||||
/// <exception cref="System.ArgumentNullException"></exception>
|
||||
public virtual async Task SetPlayedStatus(User user, bool wasPlayed, IUserManager userManager)
|
||||
public virtual async Task SetPlayedStatus(User user, bool wasPlayed, IUserDataRepository userManager)
|
||||
{
|
||||
if (user == null)
|
||||
{
|
||||
throw new ArgumentNullException();
|
||||
}
|
||||
|
||||
var data = await userManager.GetUserData(user.Id, UserDataId).ConfigureAwait(false);
|
||||
var key = GetUserDataKey();
|
||||
|
||||
var data = await userManager.GetUserData(user.Id, key).ConfigureAwait(false);
|
||||
|
||||
if (wasPlayed)
|
||||
{
|
||||
@@ -1181,7 +1170,7 @@ namespace MediaBrowser.Controller.Entities
|
||||
|
||||
data.Played = wasPlayed;
|
||||
|
||||
await userManager.SaveUserData(user.Id, UserDataId, data, CancellationToken.None).ConfigureAwait(false);
|
||||
await userManager.SaveUserData(user.Id, key, data, CancellationToken.None).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -3,6 +3,7 @@ using MediaBrowser.Common.Progress;
|
||||
using MediaBrowser.Controller.IO;
|
||||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Controller.Localization;
|
||||
using MediaBrowser.Controller.Persistence;
|
||||
using MediaBrowser.Controller.Resolvers;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using System;
|
||||
@@ -809,7 +810,7 @@ namespace MediaBrowser.Controller.Entities
|
||||
/// <param name="wasPlayed">if set to <c>true</c> [was played].</param>
|
||||
/// <param name="userManager">The user manager.</param>
|
||||
/// <returns>Task.</returns>
|
||||
public override async Task SetPlayedStatus(User user, bool wasPlayed, IUserManager userManager)
|
||||
public override async Task SetPlayedStatus(User user, bool wasPlayed, IUserDataRepository userManager)
|
||||
{
|
||||
await base.SetPlayedStatus(user, wasPlayed, userManager).ConfigureAwait(false);
|
||||
|
||||
|
||||
@@ -6,5 +6,13 @@ namespace MediaBrowser.Controller.Entities
|
||||
/// </summary>
|
||||
public class Genre : BaseItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the user data key.
|
||||
/// </summary>
|
||||
/// <returns>System.String.</returns>
|
||||
public override string GetUserDataKey()
|
||||
{
|
||||
return Name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
using MediaBrowser.Common.Extensions;
|
||||
using MediaBrowser.Controller.IO;
|
||||
using MediaBrowser.Controller.IO;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
@@ -30,21 +28,12 @@ namespace MediaBrowser.Controller.Entities.Movies
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Override to use tmdb or imdb id so it will stick if the item moves physical locations
|
||||
/// Gets the user data key.
|
||||
/// </summary>
|
||||
/// <value>The user data id.</value>
|
||||
[IgnoreDataMember]
|
||||
public override Guid UserDataId
|
||||
/// <returns>System.String.</returns>
|
||||
public override string GetUserDataKey()
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_userDataId == Guid.Empty)
|
||||
{
|
||||
var baseId = this.GetProviderId(MetadataProviders.Tmdb) ?? this.GetProviderId(MetadataProviders.Imdb);
|
||||
_userDataId = baseId != null ? baseId.GetMD5() : Id;
|
||||
}
|
||||
return _userDataId;
|
||||
}
|
||||
return this.GetProviderId(MetadataProviders.Tmdb) ?? this.GetProviderId(MetadataProviders.Imdb) ?? base.GetUserDataKey();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -6,6 +6,14 @@ namespace MediaBrowser.Controller.Entities
|
||||
/// </summary>
|
||||
public class Person : BaseItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the user data key.
|
||||
/// </summary>
|
||||
/// <returns>System.String.</returns>
|
||||
public override string GetUserDataKey()
|
||||
{
|
||||
return Name;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -6,5 +6,13 @@ namespace MediaBrowser.Controller.Entities
|
||||
/// </summary>
|
||||
public class Studio : BaseItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the user data key.
|
||||
/// </summary>
|
||||
/// <returns>System.String.</returns>
|
||||
public override string GetUserDataKey()
|
||||
{
|
||||
return Name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,27 +49,19 @@ namespace MediaBrowser.Controller.Entities.TV
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Override to use the provider Ids + season and episode number so it will be portable
|
||||
/// Gets the user data key.
|
||||
/// </summary>
|
||||
/// <value>The user data id.</value>
|
||||
[IgnoreDataMember]
|
||||
public override Guid UserDataId
|
||||
/// <returns>System.String.</returns>
|
||||
public override string GetUserDataKey()
|
||||
{
|
||||
get
|
||||
if (Series != null)
|
||||
{
|
||||
if (_userDataId == Guid.Empty)
|
||||
{
|
||||
var baseId = Series != null ? Series.GetProviderId(MetadataProviders.Tvdb) ?? Series.GetProviderId(MetadataProviders.Tvcom) : null;
|
||||
if (baseId != null)
|
||||
{
|
||||
var seasonNo = Season != null ? Season.IndexNumber ?? 0 : 0;
|
||||
var epNo = IndexNumber ?? 0;
|
||||
baseId = baseId + seasonNo.ToString("000") + epNo.ToString("000");
|
||||
}
|
||||
_userDataId = baseId != null ? baseId.GetMD5() : Id;
|
||||
}
|
||||
return _userDataId;
|
||||
var seasonNo = Season != null ? Season.IndexNumber ?? 0 : 0;
|
||||
var epNo = IndexNumber ?? 0;
|
||||
return Series.GetUserDataKey() + seasonNo.ToString("000") + epNo.ToString("000");
|
||||
}
|
||||
|
||||
return base.GetUserDataKey();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -67,27 +67,18 @@ namespace MediaBrowser.Controller.Entities.TV
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Override to use the provider Ids + season number so it will be portable
|
||||
/// Gets the user data key.
|
||||
/// </summary>
|
||||
/// <value>The user data id.</value>
|
||||
[IgnoreDataMember]
|
||||
public override Guid UserDataId
|
||||
/// <returns>System.String.</returns>
|
||||
public override string GetUserDataKey()
|
||||
{
|
||||
get
|
||||
if (Series != null)
|
||||
{
|
||||
if (_userDataId == Guid.Empty)
|
||||
{
|
||||
var baseId = Series != null ? Series.GetProviderId(MetadataProviders.Tvdb) ?? Series.GetProviderId(MetadataProviders.Tvcom) : null;
|
||||
if (baseId != null)
|
||||
{
|
||||
var seasonNo = IndexNumber ?? 0;
|
||||
baseId = baseId + seasonNo.ToString("000");
|
||||
}
|
||||
|
||||
_userDataId = baseId != null ? baseId.GetMD5() : Id;
|
||||
}
|
||||
return _userDataId;
|
||||
var seasonNo = IndexNumber ?? 0;
|
||||
return Series.GetUserDataKey() + seasonNo.ToString("000");
|
||||
}
|
||||
|
||||
return base.GetUserDataKey();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -44,21 +44,12 @@ namespace MediaBrowser.Controller.Entities.TV
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Override to use the provider Ids so it will be portable
|
||||
/// Gets the user data key.
|
||||
/// </summary>
|
||||
/// <value>The user data id.</value>
|
||||
[IgnoreDataMember]
|
||||
public override Guid UserDataId
|
||||
/// <returns>System.String.</returns>
|
||||
public override string GetUserDataKey()
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_userDataId == Guid.Empty)
|
||||
{
|
||||
var baseId = this.GetProviderId(MetadataProviders.Tvdb) ?? this.GetProviderId(MetadataProviders.Tvcom);
|
||||
_userDataId = baseId != null ? baseId.GetMD5() : Id;
|
||||
}
|
||||
return _userDataId;
|
||||
}
|
||||
return this.GetProviderId(MetadataProviders.Tvdb) ?? this.GetProviderId(MetadataProviders.Tvcom) ?? base.GetUserDataKey();
|
||||
}
|
||||
|
||||
// Studio, Genre and Rating will all be the same so makes no sense to index by these
|
||||
|
||||
@@ -6,5 +6,13 @@ namespace MediaBrowser.Controller.Entities
|
||||
/// </summary>
|
||||
public class Year : BaseItem
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the user data key.
|
||||
/// </summary>
|
||||
/// <returns>System.String.</returns>
|
||||
public override string GetUserDataKey()
|
||||
{
|
||||
return Name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -173,24 +173,5 @@ namespace MediaBrowser.Controller.Library
|
||||
/// <param name="newPassword">The new password.</param>
|
||||
/// <returns>Task.</returns>
|
||||
Task ChangePassword(User user, string newPassword);
|
||||
|
||||
/// <summary>
|
||||
/// Saves the user data.
|
||||
/// </summary>
|
||||
/// <param name="userId">The user id.</param>
|
||||
/// <param name="userDataId">The user data id.</param>
|
||||
/// <param name="userData">The user data.</param>
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <returns>Task.</returns>
|
||||
Task SaveUserData(Guid userId, Guid userDataId, UserItemData userData,
|
||||
CancellationToken cancellationToken);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the user data.
|
||||
/// </summary>
|
||||
/// <param name="userId">The user id.</param>
|
||||
/// <param name="userDataId">The user data id.</param>
|
||||
/// <returns>Task{UserItemData}.</returns>
|
||||
Task<UserItemData> GetUserData(Guid userId, Guid userDataId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,6 +72,7 @@
|
||||
<Compile Include="Drawing\ImageExtensions.cs" />
|
||||
<Compile Include="Drawing\ImageHeader.cs" />
|
||||
<Compile Include="Drawing\ImageManager.cs" />
|
||||
<Compile Include="Dto\UserDtoBuilder.cs" />
|
||||
<Compile Include="Entities\AggregateFolder.cs" />
|
||||
<Compile Include="Entities\Audio\Audio.cs" />
|
||||
<Compile Include="Entities\Audio\MusicAlbum.cs" />
|
||||
@@ -107,7 +108,7 @@
|
||||
<Compile Include="IServerApplicationHost.cs" />
|
||||
<Compile Include="IServerApplicationPaths.cs" />
|
||||
<Compile Include="Library\ChildrenChangedEventArgs.cs" />
|
||||
<Compile Include="Library\DtoBuilder.cs" />
|
||||
<Compile Include="Dto\DtoBuilder.cs" />
|
||||
<Compile Include="Providers\IProviderManager.cs" />
|
||||
<Compile Include="Providers\MediaInfo\MediaEncoderHelpers.cs" />
|
||||
<Compile Include="Providers\MetadataProviderPriority.cs" />
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using System;
|
||||
using System;
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
@@ -14,19 +14,19 @@ namespace MediaBrowser.Controller.Persistence
|
||||
/// Saves the user data.
|
||||
/// </summary>
|
||||
/// <param name="userId">The user id.</param>
|
||||
/// <param name="userDataId">The user data id.</param>
|
||||
/// <param name="key">The key.</param>
|
||||
/// <param name="userData">The user data.</param>
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <returns>Task.</returns>
|
||||
Task SaveUserData(Guid userId, Guid userDataId, UserItemData userData,
|
||||
Task SaveUserData(Guid userId, string key, UserItemData userData,
|
||||
CancellationToken cancellationToken);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the user data.
|
||||
/// </summary>
|
||||
/// <param name="userId">The user id.</param>
|
||||
/// <param name="userDataId">The user data id.</param>
|
||||
/// <param name="key">The key.</param>
|
||||
/// <returns>Task{UserItemData}.</returns>
|
||||
Task<UserItemData> GetUserData(Guid userId, Guid userDataId);
|
||||
Task<UserItemData> GetUserData(Guid userId, string key);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,19 +29,7 @@ namespace MediaBrowser.Controller.Providers
|
||||
/// <summary>
|
||||
/// The _id
|
||||
/// </summary>
|
||||
protected Guid _id;
|
||||
/// <summary>
|
||||
/// Gets the id.
|
||||
/// </summary>
|
||||
/// <value>The id.</value>
|
||||
public virtual Guid Id
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_id == Guid.Empty) _id = GetType().FullName.GetMD5();
|
||||
return _id;
|
||||
}
|
||||
}
|
||||
protected readonly Guid Id;
|
||||
|
||||
/// <summary>
|
||||
/// Supportses the specified item.
|
||||
@@ -105,6 +93,7 @@ namespace MediaBrowser.Controller.Providers
|
||||
Logger = logManager.GetLogger(GetType().Name);
|
||||
LogManager = logManager;
|
||||
ConfigurationManager = configurationManager;
|
||||
Id = GetType().FullName.GetMD5();
|
||||
|
||||
Initialize();
|
||||
}
|
||||
@@ -130,8 +119,14 @@ namespace MediaBrowser.Controller.Providers
|
||||
{
|
||||
throw new ArgumentNullException("item");
|
||||
}
|
||||
|
||||
var data = item.ProviderData.GetValueOrDefault(Id, new BaseProviderInfo { ProviderId = Id });
|
||||
|
||||
BaseProviderInfo data;
|
||||
|
||||
if (!item.ProviderData.TryGetValue(Id, out data))
|
||||
{
|
||||
data = new BaseProviderInfo();
|
||||
}
|
||||
|
||||
data.LastRefreshed = value;
|
||||
data.LastRefreshStatus = status;
|
||||
data.ProviderVersion = providerVersion;
|
||||
@@ -155,7 +150,7 @@ namespace MediaBrowser.Controller.Providers
|
||||
{
|
||||
SetLastRefreshed(item, value, ProviderVersion, status);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Returns whether or not this provider should be re-fetched. Default functionality can
|
||||
/// compare a provided date with a last refresh time. This can be overridden for more complex
|
||||
@@ -171,9 +166,14 @@ namespace MediaBrowser.Controller.Providers
|
||||
throw new ArgumentNullException();
|
||||
}
|
||||
|
||||
var providerInfo = item.ProviderData.GetValueOrDefault(Id, new BaseProviderInfo());
|
||||
BaseProviderInfo data;
|
||||
|
||||
return NeedsRefreshInternal(item, providerInfo);
|
||||
if (!item.ProviderData.TryGetValue(Id, out data))
|
||||
{
|
||||
data = new BaseProviderInfo();
|
||||
}
|
||||
|
||||
return NeedsRefreshInternal(item, data);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -194,7 +194,7 @@ namespace MediaBrowser.Controller.Providers
|
||||
{
|
||||
throw new ArgumentNullException("providerInfo");
|
||||
}
|
||||
|
||||
|
||||
if (CompareDate(item) > providerInfo.LastRefreshed)
|
||||
{
|
||||
return true;
|
||||
@@ -209,7 +209,7 @@ namespace MediaBrowser.Controller.Providers
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -221,7 +221,7 @@ namespace MediaBrowser.Controller.Providers
|
||||
/// <returns><c>true</c> if [has file system stamp changed] [the specified item]; otherwise, <c>false</c>.</returns>
|
||||
protected bool HasFileSystemStampChanged(BaseItem item, BaseProviderInfo providerInfo)
|
||||
{
|
||||
return GetCurrentFileSystemStamp(item) != providerInfo.FileSystemStamp;
|
||||
return !string.Equals(GetCurrentFileSystemStamp(item), providerInfo.FileSystemStamp);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -279,7 +279,7 @@ namespace MediaBrowser.Controller.Providers
|
||||
/// </summary>
|
||||
/// <param name="item">The item.</param>
|
||||
/// <returns>Guid.</returns>
|
||||
private Guid GetCurrentFileSystemStamp(BaseItem item)
|
||||
private string GetCurrentFileSystemStamp(BaseItem item)
|
||||
{
|
||||
if (UseParentFileSystemStamp(item) && item.Parent != null)
|
||||
{
|
||||
|
||||
@@ -7,11 +7,6 @@ namespace MediaBrowser.Controller.Providers
|
||||
/// </summary>
|
||||
public class BaseProviderInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets or sets the provider id.
|
||||
/// </summary>
|
||||
/// <value>The provider id.</value>
|
||||
public Guid ProviderId { get; set; }
|
||||
/// <summary>
|
||||
/// Gets or sets the last refreshed.
|
||||
/// </summary>
|
||||
@@ -21,7 +16,7 @@ namespace MediaBrowser.Controller.Providers
|
||||
/// Gets or sets the file system stamp.
|
||||
/// </summary>
|
||||
/// <value>The file system stamp.</value>
|
||||
public Guid FileSystemStamp { get; set; }
|
||||
public string FileSystemStamp { get; set; }
|
||||
/// <summary>
|
||||
/// Gets or sets the last refresh status.
|
||||
/// </summary>
|
||||
@@ -32,11 +27,6 @@ namespace MediaBrowser.Controller.Providers
|
||||
/// </summary>
|
||||
/// <value>The provider version.</value>
|
||||
public string ProviderVersion { get; set; }
|
||||
/// <summary>
|
||||
/// Gets or sets the data hash.
|
||||
/// </summary>
|
||||
/// <value>The data hash.</value>
|
||||
public Guid DataHash { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -104,7 +104,14 @@ namespace MediaBrowser.Controller.Providers.Movies
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
var movie = item;
|
||||
if (ShouldFetch(movie, movie.ProviderData.GetValueOrDefault(Id, new BaseProviderInfo { ProviderId = Id })))
|
||||
|
||||
BaseProviderInfo providerData;
|
||||
|
||||
if (!item.ProviderData.TryGetValue(Id, out providerData))
|
||||
{
|
||||
providerData = new BaseProviderInfo();
|
||||
}
|
||||
if (ShouldFetch(movie, providerData))
|
||||
{
|
||||
var language = ConfigurationManager.Configuration.PreferredMetadataLanguage.ToLower();
|
||||
var url = string.Format(FanArtBaseUrl, APIKey, movie.GetProviderId(MetadataProviders.Tmdb));
|
||||
|
||||
@@ -22,10 +22,11 @@ namespace MediaBrowser.Controller.Providers.Movies
|
||||
{
|
||||
class MovieDbProviderException : ApplicationException
|
||||
{
|
||||
public MovieDbProviderException(string msg) : base(msg)
|
||||
public MovieDbProviderException(string msg)
|
||||
: base(msg)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// Class MovieDbProvider
|
||||
@@ -33,7 +34,7 @@ namespace MediaBrowser.Controller.Providers.Movies
|
||||
public class MovieDbProvider : BaseMetadataProvider, IDisposable
|
||||
{
|
||||
protected readonly IProviderManager ProviderManager;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// The movie db
|
||||
/// </summary>
|
||||
@@ -198,7 +199,7 @@ namespace MediaBrowser.Controller.Providers.Movies
|
||||
base_url = "http://cf2.imgobject.com/t/p/"
|
||||
|
||||
}
|
||||
};
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -223,7 +224,14 @@ namespace MediaBrowser.Controller.Providers.Movies
|
||||
//in addition to ours, we need to set the last refreshed time for the local data provider
|
||||
//so it won't see the new files we download and process them all over again
|
||||
if (JsonProvider == null) JsonProvider = new MovieProviderFromJson(LogManager, ConfigurationManager, JsonSerializer, HttpClient, ProviderManager);
|
||||
var data = item.ProviderData.GetValueOrDefault(JsonProvider.Id, new BaseProviderInfo { ProviderId = JsonProvider.Id });
|
||||
|
||||
BaseProviderInfo data;
|
||||
|
||||
if (!item.ProviderData.TryGetValue(JsonProvider.Id, out data))
|
||||
{
|
||||
data = new BaseProviderInfo();
|
||||
}
|
||||
|
||||
data.LastRefreshed = value;
|
||||
item.ProviderData[JsonProvider.Id] = data;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using MediaBrowser.Common.Extensions;
|
||||
using System.Collections.Generic;
|
||||
using MediaBrowser.Common.Extensions;
|
||||
using MediaBrowser.Controller.Configuration;
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Controller.Entities.Audio;
|
||||
@@ -52,14 +53,15 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
|
||||
//Look at our parent for our album cover
|
||||
var artist = (MusicArtist)item.Parent;
|
||||
var cover = artist.AlbumCovers != null ? artist.AlbumCovers.GetValueOrDefault(mbid, null) : null;
|
||||
|
||||
var cover = artist.AlbumCovers != null ? GetValueOrDefault(artist.AlbumCovers, mbid, null) : null;
|
||||
if (cover == null)
|
||||
{
|
||||
// Not there - maybe it is new since artist last refreshed so refresh it and try again
|
||||
await artist.RefreshMetadata(cancellationToken).ConfigureAwait(false);
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
cover = artist.AlbumCovers != null ? artist.AlbumCovers.GetValueOrDefault(mbid, null) : null;
|
||||
cover = artist.AlbumCovers != null ? GetValueOrDefault(artist.AlbumCovers, mbid, null) : null;
|
||||
}
|
||||
if (cover == null)
|
||||
{
|
||||
@@ -71,5 +73,25 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
item.SetImage(ImageType.Primary, await _providerManager.DownloadAndSaveImage(item, cover, "folder.jpg", FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper method for Dictionaries since they throw on not-found keys
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <typeparam name="U"></typeparam>
|
||||
/// <param name="dictionary">The dictionary.</param>
|
||||
/// <param name="key">The key.</param>
|
||||
/// <param name="defaultValue">The default value.</param>
|
||||
/// <returns>``1.</returns>
|
||||
private static U GetValueOrDefault<T, U>(Dictionary<T, U> dictionary, T key, U defaultValue)
|
||||
{
|
||||
U val;
|
||||
if (!dictionary.TryGetValue(key, out val))
|
||||
{
|
||||
val = defaultValue;
|
||||
}
|
||||
return val;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,7 +86,15 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
var artist = (MusicArtist)item;
|
||||
if (ShouldFetch(artist, artist.ProviderData.GetValueOrDefault(Id, new BaseProviderInfo { ProviderId = Id })))
|
||||
|
||||
BaseProviderInfo providerData;
|
||||
|
||||
if (!item.ProviderData.TryGetValue(Id, out providerData))
|
||||
{
|
||||
providerData = new BaseProviderInfo();
|
||||
}
|
||||
|
||||
if (ShouldFetch(artist, providerData))
|
||||
{
|
||||
var url = string.Format(FanArtBaseUrl, APIKey, artist.GetProviderId(MetadataProviders.Musicbrainz));
|
||||
var doc = new XmlDocument();
|
||||
|
||||
@@ -229,7 +229,13 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
var providerData = item.ProviderData.GetValueOrDefault(Id, new BaseProviderInfo { ProviderId = Id });
|
||||
BaseProviderInfo providerData;
|
||||
|
||||
if (!item.ProviderData.TryGetValue(Id, out providerData))
|
||||
{
|
||||
providerData = new BaseProviderInfo();
|
||||
}
|
||||
|
||||
if (!ConfigurationManager.Configuration.SaveLocalMeta || !HasLocalMeta(item) || (force && !HasLocalMeta(item)) || (RefreshOnVersionChange && providerData.ProviderVersion != ProviderVersion))
|
||||
{
|
||||
try
|
||||
|
||||
@@ -60,7 +60,15 @@ namespace MediaBrowser.Controller.Providers.TV
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
var series = (Series)item;
|
||||
if (ShouldFetch(series, series.ProviderData.GetValueOrDefault(Id, new BaseProviderInfo { ProviderId = Id })))
|
||||
|
||||
BaseProviderInfo providerData;
|
||||
|
||||
if (!item.ProviderData.TryGetValue(Id, out providerData))
|
||||
{
|
||||
providerData = new BaseProviderInfo();
|
||||
}
|
||||
|
||||
if (ShouldFetch(series, providerData))
|
||||
{
|
||||
string language = ConfigurationManager.Configuration.PreferredMetadataLanguage.ToLower();
|
||||
string url = string.Format(FanArtBaseUrl, APIKey, series.GetProviderId(MetadataProviders.Tvdb));
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Controller.Persistence;
|
||||
|
||||
namespace MediaBrowser.Controller.Sorting
|
||||
{
|
||||
@@ -19,5 +20,11 @@ namespace MediaBrowser.Controller.Sorting
|
||||
/// </summary>
|
||||
/// <value>The user manager.</value>
|
||||
IUserManager UserManager { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the user data repository.
|
||||
/// </summary>
|
||||
/// <value>The user data repository.</value>
|
||||
IUserDataRepository UserDataRepository { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user