aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2013-04-05 00:13:41 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2013-04-05 00:13:41 -0400
commit5ba769f3b41283efb8e7fb3a2407aafe0d6541d4 (patch)
treef254e0cdfb02356132aab74232831b2c174341af /MediaBrowser.Server.Implementations
parent0bc542b19135dc29d23f89e4b067bc4fda81c3d2 (diff)
#79 - Music Image Extraction
Diffstat (limited to 'MediaBrowser.Server.Implementations')
-rw-r--r--MediaBrowser.Server.Implementations/Library/LibraryManager.cs36
-rw-r--r--MediaBrowser.Server.Implementations/Providers/ProviderManager.cs20
2 files changed, 42 insertions, 14 deletions
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index a57eb8eaa..9bc47a025 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -126,6 +126,9 @@ namespace MediaBrowser.Server.Implementations.Library
}
}
+ private ConcurrentDictionary<string, UserRootFolder> _userRootFolders =
+ new ConcurrentDictionary<string, UserRootFolder>();
+
/// <summary>
/// Initializes a new instance of the <see cref="LibraryManager" /> class.
/// </summary>
@@ -485,6 +488,16 @@ namespace MediaBrowser.Server.Implementations.Library
}
/// <summary>
+ /// Gets the user root folder.
+ /// </summary>
+ /// <param name="userRootPath">The user root path.</param>
+ /// <returns>UserRootFolder.</returns>
+ public UserRootFolder GetUserRootFolder(string userRootPath)
+ {
+ return _userRootFolders.GetOrAdd(userRootPath, key => Kernel.ItemRepository.RetrieveItem(userRootPath.GetMBId(typeof(UserRootFolder))) as UserRootFolder ?? (UserRootFolder)ResolvePath(userRootPath));
+ }
+
+ /// <summary>
/// Gets a Person
/// </summary>
/// <param name="name">The name.</param>
@@ -739,15 +752,32 @@ namespace MediaBrowser.Server.Implementations.Library
// Start by just validating the children of the root, but go no further
await RootFolder.ValidateChildren(new Progress<double> { }, cancellationToken, recursive: false);
- // Validate only the collection folders for each user, just to make them available as quickly as possible
- var userCollectionFolderTasks = _userManager.Users.AsParallel().Select(user => user.ValidateCollectionFolders(new Progress<double> { }, cancellationToken));
- await Task.WhenAll(userCollectionFolderTasks).ConfigureAwait(false);
+ foreach (var folder in _userManager.Users.Select(u => u.RootFolder).Distinct())
+ {
+ await ValidateCollectionFolders(folder, cancellationToken).ConfigureAwait(false);
+ }
// Now validate the entire media library
await RootFolder.ValidateChildren(progress, cancellationToken, recursive: true).ConfigureAwait(false);
}
/// <summary>
+ /// Validates only the collection folders for a User and goes no further
+ /// </summary>
+ /// <param name="userRootFolder">The user root folder.</param>
+ /// <param name="cancellationToken">The cancellation token.</param>
+ /// <returns>Task.</returns>
+ private async Task ValidateCollectionFolders(UserRootFolder userRootFolder, CancellationToken cancellationToken)
+ {
+ _logger.Info("Validating collection folders within {0}", userRootFolder.Path);
+ await userRootFolder.RefreshMetadata(cancellationToken).ConfigureAwait(false);
+
+ cancellationToken.ThrowIfCancellationRequested();
+
+ await userRootFolder.ValidateChildren(new Progress<double> { }, cancellationToken, recursive: false).ConfigureAwait(false);
+ }
+
+ /// <summary>
/// Gets the default view.
/// </summary>
/// <returns>IEnumerable{VirtualFolderInfo}.</returns>
diff --git a/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs b/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs
index df6e06174..dced1ce28 100644
--- a/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs
+++ b/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs
@@ -136,26 +136,24 @@ namespace MediaBrowser.Server.Implementations.Providers
}
var supportedProvidersHash = string.Join("+", supportedProviders.Select(i => i.GetType().Name)).GetMD5();
- bool providersChanged;
+ bool providersChanged = false;
item.ProviderData.TryGetValue(SupportedProvidersKey, out supportedProvidersInfo);
- if (supportedProvidersInfo == null)
- {
- // First time
- supportedProvidersInfo = new BaseProviderInfo { ProviderId = SupportedProvidersKey, FileSystemStamp = supportedProvidersHash };
- providersChanged = force = true;
- }
- else
+ if (supportedProvidersInfo != null)
{
// Force refresh if the supported providers have changed
providersChanged = force = force || supportedProvidersInfo.FileSystemStamp != supportedProvidersHash;
+
+ // If providers have changed, clear provider info and update the supported providers hash
+ if (providersChanged)
+ {
+ _logger.Debug("Providers changed for {0}. Clearing and forcing refresh.", item.Name);
+ item.ProviderData.Clear();
+ }
}
- // If providers have changed, clear provider info and update the supported providers hash
if (providersChanged)
{
- _logger.Debug("Providers changed for {0}. Clearing and forcing refresh.", item.Name);
- item.ProviderData.Clear();
supportedProvidersInfo.FileSystemStamp = supportedProvidersHash;
}