aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Providers/BaseXmlProvider.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Providers/BaseXmlProvider.cs')
-rw-r--r--MediaBrowser.Providers/BaseXmlProvider.cs63
1 files changed, 56 insertions, 7 deletions
diff --git a/MediaBrowser.Providers/BaseXmlProvider.cs b/MediaBrowser.Providers/BaseXmlProvider.cs
index 68b003480..521198e96 100644
--- a/MediaBrowser.Providers/BaseXmlProvider.cs
+++ b/MediaBrowser.Providers/BaseXmlProvider.cs
@@ -3,32 +3,81 @@ using MediaBrowser.Controller.Providers;
using System;
using System.IO;
using System.Threading;
+using System.Threading.Tasks;
namespace MediaBrowser.Providers
{
- public abstract class BaseXmlProvider: IHasChangeMonitor
+ public abstract class BaseXmlProvider<T> : ILocalMetadataProvider<T>, IHasChangeMonitor
+ where T : IHasMetadata, new()
{
- protected static readonly SemaphoreSlim XmlParsingResourcePool = new SemaphoreSlim(4, 4);
-
protected IFileSystem FileSystem;
+ public async Task<MetadataResult<T>> GetMetadata(ItemInfo info, CancellationToken cancellationToken)
+ {
+ var result = new MetadataResult<T>();
+
+ var file = GetXmlFile(info);
+
+ if (file == null)
+ {
+ return result;
+ }
+
+ var path = file.FullName;
+
+ await XmlProviderUtils.XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
+
+ try
+ {
+ result.Item = new T();
+
+ Fetch(result.Item, path, cancellationToken);
+ result.HasMetadata = true;
+ }
+ catch (FileNotFoundException)
+ {
+ result.HasMetadata = false;
+ }
+ finally
+ {
+ XmlProviderUtils.XmlParsingResourcePool.Release();
+ }
+
+ return result;
+ }
+
+ protected abstract void Fetch(T item, string path, CancellationToken cancellationToken);
+
protected BaseXmlProvider(IFileSystem fileSystem)
{
FileSystem = fileSystem;
}
- protected abstract FileInfo GetXmlFile(string path);
+ protected abstract FileInfo GetXmlFile(ItemInfo info);
public bool HasChanged(IHasMetadata item, DateTime date)
{
- var file = GetXmlFile(item.Path);
+ var file = GetXmlFile(new ItemInfo { IsInMixedFolder = item.IsInMixedFolder, Path = item.Path });
+
+ if (file == null)
+ {
+ return false;
+ }
return FileSystem.GetLastWriteTimeUtc(file) > date;
}
- public bool HasLocalMetadata(IHasMetadata item)
+ public string Name
{
- return GetXmlFile(item.Path).Exists;
+ get
+ {
+ return "Media Browser Xml";
+ }
}
}
+
+ static class XmlProviderUtils
+ {
+ internal static readonly SemaphoreSlim XmlParsingResourcePool = new SemaphoreSlim(4, 4);
+ }
}