BaseNfoProvider.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #pragma warning disable CS1591
  2. using System.IO;
  3. using System.Threading;
  4. using System.Threading.Tasks;
  5. using MediaBrowser.Controller.Entities;
  6. using MediaBrowser.Controller.Providers;
  7. using MediaBrowser.Model.IO;
  8. using MediaBrowser.XbmcMetadata.Savers;
  9. namespace MediaBrowser.XbmcMetadata.Providers
  10. {
  11. public abstract class BaseNfoProvider<T> : ILocalMetadataProvider<T>, IHasItemChangeMonitor
  12. where T : BaseItem, new()
  13. {
  14. private readonly IFileSystem _fileSystem;
  15. protected BaseNfoProvider(IFileSystem fileSystem)
  16. {
  17. _fileSystem = fileSystem;
  18. }
  19. /// <inheritdoc />
  20. public string Name => BaseNfoSaver.SaverName;
  21. /// <inheritdoc />
  22. public Task<MetadataResult<T>> GetMetadata(
  23. ItemInfo info,
  24. IDirectoryService directoryService,
  25. CancellationToken cancellationToken)
  26. {
  27. var result = new MetadataResult<T>();
  28. var file = GetXmlFile(info, directoryService);
  29. if (file is null)
  30. {
  31. return Task.FromResult(result);
  32. }
  33. var path = file.FullName;
  34. try
  35. {
  36. result.Item = new T
  37. {
  38. IndexNumber = info.IndexNumber
  39. };
  40. Fetch(result, path, cancellationToken);
  41. result.HasMetadata = true;
  42. }
  43. catch (FileNotFoundException)
  44. {
  45. result.HasMetadata = false;
  46. }
  47. catch (IOException)
  48. {
  49. result.HasMetadata = false;
  50. }
  51. return Task.FromResult(result);
  52. }
  53. /// <inheritdoc />
  54. public bool HasChanged(BaseItem item, IDirectoryService directoryService)
  55. {
  56. var file = GetXmlFile(new ItemInfo(item), directoryService);
  57. if (file is null)
  58. {
  59. return false;
  60. }
  61. return file.Exists && _fileSystem.GetLastWriteTimeUtc(file) > item.DateLastSaved;
  62. }
  63. protected abstract void Fetch(MetadataResult<T> result, string path, CancellationToken cancellationToken);
  64. protected abstract FileSystemMetadata? GetXmlFile(ItemInfo info, IDirectoryService directoryService);
  65. }
  66. }