| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 | using MediaBrowser.Common.IO;using MediaBrowser.Controller.Entities;using MediaBrowser.Controller.Providers;using System;using System.IO;using System.Threading;using System.Threading.Tasks;namespace MediaBrowser.LocalMetadata{    public abstract class BaseXmlProvider<T> : ILocalMetadataProvider<T>, IHasChangeMonitor, IHasOrder        where T : IHasMetadata, new()    {        protected IFileSystem FileSystem;        public async Task<MetadataResult<T>> GetMetadata(ItemInfo info,            IDirectoryService directoryService,            CancellationToken cancellationToken)        {            var result = new MetadataResult<T>();            var file = GetXmlFile(info, directoryService);            if (file == null)            {                return result;            }            var path = file.FullName;            try            {                result.Item = new T();                Fetch(result, path, cancellationToken);                result.HasMetadata = true;            }            catch (FileNotFoundException)            {                result.HasMetadata = false;            }            catch (DirectoryNotFoundException)            {                result.HasMetadata = false;            }            return result;        }        protected abstract void Fetch(MetadataResult<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(item), directoryService);            if (file == null)            {                return false;            }            return file.Exists && FileSystem.GetLastWriteTimeUtc(file) > date;        }        public string Name        {            get            {                return XmlProviderUtils.Name;            }        }        public int Order        {            get            {                // After Nfo                return 1;            }        }    }    static class XmlProviderUtils    {        public static string Name        {            get            {                return "Emby Xml";            }        }                internal static readonly SemaphoreSlim XmlParsingResourcePool = new SemaphoreSlim(4, 4);    }}
 |