TvdbSeasonProvider.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. using MediaBrowser.Common.IO;
  2. using MediaBrowser.Controller.Configuration;
  3. using MediaBrowser.Controller.Entities;
  4. using MediaBrowser.Controller.Entities.TV;
  5. using MediaBrowser.Controller.Library;
  6. using MediaBrowser.Controller.Providers;
  7. using MediaBrowser.Model.Entities;
  8. using MediaBrowser.Model.Logging;
  9. using MediaBrowser.Model.Providers;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.IO;
  13. using System.Linq;
  14. using System.Threading;
  15. using System.Threading.Tasks;
  16. namespace MediaBrowser.Providers.TV
  17. {
  18. /// <summary>
  19. /// Class RemoteSeasonProvider
  20. /// </summary>
  21. class TvdbSeasonProvider : BaseMetadataProvider
  22. {
  23. /// <summary>
  24. /// The _provider manager
  25. /// </summary>
  26. private readonly IProviderManager _providerManager;
  27. private readonly IFileSystem _fileSystem;
  28. /// <summary>
  29. /// Initializes a new instance of the <see cref="TvdbSeasonProvider"/> class.
  30. /// </summary>
  31. /// <param name="logManager">The log manager.</param>
  32. /// <param name="configurationManager">The configuration manager.</param>
  33. /// <param name="providerManager">The provider manager.</param>
  34. /// <exception cref="System.ArgumentNullException">httpClient</exception>
  35. public TvdbSeasonProvider(ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager, IFileSystem fileSystem)
  36. : base(logManager, configurationManager)
  37. {
  38. _providerManager = providerManager;
  39. _fileSystem = fileSystem;
  40. }
  41. /// <summary>
  42. /// Supportses the specified item.
  43. /// </summary>
  44. /// <param name="item">The item.</param>
  45. /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
  46. public override bool Supports(BaseItem item)
  47. {
  48. return item is Season;
  49. }
  50. /// <summary>
  51. /// Gets the priority.
  52. /// </summary>
  53. /// <value>The priority.</value>
  54. public override MetadataProviderPriority Priority
  55. {
  56. // Run after fanart
  57. get { return MetadataProviderPriority.Fourth; }
  58. }
  59. /// <summary>
  60. /// Gets a value indicating whether [requires internet].
  61. /// </summary>
  62. /// <value><c>true</c> if [requires internet]; otherwise, <c>false</c>.</value>
  63. public override bool RequiresInternet
  64. {
  65. get
  66. {
  67. return true;
  68. }
  69. }
  70. public override ItemUpdateType ItemUpdateType
  71. {
  72. get
  73. {
  74. return ItemUpdateType.ImageUpdate;
  75. }
  76. }
  77. /// <summary>
  78. /// Gets a value indicating whether [refresh on version change].
  79. /// </summary>
  80. /// <value><c>true</c> if [refresh on version change]; otherwise, <c>false</c>.</value>
  81. protected override bool RefreshOnVersionChange
  82. {
  83. get
  84. {
  85. return true;
  86. }
  87. }
  88. /// <summary>
  89. /// Gets the provider version.
  90. /// </summary>
  91. /// <value>The provider version.</value>
  92. protected override string ProviderVersion
  93. {
  94. get
  95. {
  96. return "2";
  97. }
  98. }
  99. protected override bool NeedsRefreshBasedOnCompareDate(BaseItem item, BaseProviderInfo providerInfo)
  100. {
  101. var season = (Season)item;
  102. var seriesId = season.Series != null ? season.Series.GetProviderId(MetadataProviders.Tvdb) : null;
  103. if (!string.IsNullOrEmpty(seriesId))
  104. {
  105. // Process images
  106. var imagesXmlPath = Path.Combine(TvdbSeriesProvider.GetSeriesDataPath(ConfigurationManager.ApplicationPaths, seriesId), "banners.xml");
  107. var imagesFileInfo = new FileInfo(imagesXmlPath);
  108. if (imagesFileInfo.Exists)
  109. {
  110. return _fileSystem.GetLastWriteTimeUtc(imagesFileInfo) > providerInfo.LastRefreshed;
  111. }
  112. }
  113. return false;
  114. }
  115. protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo)
  116. {
  117. if (item.HasImage(ImageType.Primary) && item.HasImage(ImageType.Banner) && item.BackdropImagePaths.Count > 0)
  118. {
  119. return false;
  120. }
  121. return base.NeedsRefreshInternal(item, providerInfo);
  122. }
  123. /// <summary>
  124. /// Fetches metadata and returns true or false indicating if any work that requires persistence was done
  125. /// </summary>
  126. /// <param name="item">The item.</param>
  127. /// <param name="force">if set to <c>true</c> [force].</param>
  128. /// <param name="cancellationToken">The cancellation token.</param>
  129. /// <returns>Task{System.Boolean}.</returns>
  130. public override async Task<bool> FetchAsync(BaseItem item, bool force, BaseProviderInfo providerInfo, CancellationToken cancellationToken)
  131. {
  132. cancellationToken.ThrowIfCancellationRequested();
  133. var images = await _providerManager.GetAvailableRemoteImages(item, cancellationToken, ManualTvdbSeasonImageProvider.ProviderName).ConfigureAwait(false);
  134. const int backdropLimit = 1;
  135. await DownloadImages(item, images.ToList(), backdropLimit, cancellationToken).ConfigureAwait(false);
  136. SetLastRefreshed(item, DateTime.UtcNow, providerInfo);
  137. return true;
  138. }
  139. private async Task DownloadImages(BaseItem item, List<RemoteImageInfo> images, int backdropLimit, CancellationToken cancellationToken)
  140. {
  141. if (!item.HasImage(ImageType.Primary))
  142. {
  143. var image = images.FirstOrDefault(i => i.Type == ImageType.Primary);
  144. if (image != null)
  145. {
  146. await _providerManager.SaveImage(item, image.Url, TvdbSeriesProvider.Current.TvDbResourcePool, ImageType.Primary, null, cancellationToken)
  147. .ConfigureAwait(false);
  148. }
  149. }
  150. if (ConfigurationManager.Configuration.DownloadSeasonImages.Banner && !item.HasImage(ImageType.Banner))
  151. {
  152. var image = images.FirstOrDefault(i => i.Type == ImageType.Banner);
  153. if (image != null)
  154. {
  155. await _providerManager.SaveImage(item, image.Url, TvdbSeriesProvider.Current.TvDbResourcePool, ImageType.Banner, null, cancellationToken)
  156. .ConfigureAwait(false);
  157. }
  158. }
  159. if (ConfigurationManager.Configuration.DownloadSeasonImages.Backdrops && item.BackdropImagePaths.Count < backdropLimit)
  160. {
  161. foreach (var backdrop in images.Where(i => i.Type == ImageType.Backdrop))
  162. {
  163. var url = backdrop.Url;
  164. if (item.ContainsImageWithSourceUrl(url))
  165. {
  166. continue;
  167. }
  168. await _providerManager.SaveImage(item, url, TvdbSeriesProvider.Current.TvDbResourcePool, ImageType.Backdrop, null, cancellationToken).ConfigureAwait(false);
  169. if (item.BackdropImagePaths.Count >= backdropLimit) break;
  170. }
  171. }
  172. }
  173. }
  174. }