FanArtTVProvider.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. using MediaBrowser.Common.Net;
  2. using MediaBrowser.Controller.Configuration;
  3. using MediaBrowser.Controller.Entities;
  4. using MediaBrowser.Controller.Entities.TV;
  5. using MediaBrowser.Model.Entities;
  6. using MediaBrowser.Model.Logging;
  7. using MediaBrowser.Model.Net;
  8. using System;
  9. using System.IO;
  10. using System.Threading;
  11. using System.Threading.Tasks;
  12. using System.Xml;
  13. namespace MediaBrowser.Controller.Providers.TV
  14. {
  15. class FanArtTvProvider : FanartBaseProvider
  16. {
  17. protected string FanArtBaseUrl = "http://api.fanart.tv/webservice/series/{0}/{1}/xml/all/1/1";
  18. /// <summary>
  19. /// Gets the HTTP client.
  20. /// </summary>
  21. /// <value>The HTTP client.</value>
  22. protected IHttpClient HttpClient { get; private set; }
  23. private readonly IProviderManager _providerManager;
  24. public FanArtTvProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager)
  25. : base(logManager, configurationManager)
  26. {
  27. if (httpClient == null)
  28. {
  29. throw new ArgumentNullException("httpClient");
  30. }
  31. HttpClient = httpClient;
  32. _providerManager = providerManager;
  33. }
  34. public override bool Supports(BaseItem item)
  35. {
  36. return item is Series;
  37. }
  38. /// <summary>
  39. /// Needses the refresh internal.
  40. /// </summary>
  41. /// <param name="item">The item.</param>
  42. /// <param name="providerInfo">The provider info.</param>
  43. /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
  44. protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo)
  45. {
  46. if (string.IsNullOrEmpty(item.GetProviderId(MetadataProviders.Tvdb)))
  47. {
  48. return false;
  49. }
  50. if (!ConfigurationManager.Configuration.DownloadSeriesImages.Art &&
  51. !ConfigurationManager.Configuration.DownloadSeriesImages.Logo &&
  52. !ConfigurationManager.Configuration.DownloadSeriesImages.Thumb)
  53. {
  54. return false;
  55. }
  56. return base.NeedsRefreshInternal(item, providerInfo);
  57. }
  58. public override async Task<bool> FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken)
  59. {
  60. cancellationToken.ThrowIfCancellationRequested();
  61. var series = (Series)item;
  62. string language = ConfigurationManager.Configuration.PreferredMetadataLanguage.ToLower();
  63. string url = string.Format(FanArtBaseUrl, APIKey, series.GetProviderId(MetadataProviders.Tvdb));
  64. var doc = new XmlDocument();
  65. try
  66. {
  67. using (var xml = await HttpClient.Get(new HttpRequestOptions
  68. {
  69. Url = url,
  70. ResourcePool = FanArtResourcePool,
  71. CancellationToken = cancellationToken,
  72. EnableResponseCache = true
  73. }).ConfigureAwait(false))
  74. {
  75. doc.Load(xml);
  76. }
  77. }
  78. catch (HttpException)
  79. {
  80. }
  81. cancellationToken.ThrowIfCancellationRequested();
  82. if (doc.HasChildNodes)
  83. {
  84. string path;
  85. var hd = ConfigurationManager.Configuration.DownloadHDFanArt ? "hdtv" : "clear";
  86. if (ConfigurationManager.Configuration.DownloadSeriesImages.Logo && !series.ResolveArgs.ContainsMetaFileByName(LOGO_FILE))
  87. {
  88. var node = doc.SelectSingleNode("//fanart/series/" + hd + "logos/" + hd + "logo[@lang = \"" + language + "\"]/@url") ??
  89. doc.SelectSingleNode("//fanart/series/clearlogos/clearlogo[@lang = \"" + language + "\"]/@url") ??
  90. doc.SelectSingleNode("//fanart/series/" + hd + "logos/" + hd + "logo/@url") ??
  91. doc.SelectSingleNode("//fanart/series/clearlogos/clearlogo/@url");
  92. path = node != null ? node.Value : null;
  93. if (!string.IsNullOrEmpty(path))
  94. {
  95. Logger.Debug("FanArtProvider getting ClearLogo for " + series.Name);
  96. try
  97. {
  98. series.SetImage(ImageType.Logo, await _providerManager.DownloadAndSaveImage(series, path, LOGO_FILE, ConfigurationManager.Configuration.SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
  99. }
  100. catch (HttpException)
  101. {
  102. }
  103. catch (IOException)
  104. {
  105. }
  106. }
  107. }
  108. cancellationToken.ThrowIfCancellationRequested();
  109. hd = ConfigurationManager.Configuration.DownloadHDFanArt ? "hd" : "";
  110. if (ConfigurationManager.Configuration.DownloadSeriesImages.Art && !series.ResolveArgs.ContainsMetaFileByName(ART_FILE))
  111. {
  112. var node = doc.SelectSingleNode("//fanart/series/" + hd + "cleararts/" + hd + "clearart[@lang = \"" + language + "\"]/@url") ??
  113. doc.SelectSingleNode("//fanart/series/cleararts/clearart[@lang = \"" + language + "\"]/@url") ??
  114. doc.SelectSingleNode("//fanart/series/" + hd + "cleararts/" + hd + "clearart/@url") ??
  115. doc.SelectSingleNode("//fanart/series/cleararts/clearart/@url");
  116. path = node != null ? node.Value : null;
  117. if (!string.IsNullOrEmpty(path))
  118. {
  119. Logger.Debug("FanArtProvider getting ClearArt for " + series.Name);
  120. try
  121. {
  122. series.SetImage(ImageType.Art, await _providerManager.DownloadAndSaveImage(series, path, ART_FILE, ConfigurationManager.Configuration.SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
  123. }
  124. catch (HttpException)
  125. {
  126. }
  127. catch (IOException)
  128. {
  129. }
  130. }
  131. }
  132. cancellationToken.ThrowIfCancellationRequested();
  133. if (ConfigurationManager.Configuration.DownloadSeriesImages.Thumb && !series.ResolveArgs.ContainsMetaFileByName(THUMB_FILE))
  134. {
  135. var node = doc.SelectSingleNode("//fanart/series/tvthumbs/tvthumb[@lang = \"" + language + "\"]/@url") ??
  136. doc.SelectSingleNode("//fanart/series/tvthumbs/tvthumb/@url");
  137. path = node != null ? node.Value : null;
  138. if (!string.IsNullOrEmpty(path))
  139. {
  140. Logger.Debug("FanArtProvider getting ThumbArt for " + series.Name);
  141. try
  142. {
  143. series.SetImage(ImageType.Disc, await _providerManager.DownloadAndSaveImage(series, path, THUMB_FILE, ConfigurationManager.Configuration.SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
  144. }
  145. catch (HttpException)
  146. {
  147. }
  148. catch (IOException)
  149. {
  150. }
  151. }
  152. }
  153. }
  154. SetLastRefreshed(series, DateTime.UtcNow);
  155. return true;
  156. }
  157. }
  158. }