using System.IO; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.IO; namespace MediaBrowser.LocalMetadata { /// /// The BaseXmlProvider. /// /// Type of provider. public abstract class BaseXmlProvider : ILocalMetadataProvider, IHasItemChangeMonitor, IHasOrder where T : BaseItem, new() { /// /// Initializes a new instance of the class. /// /// Instance of the interface. protected BaseXmlProvider(IFileSystem fileSystem) { this.FileSystem = fileSystem; } /// public string Name => XmlProviderUtils.Name; /// After Nfo /// public virtual int Order => 1; /// /// Gets the IFileSystem. /// protected IFileSystem FileSystem { get; } /// /// Gets metadata for item. /// /// The item info. /// Instance of the interface. /// The cancellation token. /// The metadata for item. public Task> GetMetadata( ItemInfo info, IDirectoryService directoryService, CancellationToken cancellationToken) { var result = new MetadataResult(); var file = GetXmlFile(info, directoryService); if (file is null) { return Task.FromResult(result); } var path = file.FullName; try { result.Item = new T(); Fetch(result, path, cancellationToken); result.HasMetadata = true; } catch (FileNotFoundException) { result.HasMetadata = false; } catch (IOException) { result.HasMetadata = false; } return Task.FromResult(result); } /// /// Get metadata from path. /// /// Resulting metadata. /// The path. /// The cancellation token. protected abstract void Fetch(MetadataResult result, string path, CancellationToken cancellationToken); /// /// Get metadata from xml file. /// /// Item inf. /// Instance of the interface. /// The file system metadata. protected abstract FileSystemMetadata? GetXmlFile(ItemInfo info, IDirectoryService directoryService); /// public bool HasChanged(BaseItem item, IDirectoryService directoryService) { var file = GetXmlFile(new ItemInfo(item), directoryService); if (file is null) { return false; } return file.Exists && FileSystem.GetLastWriteTimeUtc(file) > item.DateLastSaved; } } }