BaseXmlProvider.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. namespace MediaBrowser.LocalMetadata
  9. {
  10. public abstract class BaseXmlProvider<T> : ILocalMetadataProvider<T>, IHasChangeMonitor
  11. where T : IHasMetadata, new()
  12. {
  13. protected IFileSystem FileSystem;
  14. public async Task<LocalMetadataResult<T>> GetMetadata(ItemInfo info,
  15. IDirectoryService directoryService,
  16. CancellationToken cancellationToken)
  17. {
  18. var result = new LocalMetadataResult<T>();
  19. var file = GetXmlFile(info, directoryService);
  20. if (file == null)
  21. {
  22. return result;
  23. }
  24. var path = file.FullName;
  25. //await XmlProviderUtils.XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
  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. finally
  41. {
  42. //XmlProviderUtils.XmlParsingResourcePool.Release();
  43. }
  44. return result;
  45. }
  46. protected abstract void Fetch(LocalMetadataResult<T> result, string path, CancellationToken cancellationToken);
  47. protected BaseXmlProvider(IFileSystem fileSystem)
  48. {
  49. FileSystem = fileSystem;
  50. }
  51. protected abstract FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService);
  52. public bool HasChanged(IHasMetadata item, IDirectoryService directoryService, DateTime date)
  53. {
  54. var file = GetXmlFile(new ItemInfo { IsInMixedFolder = item.IsInMixedFolder, Path = item.Path }, directoryService);
  55. if (file == null)
  56. {
  57. return false;
  58. }
  59. return file.Exists && FileSystem.GetLastWriteTimeUtc(file) > date;
  60. }
  61. public string Name
  62. {
  63. get
  64. {
  65. return "Media Browser Xml";
  66. }
  67. }
  68. }
  69. static class XmlProviderUtils
  70. {
  71. internal static readonly SemaphoreSlim XmlParsingResourcePool = new SemaphoreSlim(4, 4);
  72. }
  73. }