using MediaBrowser.Common.IO ;
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 ; }
private readonly IFileSystem _fileSystem ;
public GameSystemProviderFromXml ( ILogManager logManager , IServerConfigurationManager configurationManager , IFileSystem fileSystem )
: base ( logManager , configurationManager )
{
_fileSystem = fileSystem ;
Current = this ;
}
/// <summary>
/// Supportses the specified item.
/// </summary>
/// <param name="item">The item.</param>
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
public override bool Supports ( BaseItem item )
{
return item is GameSystem & & item . LocationType = = LocationType . FileSystem ;
}
/// <summary>
/// Gets the priority.
/// </summary>
/// <value>The priority.</value>
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 ) > providerInfo . LastRefreshed ;
}
/// <summary>
/// Fetches metadata and returns true or false indicating if any work that requires persistence was done
/// </summary>
/// <param name="item">The item.</param>
/// <param name="force">if set to <c>true</c> [force].</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task{System.Boolean}.</returns>
public override Task < bool > FetchAsync ( BaseItem item , bool force , CancellationToken cancellationToken )
{
return Fetch ( item , cancellationToken ) ;
}
/// <summary>
/// Fetches the specified item.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
private async Task < bool > 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 < GameSystem > ( Logger ) . Fetch ( ( GameSystem ) item , path , cancellationToken ) ;
}
finally
{
XmlParsingResourcePool . Release ( ) ;
}
SetLastRefreshed ( item , DateTime . UtcNow ) ;
return true ;
}
return false ;
}
}
}