aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Providers
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2015-03-14 00:50:23 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2015-03-14 00:50:23 -0400
commitdbb7fd61ff0545f8ebf7b9ece432f1408d43040c (patch)
tree68d1c42e2bcd4a4be0398c8f4c0f1ba88d42e56e /MediaBrowser.Providers
parent7c99b0a14a276fbf604c5ce2ce4e392222523f43 (diff)
add dynamic images
Diffstat (limited to 'MediaBrowser.Providers')
-rw-r--r--MediaBrowser.Providers/FolderImages/DefaultImageProvider.cs10
-rw-r--r--MediaBrowser.Providers/Manager/ProviderManager.cs82
2 files changed, 85 insertions, 7 deletions
diff --git a/MediaBrowser.Providers/FolderImages/DefaultImageProvider.cs b/MediaBrowser.Providers/FolderImages/DefaultImageProvider.cs
index 9e1cfdd069..73a1de8898 100644
--- a/MediaBrowser.Providers/FolderImages/DefaultImageProvider.cs
+++ b/MediaBrowser.Providers/FolderImages/DefaultImageProvider.cs
@@ -36,16 +36,16 @@ namespace MediaBrowser.Providers.FolderImages
if (view != null)
{
- return GetImages(view.ViewType, view.UserId.HasValue, cancellationToken);
+ return GetImages(view.ViewType, view.ParentId != Guid.Empty, cancellationToken);
}
var folder = (ICollectionFolder)item;
return GetImages(folder.CollectionType, false, cancellationToken);
}
- private Task<IEnumerable<RemoteImageInfo>> GetImages(string viewType, bool isUserSpecificView, CancellationToken cancellationToken)
+ private Task<IEnumerable<RemoteImageInfo>> GetImages(string viewType, bool isSubView, CancellationToken cancellationToken)
{
- var url = GetImageUrl(viewType, isUserSpecificView);
+ var url = GetImageUrl(viewType, isSubView);
var list = new List<RemoteImageInfo>();
if (!string.IsNullOrWhiteSpace(url))
@@ -71,7 +71,7 @@ namespace MediaBrowser.Providers.FolderImages
return Task.FromResult<IEnumerable<RemoteImageInfo>>(list);
}
- private string GetImageUrl(string viewType, bool isUserSpecificView)
+ private string GetImageUrl(string viewType, bool isSubView)
{
const string urlPrefix = "https://raw.githubusercontent.com/MediaBrowser/MediaBrowser.Resources/master/images/folders/";
@@ -108,7 +108,7 @@ namespace MediaBrowser.Providers.FolderImages
return urlPrefix + "movies.png";
}
- if (isUserSpecificView)
+ if (isSubView)
{
return null;
}
diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs
index 55a4549778..392fcd5ae8 100644
--- a/MediaBrowser.Providers/Manager/ProviderManager.cs
+++ b/MediaBrowser.Providers/Manager/ProviderManager.cs
@@ -26,7 +26,7 @@ namespace MediaBrowser.Providers.Manager
/// <summary>
/// Class ProviderManager
/// </summary>
- public class ProviderManager : IProviderManager
+ public class ProviderManager : IProviderManager, IDisposable
{
/// <summary>
/// The _logger
@@ -63,6 +63,8 @@ namespace MediaBrowser.Providers.Manager
private IExternalId[] _externalIds;
+ private readonly Func<ILibraryManager> _libraryManagerFactory;
+
/// <summary>
/// Initializes a new instance of the <see cref="ProviderManager" /> class.
/// </summary>
@@ -71,7 +73,7 @@ namespace MediaBrowser.Providers.Manager
/// <param name="libraryMonitor">The directory watchers.</param>
/// <param name="logManager">The log manager.</param>
/// <param name="fileSystem">The file system.</param>
- public ProviderManager(IHttpClient httpClient, IServerConfigurationManager configurationManager, ILibraryMonitor libraryMonitor, ILogManager logManager, IFileSystem fileSystem, IServerApplicationPaths appPaths)
+ public ProviderManager(IHttpClient httpClient, IServerConfigurationManager configurationManager, ILibraryMonitor libraryMonitor, ILogManager logManager, IFileSystem fileSystem, IServerApplicationPaths appPaths, Func<ILibraryManager> libraryManagerFactory)
{
_logger = logManager.GetLogger("ProviderManager");
_httpClient = httpClient;
@@ -79,6 +81,7 @@ namespace MediaBrowser.Providers.Manager
_libraryMonitor = libraryMonitor;
_fileSystem = fileSystem;
_appPaths = appPaths;
+ _libraryManagerFactory = libraryManagerFactory;
}
/// <summary>
@@ -841,5 +844,80 @@ namespace MediaBrowser.Providers.Manager
});
}
+
+ private readonly ConcurrentQueue<Tuple<Guid, MetadataRefreshOptions>> _refreshQueue =
+ new ConcurrentQueue<Tuple<Guid, MetadataRefreshOptions>>();
+
+ private readonly object _refreshTimerLock = new object();
+ private Timer _refreshTimer;
+
+ public void QueueRefresh(Guid id, MetadataRefreshOptions options)
+ {
+ if (_disposed)
+ {
+ return;
+ }
+
+ _refreshQueue.Enqueue(new Tuple<Guid, MetadataRefreshOptions>(id, options));
+ StartRefreshTimer();
+ }
+
+ private void StartRefreshTimer()
+ {
+ lock (_refreshTimerLock)
+ {
+ if (_refreshTimer == null)
+ {
+ _refreshTimer = new Timer(RefreshTimerCallback, null, 100, Timeout.Infinite);
+ }
+ }
+ }
+
+ private void StopRefreshTimer()
+ {
+ lock (_refreshTimerLock)
+ {
+ if (_refreshTimer != null)
+ {
+ _refreshTimer.Dispose();
+ _refreshTimer = null;
+ }
+ }
+ }
+
+ private async void RefreshTimerCallback(object state)
+ {
+ Tuple<Guid, MetadataRefreshOptions> refreshItem;
+ var libraryManager = _libraryManagerFactory();
+
+ while (_refreshQueue.TryDequeue(out refreshItem))
+ {
+ if (_disposed)
+ {
+ return;
+ }
+
+ try
+ {
+ var item = libraryManager.GetItemById(refreshItem.Item1);
+ if (item != null)
+ {
+ await item.RefreshMetadata(refreshItem.Item2, CancellationToken.None).ConfigureAwait(false);
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error refreshing item", ex);
+ }
+ }
+
+ StopRefreshTimer();
+ }
+
+ private bool _disposed;
+ public void Dispose()
+ {
+ _disposed = true;
+ }
}
} \ No newline at end of file