diff options
Diffstat (limited to 'MediaBrowser.Providers/BaseXmlProvider.cs')
| -rw-r--r-- | MediaBrowser.Providers/BaseXmlProvider.cs | 63 |
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); + } } |
