diff options
Diffstat (limited to 'MediaBrowser.Controller')
24 files changed, 272 insertions, 218 deletions
diff --git a/MediaBrowser.Controller/Library/DtoBuilder.cs b/MediaBrowser.Controller/Dto/DtoBuilder.cs index 7f9a6f187..0da4da356 100644 --- a/MediaBrowser.Controller/Library/DtoBuilder.cs +++ b/MediaBrowser.Controller/Dto/DtoBuilder.cs @@ -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++; @@ -786,49 +789,6 @@ namespace MediaBrowser.Controller.Library } /// <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> /// <param name="id">The id.</param> diff --git a/MediaBrowser.Controller/Dto/UserDtoBuilder.cs b/MediaBrowser.Controller/Dto/UserDtoBuilder.cs new file mode 100644 index 000000000..5c717529a --- /dev/null +++ b/MediaBrowser.Controller/Dto/UserDtoBuilder.cs @@ -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; + } + } +} diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 2cb8ac794..ccaabd438 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -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> diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index eefce2fd3..fed6bb7de 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -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); diff --git a/MediaBrowser.Controller/Entities/Genre.cs b/MediaBrowser.Controller/Entities/Genre.cs index d5e8afb20..619c7a12b 100644 --- a/MediaBrowser.Controller/Entities/Genre.cs +++ b/MediaBrowser.Controller/Entities/Genre.cs @@ -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; + } } } diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs index d08588077..b70ac2b3b 100644 --- a/MediaBrowser.Controller/Entities/Movies/Movie.cs +++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs @@ -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> diff --git a/MediaBrowser.Controller/Entities/Person.cs b/MediaBrowser.Controller/Entities/Person.cs index 5c92c019b..f5570448d 100644 --- a/MediaBrowser.Controller/Entities/Person.cs +++ b/MediaBrowser.Controller/Entities/Person.cs @@ -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> diff --git a/MediaBrowser.Controller/Entities/Studio.cs b/MediaBrowser.Controller/Entities/Studio.cs index a255849e6..06511d959 100644 --- a/MediaBrowser.Controller/Entities/Studio.cs +++ b/MediaBrowser.Controller/Entities/Studio.cs @@ -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; + } } } diff --git a/MediaBrowser.Controller/Entities/TV/Episode.cs b/MediaBrowser.Controller/Entities/TV/Episode.cs index 7588e4e69..dd1434cea 100644 --- a/MediaBrowser.Controller/Entities/TV/Episode.cs +++ b/MediaBrowser.Controller/Entities/TV/Episode.cs @@ -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> diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs index 2f2bee172..2f3f7387c 100644 --- a/MediaBrowser.Controller/Entities/TV/Season.cs +++ b/MediaBrowser.Controller/Entities/TV/Season.cs @@ -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> diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs index 8a56e45cd..15b97f694 100644 --- a/MediaBrowser.Controller/Entities/TV/Series.cs +++ b/MediaBrowser.Controller/Entities/TV/Series.cs @@ -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 diff --git a/MediaBrowser.Controller/Entities/Year.cs b/MediaBrowser.Controller/Entities/Year.cs index 9150057c8..1e4e6cb06 100644 --- a/MediaBrowser.Controller/Entities/Year.cs +++ b/MediaBrowser.Controller/Entities/Year.cs @@ -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; + } } } diff --git a/MediaBrowser.Controller/Library/IUserManager.cs b/MediaBrowser.Controller/Library/IUserManager.cs index ad46cf7c3..0fad1d05d 100644 --- a/MediaBrowser.Controller/Library/IUserManager.cs +++ b/MediaBrowser.Controller/Library/IUserManager.cs @@ -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); } } diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index 558a9d8e3..71245a3bb 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -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" /> diff --git a/MediaBrowser.Controller/Persistence/IUserDataRepository.cs b/MediaBrowser.Controller/Persistence/IUserDataRepository.cs index 592206faf..1b4efc58b 100644 --- a/MediaBrowser.Controller/Persistence/IUserDataRepository.cs +++ b/MediaBrowser.Controller/Persistence/IUserDataRepository.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); } } diff --git a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs index aaf3fe6bf..3f71e398a 100644 --- a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs +++ b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs @@ -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) { diff --git a/MediaBrowser.Controller/Providers/BaseProviderInfo.cs b/MediaBrowser.Controller/Providers/BaseProviderInfo.cs index 877ba5c4b..5a72491c1 100644 --- a/MediaBrowser.Controller/Providers/BaseProviderInfo.cs +++ b/MediaBrowser.Controller/Providers/BaseProviderInfo.cs @@ -8,11 +8,6 @@ namespace MediaBrowser.Controller.Providers 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> /// <value>The last refreshed.</value> @@ -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> diff --git a/MediaBrowser.Controller/Providers/Movies/FanArtMovieProvider.cs b/MediaBrowser.Controller/Providers/Movies/FanArtMovieProvider.cs index 3152ceac9..94fe38680 100644 --- a/MediaBrowser.Controller/Providers/Movies/FanArtMovieProvider.cs +++ b/MediaBrowser.Controller/Providers/Movies/FanArtMovieProvider.cs @@ -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)); diff --git a/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs b/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs index fb8370248..8e20f0fad 100644 --- a/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs +++ b/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs @@ -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; } diff --git a/MediaBrowser.Controller/Providers/Music/FanArtAlbumProvider.cs b/MediaBrowser.Controller/Providers/Music/FanArtAlbumProvider.cs index b53384841..72169f245 100644 --- a/MediaBrowser.Controller/Providers/Music/FanArtAlbumProvider.cs +++ b/MediaBrowser.Controller/Providers/Music/FanArtAlbumProvider.cs @@ -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; + + } } } diff --git a/MediaBrowser.Controller/Providers/Music/FanArtArtistProvider.cs b/MediaBrowser.Controller/Providers/Music/FanArtArtistProvider.cs index ec7a96d99..1dd5c7cd2 100644 --- a/MediaBrowser.Controller/Providers/Music/FanArtArtistProvider.cs +++ b/MediaBrowser.Controller/Providers/Music/FanArtArtistProvider.cs @@ -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(); diff --git a/MediaBrowser.Controller/Providers/Music/LastfmBaseProvider.cs b/MediaBrowser.Controller/Providers/Music/LastfmBaseProvider.cs index f58bd3bb7..f7e0eef48 100644 --- a/MediaBrowser.Controller/Providers/Music/LastfmBaseProvider.cs +++ b/MediaBrowser.Controller/Providers/Music/LastfmBaseProvider.cs @@ -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 diff --git a/MediaBrowser.Controller/Providers/TV/FanArtTVProvider.cs b/MediaBrowser.Controller/Providers/TV/FanArtTVProvider.cs index 4d06143fc..a7fc4586f 100644 --- a/MediaBrowser.Controller/Providers/TV/FanArtTVProvider.cs +++ b/MediaBrowser.Controller/Providers/TV/FanArtTVProvider.cs @@ -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)); diff --git a/MediaBrowser.Controller/Sorting/IUserBaseItemComparer.cs b/MediaBrowser.Controller/Sorting/IUserBaseItemComparer.cs index 76d84a653..d464a64a0 100644 --- a/MediaBrowser.Controller/Sorting/IUserBaseItemComparer.cs +++ b/MediaBrowser.Controller/Sorting/IUserBaseItemComparer.cs @@ -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; } } } |
