BaseXmlProvider.cs 2.5 KB

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