using MediaBrowser.Controller.Entities; using MediaBrowser.Model.Entities; using System; using System.ComponentModel.Composition; using System.IO; using System.Threading; using System.Threading.Tasks; namespace MediaBrowser.Controller.Providers { /// /// Provides metadata for Folders and all subclasses by parsing folder.xml /// [Export(typeof(BaseMetadataProvider))] public class FolderProviderFromXml : BaseMetadataProvider { /// /// Supportses the specified item. /// /// The item. /// true if XXXX, false otherwise public override bool Supports(BaseItem item) { return item is Folder && item.LocationType == LocationType.FileSystem; } /// /// Gets the priority. /// /// The priority. public override MetadataProviderPriority Priority { get { return MetadataProviderPriority.First; } } /// /// Override this to return the date that should be compared to the last refresh date /// to determine if this provider should be re-fetched. /// /// The item. /// DateTime. protected override DateTime CompareDate(BaseItem item) { var entry = item.MetaLocation != null ? item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "folder.xml")) : null; return entry != null ? entry.Value.LastWriteTimeUtc : DateTime.MinValue; } /// /// Fetches metadata and returns true or false indicating if any work that requires persistence was done /// /// The item. /// if set to true [force]. /// The cancellation token. /// Task{System.Boolean}. protected override Task FetchAsyncInternal(BaseItem item, bool force, CancellationToken cancellationToken) { return Task.Run(() => Fetch(item, cancellationToken)); } /// /// Fetches the specified item. /// /// The item. /// The cancellation token. /// true if XXXX, false otherwise private bool Fetch(BaseItem item, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "folder.xml")); if (metadataFile.HasValue) { var path = metadataFile.Value.Path; new BaseItemXmlParser(Logger).Fetch((Folder)item, path, cancellationToken); SetLastRefreshed(item, DateTime.UtcNow); return true; } return false; } } }