ChannelImageProvider.cs 3.5 KB

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