FanArtAlbumProvider.cs 7.0 KB

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