using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Model.Entities; using System; using System.IO; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Model.Logging; namespace MediaBrowser.Controller.Providers.TV { /// /// Class EpisodeProviderFromXml /// public class EpisodeProviderFromXml : BaseMetadataProvider { public EpisodeProviderFromXml(ILogManager logManager) : base(logManager) { } /// /// Supportses the specified item. /// /// The item. /// true if XXXX, false otherwise public override bool Supports(BaseItem item) { return item is Episode && item.LocationType == LocationType.FileSystem; } /// /// Gets the priority. /// /// The priority. public override MetadataProviderPriority Priority { get { return MetadataProviderPriority.First; } } protected override bool RefreshOnFileSystemStampChange { get { return true; } } /// /// 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)); } /// /// 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 metadataFile = Path.Combine(item.MetaLocation, Path.ChangeExtension(Path.GetFileName(item.Path), ".xml")); var file = item.ResolveArgs.Parent.ResolveArgs.GetMetaFileByPath(metadataFile); if (!file.HasValue) { return base.CompareDate(item); } return file.Value.LastWriteTimeUtc; } /// /// 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 = Path.Combine(item.MetaLocation, Path.ChangeExtension(Path.GetFileName(item.Path), ".xml")); var episode = (Episode)item; if (!FetchMetadata(episode, item.ResolveArgs.Parent, metadataFile, cancellationToken)) { // Don't set last refreshed if we didn't do anything return false; } SetLastRefreshed(item, DateTime.UtcNow); return true; } /// /// Fetches the metadata. /// /// The item. /// The parent. /// The metadata file. /// The cancellation token. /// true if XXXX, false otherwise private bool FetchMetadata(Episode item, Folder parent, string metadataFile, CancellationToken cancellationToken) { var file = parent.ResolveArgs.GetMetaFileByPath(metadataFile); if (!file.HasValue) { return false; } new EpisodeXmlParser(Logger).Fetch(item, metadataFile, cancellationToken); return true; } } }