diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-06-29 23:04:50 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-06-29 23:04:50 -0400 |
| commit | 3d47b495a96fce84c03d9f3177dc6dbc8a4afa3c (patch) | |
| tree | 9d03bc06b30fec5695bb7a89094387ecbdd8e3e9 /MediaBrowser.LocalMetadata/BaseXmlProvider.cs | |
| parent | 1a5a75854bd3ec4cdd771c9afdaefe0acb62c03c (diff) | |
fixes #795 - Support reading Xbmc nfo's
Diffstat (limited to 'MediaBrowser.LocalMetadata/BaseXmlProvider.cs')
| -rw-r--r-- | MediaBrowser.LocalMetadata/BaseXmlProvider.cs | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/MediaBrowser.LocalMetadata/BaseXmlProvider.cs b/MediaBrowser.LocalMetadata/BaseXmlProvider.cs new file mode 100644 index 000000000..cc9bc7bed --- /dev/null +++ b/MediaBrowser.LocalMetadata/BaseXmlProvider.cs @@ -0,0 +1,89 @@ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Logging; + +namespace MediaBrowser.LocalMetadata +{ + public abstract class BaseXmlProvider<T> : ILocalMetadataProvider<T>, IHasChangeMonitor + where T : IHasMetadata, new() + { + protected IFileSystem FileSystem; + + public async Task<LocalMetadataResult<T>> GetMetadata(ItemInfo info, CancellationToken cancellationToken) + { + var result = new LocalMetadataResult<T>(); + + var file = GetXmlFile(info, new DirectoryService(new NullLogger())); + + if (file == null) + { + return result; + } + + var path = file.FullName; + + await XmlProviderUtils.XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false); + + try + { + result.Item = new T(); + + Fetch(result, path, cancellationToken); + result.HasMetadata = true; + } + catch (FileNotFoundException) + { + result.HasMetadata = false; + } + catch (DirectoryNotFoundException) + { + result.HasMetadata = false; + } + finally + { + XmlProviderUtils.XmlParsingResourcePool.Release(); + } + + return result; + } + + protected abstract void Fetch(LocalMetadataResult<T> result, string path, CancellationToken cancellationToken); + + protected BaseXmlProvider(IFileSystem fileSystem) + { + FileSystem = fileSystem; + } + + protected abstract FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService); + + public bool HasChanged(IHasMetadata item, IDirectoryService directoryService, DateTime date) + { + var file = GetXmlFile(new ItemInfo { IsInMixedFolder = item.IsInMixedFolder, Path = item.Path }, directoryService); + + if (file == null) + { + return false; + } + + return file.Exists && FileSystem.GetLastWriteTimeUtc(file) > date; + } + + public string Name + { + get + { + return "Media Browser Xml"; + } + } + } + + static class XmlProviderUtils + { + internal static readonly SemaphoreSlim XmlParsingResourcePool = new SemaphoreSlim(4, 4); + } +} |
