BaseNfoProvider.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using MediaBrowser.Common.IO;
  2. using MediaBrowser.Controller.Entities;
  3. using MediaBrowser.Controller.Providers;
  4. using MediaBrowser.XbmcMetadata.Savers;
  5. using System;
  6. using System.IO;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. namespace MediaBrowser.XbmcMetadata.Providers
  10. {
  11. public abstract class BaseNfoProvider<T> : ILocalMetadataProvider<T>, IHasChangeMonitor
  12. where T : IHasMetadata, new()
  13. {
  14. protected IFileSystem FileSystem;
  15. public async Task<MetadataResult<T>> GetMetadata(ItemInfo info,
  16. IDirectoryService directoryService,
  17. CancellationToken cancellationToken)
  18. {
  19. var result = new MetadataResult<T>();
  20. var file = GetXmlFile(info, directoryService);
  21. if (file == null)
  22. {
  23. return result;
  24. }
  25. var path = file.FullName;
  26. try
  27. {
  28. result.Item = new T();
  29. Fetch(result, path, cancellationToken);
  30. result.HasMetadata = true;
  31. }
  32. catch (FileNotFoundException)
  33. {
  34. result.HasMetadata = false;
  35. }
  36. catch (DirectoryNotFoundException)
  37. {
  38. result.HasMetadata = false;
  39. }
  40. return result;
  41. }
  42. protected abstract void Fetch(MetadataResult<T> result, string path, CancellationToken cancellationToken);
  43. protected BaseNfoProvider(IFileSystem fileSystem)
  44. {
  45. FileSystem = fileSystem;
  46. }
  47. protected abstract FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService);
  48. public bool HasChanged(IHasMetadata item, IDirectoryService directoryService, DateTime date)
  49. {
  50. var file = GetXmlFile(new ItemInfo(item), directoryService);
  51. if (file == null)
  52. {
  53. return false;
  54. }
  55. return file.Exists && FileSystem.GetLastWriteTimeUtc(file) > date;
  56. }
  57. public string Name
  58. {
  59. get
  60. {
  61. return BaseNfoSaver.SaverName;
  62. }
  63. }
  64. }
  65. static class XmlProviderUtils
  66. {
  67. internal static readonly SemaphoreSlim XmlParsingResourcePool = new SemaphoreSlim(4, 4);
  68. }
  69. }