BaseNfoProvider.cs 2.3 KB

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