using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using System; using System.IO; using System.Threading; using System.Threading.Tasks; namespace MediaBrowser.Providers.Games { public class GameSystemProviderFromXml : BaseMetadataProvider { internal static GameSystemProviderFromXml Current { get; private set; } public GameSystemProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager) : base(logManager, configurationManager) { Current = this; } /// /// Supportses the specified item. /// /// The item. /// true if XXXX, false otherwise public override bool Supports(BaseItem item) { return item is GameSystem && item.LocationType == LocationType.FileSystem; } /// /// Gets the priority. /// /// The priority. public override MetadataProviderPriority Priority { get { return MetadataProviderPriority.Second; } } private const string XmlFileName = "gamesystem.xml"; protected override bool NeedsRefreshBasedOnCompareDate(BaseItem item, BaseProviderInfo providerInfo) { var xml = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, XmlFileName)); if (xml == null) { return false; } return FileSystem.GetLastWriteTimeUtc(xml, Logger) > providerInfo.LastRefreshed; } /// /// 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}. public override Task FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken) { return Fetch(item, cancellationToken); } /// /// Fetches the specified item. /// /// The item. /// The cancellation token. /// true if XXXX, false otherwise private async Task Fetch(BaseItem item, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, XmlFileName)); if (metadataFile != null) { var path = metadataFile.FullName; await XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false); try { new BaseItemXmlParser(Logger).Fetch((GameSystem)item, path, cancellationToken); } finally { XmlParsingResourcePool.Release(); } SetLastRefreshed(item, DateTime.UtcNow); return true; } return false; } } }