aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Controller')
-rw-r--r--MediaBrowser.Controller/Dto/DtoBuilder.cs (renamed from MediaBrowser.Controller/Library/DtoBuilder.cs)72
-rw-r--r--MediaBrowser.Controller/Dto/UserDtoBuilder.cs71
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs43
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs3
-rw-r--r--MediaBrowser.Controller/Entities/Genre.cs8
-rw-r--r--MediaBrowser.Controller/Entities/Movies/Movie.cs21
-rw-r--r--MediaBrowser.Controller/Entities/Person.cs8
-rw-r--r--MediaBrowser.Controller/Entities/Studio.cs8
-rw-r--r--MediaBrowser.Controller/Entities/TV/Episode.cs26
-rw-r--r--MediaBrowser.Controller/Entities/TV/Season.cs25
-rw-r--r--MediaBrowser.Controller/Entities/TV/Series.cs17
-rw-r--r--MediaBrowser.Controller/Entities/Year.cs8
-rw-r--r--MediaBrowser.Controller/Library/IUserManager.cs19
-rw-r--r--MediaBrowser.Controller/MediaBrowser.Controller.csproj3
-rw-r--r--MediaBrowser.Controller/Persistence/IUserDataRepository.cs12
-rw-r--r--MediaBrowser.Controller/Providers/BaseMetadataProvider.cs44
-rw-r--r--MediaBrowser.Controller/Providers/BaseProviderInfo.cs12
-rw-r--r--MediaBrowser.Controller/Providers/Movies/FanArtMovieProvider.cs9
-rw-r--r--MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs18
-rw-r--r--MediaBrowser.Controller/Providers/Music/FanArtAlbumProvider.cs28
-rw-r--r--MediaBrowser.Controller/Providers/Music/FanArtArtistProvider.cs10
-rw-r--r--MediaBrowser.Controller/Providers/Music/LastfmBaseProvider.cs8
-rw-r--r--MediaBrowser.Controller/Providers/TV/FanArtTVProvider.cs10
-rw-r--r--MediaBrowser.Controller/Sorting/IUserBaseItemComparer.cs7
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; }
}
}