FFProbeProvider.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. using MediaBrowser.Common.Configuration;
  2. using MediaBrowser.Controller.Entities;
  3. using MediaBrowser.Controller.Entities.Audio;
  4. using MediaBrowser.Controller.Entities.Movies;
  5. using MediaBrowser.Controller.Entities.TV;
  6. using MediaBrowser.Controller.Library;
  7. using MediaBrowser.Controller.LiveTv;
  8. using MediaBrowser.Controller.Localization;
  9. using MediaBrowser.Controller.MediaInfo;
  10. using MediaBrowser.Controller.Persistence;
  11. using MediaBrowser.Controller.Providers;
  12. using MediaBrowser.Model.Entities;
  13. using MediaBrowser.Model.IO;
  14. using MediaBrowser.Model.Logging;
  15. using MediaBrowser.Model.MediaInfo;
  16. using System;
  17. using System.Threading;
  18. using System.Threading.Tasks;
  19. using MediaBrowser.Model.Serialization;
  20. namespace MediaBrowser.Providers.MediaInfo
  21. {
  22. public class FFProbeProvider : ICustomMetadataProvider<Episode>,
  23. ICustomMetadataProvider<MusicVideo>,
  24. ICustomMetadataProvider<Movie>,
  25. ICustomMetadataProvider<AdultVideo>,
  26. ICustomMetadataProvider<LiveTvVideoRecording>,
  27. ICustomMetadataProvider<LiveTvAudioRecording>,
  28. ICustomMetadataProvider<Trailer>,
  29. ICustomMetadataProvider<Video>,
  30. ICustomMetadataProvider<Audio>,
  31. IHasChangeMonitor,
  32. IHasOrder
  33. {
  34. private readonly ILogger _logger;
  35. private readonly IIsoManager _isoManager;
  36. private readonly IMediaEncoder _mediaEncoder;
  37. private readonly IItemRepository _itemRepo;
  38. private readonly IBlurayExaminer _blurayExaminer;
  39. private readonly ILocalizationManager _localization;
  40. private readonly IApplicationPaths _appPaths;
  41. private readonly IJsonSerializer _json;
  42. public string Name
  43. {
  44. get { return "ffprobe"; }
  45. }
  46. public Task<ItemUpdateType> FetchAsync(Episode item, CancellationToken cancellationToken)
  47. {
  48. return FetchVideoInfo(item, cancellationToken);
  49. }
  50. public Task<ItemUpdateType> FetchAsync(MusicVideo item, CancellationToken cancellationToken)
  51. {
  52. return FetchVideoInfo(item, cancellationToken);
  53. }
  54. public Task<ItemUpdateType> FetchAsync(Movie item, CancellationToken cancellationToken)
  55. {
  56. return FetchVideoInfo(item, cancellationToken);
  57. }
  58. public Task<ItemUpdateType> FetchAsync(AdultVideo item, CancellationToken cancellationToken)
  59. {
  60. return FetchVideoInfo(item, cancellationToken);
  61. }
  62. public Task<ItemUpdateType> FetchAsync(LiveTvVideoRecording item, CancellationToken cancellationToken)
  63. {
  64. return FetchVideoInfo(item, cancellationToken);
  65. }
  66. public Task<ItemUpdateType> FetchAsync(Trailer item, CancellationToken cancellationToken)
  67. {
  68. return FetchVideoInfo(item, cancellationToken);
  69. }
  70. public Task<ItemUpdateType> FetchAsync(Video item, CancellationToken cancellationToken)
  71. {
  72. return FetchVideoInfo(item, cancellationToken);
  73. }
  74. public Task<ItemUpdateType> FetchAsync(Audio item, CancellationToken cancellationToken)
  75. {
  76. return FetchAudioInfo(item, cancellationToken);
  77. }
  78. public Task<ItemUpdateType> FetchAsync(LiveTvAudioRecording item, CancellationToken cancellationToken)
  79. {
  80. return FetchAudioInfo(item, cancellationToken);
  81. }
  82. public FFProbeProvider(ILogger logger, IIsoManager isoManager, IMediaEncoder mediaEncoder, IItemRepository itemRepo, IBlurayExaminer blurayExaminer, ILocalizationManager localization, IApplicationPaths appPaths, IJsonSerializer json)
  83. {
  84. _logger = logger;
  85. _isoManager = isoManager;
  86. _mediaEncoder = mediaEncoder;
  87. _itemRepo = itemRepo;
  88. _blurayExaminer = blurayExaminer;
  89. _localization = localization;
  90. _appPaths = appPaths;
  91. _json = json;
  92. }
  93. private readonly Task<ItemUpdateType> _cachedTask = Task.FromResult(ItemUpdateType.Unspecified);
  94. public Task<ItemUpdateType> FetchVideoInfo<T>(T item, CancellationToken cancellationToken)
  95. where T : Video
  96. {
  97. if (item.LocationType != LocationType.FileSystem)
  98. {
  99. return _cachedTask;
  100. }
  101. if (item.VideoType == VideoType.Iso && !_isoManager.CanMount(item.Path))
  102. {
  103. return _cachedTask;
  104. }
  105. if (item.VideoType == VideoType.HdDvd)
  106. {
  107. return _cachedTask;
  108. }
  109. var prober = new FFProbeVideoInfo(_logger, _isoManager, _mediaEncoder, _itemRepo, _blurayExaminer, _localization, _appPaths, _json);
  110. return prober.ProbeVideo(item, cancellationToken);
  111. }
  112. public Task<ItemUpdateType> FetchAudioInfo<T>(T item, CancellationToken cancellationToken)
  113. where T : Audio
  114. {
  115. if (item.LocationType != LocationType.FileSystem)
  116. {
  117. return _cachedTask;
  118. }
  119. var prober = new FFProbeAudioInfo(_mediaEncoder, _itemRepo, _appPaths, _json);
  120. return prober.Probe(item, cancellationToken);
  121. }
  122. public bool HasChanged(IHasMetadata item, DateTime date)
  123. {
  124. return item.DateModified > date;
  125. }
  126. public int Order
  127. {
  128. get
  129. {
  130. // Run last
  131. return 100;
  132. }
  133. }
  134. }
  135. }