BaseXmlProvider.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. using MediaBrowser.Common.IO;
  2. using MediaBrowser.Controller.Entities;
  3. using MediaBrowser.Controller.Providers;
  4. using System;
  5. using System.IO;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. using CommonIO;
  9. namespace MediaBrowser.LocalMetadata
  10. {
  11. public abstract class BaseXmlProvider<T> : ILocalMetadataProvider<T>, IHasChangeMonitor, IHasOrder
  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 BaseXmlProvider(IFileSystem fileSystem)
  44. {
  45. FileSystem = fileSystem;
  46. }
  47. protected abstract FileSystemMetadata 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 XmlProviderUtils.Name;
  62. }
  63. }
  64. public int Order
  65. {
  66. get
  67. {
  68. // After Nfo
  69. return 1;
  70. }
  71. }
  72. }
  73. static class XmlProviderUtils
  74. {
  75. public static string Name
  76. {
  77. get
  78. {
  79. return "Emby Xml";
  80. }
  81. }
  82. internal static readonly SemaphoreSlim XmlParsingResourcePool = new SemaphoreSlim(4, 4);
  83. }
  84. }