ChannelImageProvider.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using MediaBrowser.Controller.Configuration;
  2. using MediaBrowser.Controller.Entities;
  3. using MediaBrowser.Controller.Library;
  4. using MediaBrowser.Controller.LiveTv;
  5. using MediaBrowser.Controller.Providers;
  6. using MediaBrowser.Model.Entities;
  7. using MediaBrowser.Model.Logging;
  8. using MediaBrowser.Model.Net;
  9. using System;
  10. using System.Linq;
  11. using System.Net;
  12. using System.Threading;
  13. using System.Threading.Tasks;
  14. namespace MediaBrowser.Server.Implementations.LiveTv
  15. {
  16. public class ChannelImageProvider : BaseMetadataProvider
  17. {
  18. private readonly ILiveTvManager _liveTvManager;
  19. private readonly IProviderManager _providerManager;
  20. public ChannelImageProvider(ILogManager logManager, IServerConfigurationManager configurationManager, ILiveTvManager liveTvManager, IProviderManager providerManager)
  21. : base(logManager, configurationManager)
  22. {
  23. _liveTvManager = liveTvManager;
  24. _providerManager = providerManager;
  25. }
  26. public override bool Supports(BaseItem item)
  27. {
  28. return item is Channel;
  29. }
  30. protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo)
  31. {
  32. if (item.HasImage(ImageType.Primary))
  33. {
  34. return false;
  35. }
  36. return base.NeedsRefreshInternal(item, providerInfo);
  37. }
  38. public override async Task<bool> FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken)
  39. {
  40. if (item.HasImage(ImageType.Primary))
  41. {
  42. SetLastRefreshed(item, DateTime.UtcNow);
  43. return true;
  44. }
  45. try
  46. {
  47. await DownloadImage(item, cancellationToken).ConfigureAwait(false);
  48. }
  49. catch (HttpException ex)
  50. {
  51. // Don't fail the provider on a 404
  52. if (!ex.StatusCode.HasValue || ex.StatusCode.Value != HttpStatusCode.NotFound)
  53. {
  54. throw;
  55. }
  56. }
  57. SetLastRefreshed(item, DateTime.UtcNow);
  58. return true;
  59. }
  60. private async Task DownloadImage(BaseItem item, CancellationToken cancellationToken)
  61. {
  62. var channel = (Channel)item;
  63. var service = _liveTvManager.Services.FirstOrDefault(i => string.Equals(i.Name, channel.ServiceName, StringComparison.OrdinalIgnoreCase));
  64. if (service != null)
  65. {
  66. var response = await service.GetChannelImageAsync(channel.ChannelId, cancellationToken).ConfigureAwait(false);
  67. // Dummy up the original url
  68. var url = channel.ServiceName + channel.ChannelId;
  69. await _providerManager.SaveImage(channel, response.Content, response.ContentType, ImageType.Primary, null, url, cancellationToken).ConfigureAwait(false);
  70. }
  71. }
  72. public override MetadataProviderPriority Priority
  73. {
  74. get { return MetadataProviderPriority.Second; }
  75. }
  76. public override ItemUpdateType ItemUpdateType
  77. {
  78. get
  79. {
  80. return ItemUpdateType.ImageUpdate;
  81. }
  82. }
  83. }
  84. }